/** * Dieses Programm liest einen DS1820 1-Wire Temperatursensor aus. * In diesem Fall ist nur ein Sensor angeschlossen. Für mehreren Sensoren am 1-Wire Bus * muss der Quelltext modifiziert werden. */ #include #include LiquidCrystal lcd(12, 8, 7, 4, 2, 1); // init LCD, Ports an eigene Verdrahtung anpassen! OneWire sensor(10); // init OneWire Sensor an Port 10 /* Beispiel für eine Adresse eines DS1820. Achtung: Jeder Baustein hat eine eigene 8 Byte Adresse! Wenn man die Adresse weis und nur einen Baustein anspricht kann diese Adresse auch vorgegeben werden. */ //byte addr[8] = {0x10, 0x59, 0x87, 0x77, 0x2, 0x8, 0x0, 0xCE}; // 8 byte array für die Adressen byte addr[8]; // 8 byte array für die Adressen byte data[12]; // 12 byte array für Daten. Der DS1820 liefert aber nur 9. byte i; int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract; char buf[20]; void setup() { Serial.begin(9600); lcd.begin(16, 2); sensor.search(addr); // suche ersten 1-Wire Sensor und schreibe gefundene Adresse in addr sensor.reset_search(); // reset search, nächster search() Aufruf würde wieder bei erstem Sensor starten } void loop() { /* Sensor Adresse ausgeben (optional)*/ Serial.print("Address: "); for (i = 0; i < 8; i++) { Serial.print(addr[i], HEX); Serial.print(" "); } Serial.println(); /* Sensordaten ausgeben */ sensor.reset(); // Reset des 1-Wire Bus. Vor jeder Kommunikation mit einem Sensor nötig sensor.select(addr); // Sensor mit Adresse ansprechen sensor.write(0x44,1); // Starte Kommunikation bei Spannungsversorgung über Vdd/GND Pins (nicht per 1-Wire Bus siehe Datenblatt) delay(1000); sensor.reset(); sensor.select(addr); sensor.write(0xBE); // schreibt Sensordaten in Scratchpad (Speicherbereich für Sensordaten) sensor.read_bytes(data, 9); // einlesen von 9 Datenbytes. Der DS1820 liefert nur 9. /* einlesen der Daten optional auch so möglich */ //for (i = 0; i < 9; i++) { // 9 Datenbyte //data[i] = sensor.read(); //} /* Testausgabe der Rohdaten auf 1. Zeile des LCD und Seriell (optional) */ lcd.setCursor(0,0); Serial.print("Data: "); for (i = 0; i < 9; i++) { // 9 Datenbyte lcd.print(data[i], HEX); Serial.print(data[i], HEX); Serial.print(" "); } Serial.println(); // Ende Testausgabe /* Umwandlung in Celsius Darstellung mit Nachkomma und Vorzeichen aus Beispielcode http://playground.arduino.cc/Learning/OneWire */ LowByte = data[0]; HighByte = data[1]; TReading = (HighByte << 8) + LowByte; SignBit = TReading & 0x8000; // test most sig bit if (SignBit) { // negative TReading = (TReading ^ 0xffff) + 1; // 2's comp } Tc_100 = (TReading*100/2); Whole = Tc_100 / 100; // separate off the whole and fractional portions Fract = Tc_100 % 100; /* sprintf() schreibt in Variable buf den String "%c%d.%d\337C " wobei: %c (character) durch Vorzeichen + oder - ersetzt wird %d mit Temperatur aus Variable Whole %d mit Temperatur (Nachkommastellen) aus Variable Fract \337 ist ASCII Code für Celsius-Kringel ° C für Celsius */ sprintf(buf, "%c%d.%d\337C ", SignBit ? '-' : '+', Whole, Fract < 10 ? 0 : Fract); lcd.setCursor(8,1); lcd.print(buf); Serial.println(buf); }