Real-Time Clock (RTC)

Hier ein Beispiel für eine Real-Time Clock. Verwendet wurde ein DS1307 von Dallas.

Benötigte zusätzliche Library:

Das Datenblatt und die Beschaltung des Dallas DS1307 ist hier beschrieben:

RTC_LCD.ino
/**
* 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 <LiquidCrystal.h>
#include <DS1307.h>
 
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);
}
f11/technik/arduino/programme/real-time-clock.txt · Zuletzt geändert: 2019/09/29 12:03 (Externe Bearbeitung)
CC Attribution-Noncommercial-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0