/** * 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); }