Quantcast
Channel: Arduino – Fluuux – TechBlog
Viewing all articles
Browse latest Browse all 40

Temperatur von ds18X20 Sensoren ermitteln

$
0
0

Sketch zum ermitteln der richtigen Temperatur aller Sensoren der DS1820 Baureihe. Ermitteln der Minusgrade wurde mit diesem Sketch noch nicht getestet. Bevor das Sketch auf den Arduino geladen wird, geben Sie bitte den Digitalen Pin am Arduino an, an den Sie die Sensoren (OneWire) angeschlossen haben. Außerdem muss die Hardware-Adresse jedes Sensors angegeben werden. Über diese Adresse ist jeder Sensor eindeutig identifizierbar.

/*****************************************************************************
  Ermitteln der Temperatur von ds1820, ds1822, ds18S20 und ds18B20 Sensoren  *
  Autor: Enrico Sadlowski                                                    *
  Datum: 19.11.2012                                                          *
*****************************************************************************/
#include <OneWire.h>
#include <DallasTemperature.h>

OneWire  ds(7); //pin für ds1820

//DeviceAdressen der einzelnen ds1820 Temperatursensoren angeben.
DeviceAddress sensor1 = { 0x10, 0x16, 0x2E, 0x57, 0x02, 0x08, 0x00, 0x2F };
DeviceAddress sensor2 = { 0x10, 0x11, 0x40, 0xC0, 0x01, 0x08, 0x00, 0x9A };
DeviceAddress sensor3 = { 0x28, 0xE3, 0xAE, 0xBE, 0x03, 0x00, 0x00, 0x9F };

void setup(void)
{
  Serial.begin(9600);
}

void loop(void) 
{
  float temp1 = getTemperature(sensor1);
  float temp2 = getTemperature(sensor2);
  float temp3 = getTemperature(sensor3);

  Serial.println(temp1);
  Serial.println(temp2);
  Serial.println(temp3);
  Serial.println();

  delay(5000);
}

/******************************************************
  Temperatur eines Sensors in Grad Celsius ermitteln  *
******************************************************/ 
float getTemperature(byte* address)
{
  byte type_s;
  byte data[12];
  float celsius;

  writeTimeToScratchpad(address);
  readTimeFromScratchpad(address,data);

  switch (address[0]) 
  {
    case 0x10: // DS18S20 oder alter DS1820
      type_s = 1;
      break;
    case 0x28: // DS18B20
      type_s = 0;
      break;
    case 0x22: // DS1822
      type_s = 0;
      break;
  }

  unsigned int raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3;                       // 9 bit resolution default
    if (data[7] == 0x10) 
    {
      // count remain gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw << 3;      // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
  }
  celsius = (float)raw / 16.0;
  return celsius;
}

/**************************************************************
  Hilfsfunktionen zum ermitteln der Temperatur eines Sensors  *
**************************************************************/
void writeTimeToScratchpad(byte* address)
{
  ds.reset();
  ds.select(address);
  ds.write(0x44,1);
  delay(1000);
}

void readTimeFromScratchpad(byte* address, byte* data)
{
  ds.reset();
  ds.select(address);
  ds.write(0xBE);
  for (byte i=0;i<9;i++)
  {
    data[i] = ds.read();
  }
}

The post Temperatur von ds18X20 Sensoren ermitteln appeared first on Fluuux - TechBlog.


Viewing all articles
Browse latest Browse all 40

Trending Articles