Sketch zum Ermitteln der richtigen Temperatur aller Sensoren der DS1820 Baureihe. Ermitteln der Minusgrade wurde mit diesem Sketch noch nicht getestet. Bevor der 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
#include
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();
}
}