Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
f11:technik:arduino:programme:1-wire-temperatursensor [2013/03/03 23:32] dd7dka |
f11:technik:arduino:programme:1-wire-temperatursensor [2019/09/29 12:03] (aktuell) |
||
---|---|---|---|
Zeile 10: | Zeile 10: | ||
<code c oneWire-Temperatursensor.ino> | <code c oneWire-Temperatursensor.ino> | ||
+ | /** | ||
+ | * 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, | ||
+ | sensor.search(addr); | ||
+ | sensor.reset_search(); | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | /* Sensor Adresse ausgeben (optional)*/ | ||
+ | Serial.print(" | ||
+ | for (i = 0; i < 8; i++) { | ||
+ | Serial.print(addr[i], | ||
+ | Serial.print(" | ||
+ | } | ||
+ | Serial.println(); | ||
+ | |||
+ | /* Sensordaten ausgeben */ | ||
+ | sensor.reset(); | ||
+ | sensor.select(addr); | ||
+ | sensor.write(0x44, | ||
+ | delay(1000); | ||
+ | sensor.reset(); | ||
+ | sensor.select(addr); | ||
+ | sensor.write(0xBE); | ||
+ | | ||
+ | sensor.read_bytes(data, | ||
+ | /* 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, | ||
+ | Serial.print(" | ||
+ | for (i = 0; i < 9; i++) { // 9 Datenbyte | ||
+ | lcd.print(data[i], | ||
+ | Serial.print(data[i], | ||
+ | Serial.print(" | ||
+ | } | ||
+ | Serial.println(); | ||
+ | // Ende Testausgabe | ||
+ | |||
+ | /* Umwandlung in Celsius Darstellung mit Nachkomma und Vorzeichen aus Beispielcode http:// | ||
+ | LowByte = data[0]; | ||
+ | HighByte = data[1]; | ||
+ | TReading = (HighByte << 8) + LowByte; | ||
+ | SignBit = TReading & 0x8000; | ||
+ | if (SignBit) { // negative | ||
+ | TReading = (TReading ^ 0xffff) + 1; // 2's comp | ||
+ | } | ||
+ | Tc_100 = (TReading*100/ | ||
+ | | ||
+ | Whole = Tc_100 / 100; // separate off the whole and fractional portions | ||
+ | Fract = Tc_100 % 100; | ||
+ | | ||
+ | /* sprintf() schreibt in Variable buf den String " | ||
+ | %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, | ||
+ | | ||
+ | lcd.setCursor(8, | ||
+ | lcd.print(buf); | ||
+ | Serial.println(buf); | ||
+ | } | ||
</ | </ |