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.