====== Temperatur-Logger ====== Dieses Programm liest die Temperatur aus einem DS1820 Temperatursensor und gibt den Wert zusammen mit einem Zeitstempel eines DS1307 auf einem LCD und der seriellen Konsole aus. Dieses Programm ist eine Kombination der beiden Beispielprogramme * [[f11:technik:arduino:programme:1-wire-temperatursensor|1-Wire Temperatursensor]] * [[f11:technik:arduino:programme:real-time-clock|Real-Time Clock (RTC)]] /** * Dieses Programm liest die Temperatur aus einem DS1820 Temperatursensor und gibt den Wert * zusammen mit einem Zeitstempel eines DS1307 auf einem LCD und der seriellen Konsole aus. * Kombination der beiden Beispielprogramme * - oneWire-Temperatursensor.ino * - RTC_LCD.ino * Für Erläuterungen bitte die ausführlichen Kommentare in den beiden Programmen lesen. */ #include #include #include LiquidCrystal lcd(12, 8, 7, 4, 2, 1); DS1307 rtc(A5, A4); OneWire sensor(10); unsigned long prev_time; String line1; String line2; byte addr[8]; byte data[12]; byte i; int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract; char buf[20]; void setup() { lcd.begin(16, 2); Serial.begin(9600); rtc.halt(false); sensor.search(addr); sensor.reset_search(); } void loop() { if (Serial.available() > 0) { set_RTC(); } if ((millis() - prev_time) > 999) { display_RTC(); readTemp(); prev_time = millis(); } } void readTemp() { sensor.reset(); sensor.select(addr); sensor.write(0x44,1); //delay(1000); sensor.reset(); sensor.select(addr); sensor.write(0xBE); sensor.read_bytes(data, 9); 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(buf, "%c%d.%d\337 ", SignBit ? '-' : '+', Whole, Fract < 10 ? 0 : Fract); lcd.setCursor(9,1); lcd.print(buf); Serial.println(buf); } /* Funktionen set_RTC() und display_RTC() von http://www.internet-for-all.de/arduino/bausteine/171-uhrenmodul-ds1307-mit-lcd-anzeige.html */ void set_RTC(){ // Read received characters, build values and set RTC: int year, month, day, wday; int hour, minute, second; rtc.halt(true); delay(10); wday= (Serial.read() - 48); rtc.setDOW(wday); day = (Serial.read() - 48) *10 + (Serial.read() - 48); month = (Serial.read() - 48) *10 + (Serial.read() - 48); year = (Serial.read() - 48) *10 + (Serial.read() - 48) + 2000; rtc.setDate(day, month, year); hour = (Serial.read() - 48) *10 + (Serial.read() - 48); minute = (Serial.read() - 48) *10 + (Serial.read() - 48); second = (Serial.read() - 48) * 10 + (Serial.read() - 48); rtc.setTime(hour, minute, second); rtc.halt(false); } void display_RTC(){ line1 = rtc.getDOWStr(FORMAT_SHORT); line1+=" "; line1+=rtc.getDateStr(); line2 =String(rtc.getTimeStr()); Serial.print(line1); Serial.print(" "); Serial.println(line2); lcd.setCursor(0,0); // move to the beginning of the first line lcd.print(line1); lcd.setCursor(0,1); // move to the beginning of the second line lcd.print(line2); }