Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
|
f11:technik:arduino:programme:1-wire-temperatursensor [2013/03/03 23:12] dd7dka angelegt |
f11:technik:arduino:programme:1-wire-temperatursensor [2019/09/29 12:03] (aktuell) |
||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| ====== 1-Wire Temperatursensor ====== | ====== 1-Wire Temperatursensor ====== | ||
| - | Hier ein Beispiel wie man einen 1-Wire Temperatursensor auslesen kann. Verwendet | + | Hier ein Beispiel wie man einen 1-Wire Temperatursensor auslesen kann. Verwendet |
| - | Das Datenblatt und die Beschaltung des Dallas DS1820 ist hier beschrieben: [[f11: | + | Benötigte zusätzliche Library: |
| + | * 1-Wire Library von PJRC [[f11: | ||
| - | ===== 1-Wire | + | Das Datenblatt und die Beschaltung des Dallas DS1820 ist hier beschrieben: |
| + | * [[f11: | ||
| - | | + | <code c oneWire-Temperatursensor.ino> |
| + | /** | ||
| + | * | ||
| + | * In diesem Fall ist nur ein Sensor angeschlossen. Für mehreren Sensoren am 1-Wire Bus | ||
| + | * muss der Quelltext modifiziert werden. | ||
| + | */ | ||
| - | ===== Beispielprogramm ===== | + | #include < |
| + | #include < | ||
| - | <code c oneWire-Temperatursensor.ino> | + | 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%d.%d\337C | ||
| + | %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); | ||
| + | } | ||
| </ | </ | ||
