/** * Dieses Programm setzt und liest die Uhrzeit einer RTC (Real-Time Clock). * In diesem Beispiel wurde der RTC IC Dallas DS1307 verwendet. Dieser * IC ist per I²C Bus angebunden. Der I²C Bus benötigt zwei Signalleitungen: * SCL: Takt * SDA: Datenleitung */ /* ToDo: - set_RTC() verbessern (Prüfung des Strings) - Umschaltung Sommer / Winterzeit - UTC offset - Alarm Trigger */ #include #include LiquidCrystal lcd(12, 8, 7, 4, 2, 1); DS1307 rtc(A5, A4); // init RTC an SDA (IC Pin 5) an Port A5 und SCL (IC Pin 4) an Port A4 unsigned long prev_time; String line1; String line2; void setup() { lcd.begin(16, 2); Serial.begin(9600); rtc.halt(false); // start RTC. Nicht unbedingt nöig da RTC normalerweise bereits läuft. } void loop() { if (Serial.available() > 0) { // Prüfung ob Daten am Seriellen Port anliegen (Nutzereingaben) set_RTC(); // setze RTC auf neue Zeit. Format: nddmmyyhhmmss // n = Nummer des Wochentag von 1 bis 7 (Montag = 1; Freitag = 5) // dd = Tag des Monats z.B. 23 // mm = Montasnummer z.B. 03 für märz // yy = Jahr z.B. 13 für 2013 // hh:mm:ss = Stunde:Minute:Sekunde z.B. 12:14:05 } if ((millis() - prev_time) > 999) { // Refresh der Uhrzeit alle Sekunde. // Ungenau, bei ungünstigem Timing kann auf der Anzeige eine Sekunde übersprungen werden. display_RTC(); // zeigt die Uhrzeit auf dem LCD Display und serieller Konsole. prev_time = millis(); } } /* 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); }