Überblick

Der Arduino kann nur ab dem Zeitpunkt des Einschaltens die Zeit messen. Das aktuelle Datum und die Zeit kann nur mit einem RTC-Modul (RealTimeClock) gesetzt und gelesen werden. Beim ersten Start muss das aktuelle Datum und die aktuelle Zeit manuell gesetzt werden, anschließend läuft die Zeit mit Hilfe der Batterie weiter.
Wenn das Modul nicht mit Strom versorgt ist, kann die Batterie (C1220) die Uhrzeit bis zum nächsten Einschalten puffern.
Der Schaltplan

Benötigte Bibliothek
Sketch ⇒ Bibliothek einbinden ⇒ Bibliotheken verwalten

Funktionen der Bibliothek Adafruit RTClib PCF8253
| Schlüsselwort | Anzeige/Parameter |
|---|---|
| begin() | Modul initialisieren |
| start() | Zeitmessung starten |
| adjust(DateTime(Jahr Monat, Tag, Stunde, Minute, Sekunde) | Beispiel: rtc.adjust(DateTime(2025, 4, 17, 10, 31, 30)); |
| now() | aktuelle Zeit holen |
| dayOfTheWeek() | Nummer des Wochentages 0 = Sonntag 1 = Montag . . . 6 = Samstag |
| day() | Tag |
| month() | Monat 1 = Januar 2 = Februar ... 12 = Dezember |
| year() | Jahr |
| hour() | Stunde |
| minute()) | Minute |
| second()) | Sekunde |
| Uhrzeit als Array definieren: char Zeit[] = "Uhrzeit: hh:mm:ss" print(aktuell.toString(Zeit)) | hh = Stunden mm = Minuten ss = Sekunden |
| Datum als Array definieren: char Datum[] = "DD.MM.YYYY" print(aktuell.toString(Datum)) | DD = Tag MM = Monat YYYY = 4-stelliges Jahr |
| lostpower() | untersucht, ob das Modul zwischenzeitlich nicht mit Strom versorgt wurde |
Die Zeit kann mit unterschiedlichen Methoden gesetzt werden, leider sind beide nicht genau:
- mit der Angabe von Datum und Uhrzeit:
rtc.adjust(DateTime(2025, 4, 17, 10, 30, 30));
Format: Jahr, Monat, Tag, Stunde, Minute, Sekunden
Man muss dann sofort nach der Festlegung das Programm kompilieren, die Uhr wird vermutlich etwas vor- oder nachgehen, je nachdem wie gut die Zeit zwischen der Änderung und dem Abschluss der Kompilierung geschätzt wurde.
Vor der nächsten Kompilierung muss die Zeile entfernt werden. - mit der Zeit zu der das Programm kompiliert wurde:
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
Solange die Zeit des Computers mit einem Zeitserver synchronisiert wurde, wird die Uhrzeit lediglich ein wenig nachgehen.
Anzeige im Seriellen Monitor

Das dazugehörige Programm:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
#include "RTClib.h" // Name des RTC-Moduls (rtc) RTC_PCF8523 rtc; void setup() { // RTC-Modul starten rtc.begin(); // QWIIC-Anschluss // rtc.begin(&Wire1); rtc.start(); Serial.begin(9600); rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); } void loop() { // rtc.now() -> aktuelle Zeit holen DateTime aktuell = rtc.now(); /* Datumsformat festlegen DD -> Tag mit führender 0 MM -> Monat mit führender 0 YYYY -> vollständige Angabe des Jahres */ char Datum[] = "DD.MM.YYYY "; // Datum in Zeichenkette (String) umwandeln und anzeigen Serial.print(aktuell.toString(Datum)); // Format der Zeitangabe festlegen char Zeit[] = "hh:mm:ss"; // Zeitangabe in Zeichenkette (String) umwandeln und anzeigen Serial.print("Uhrzeit: "); Serial.println(aktuell.toString(Zeit)); // 1 Sekunde Pause delay(1000); } |
Erweiterte Version mit Anzeige der Namen der Wochentage und der Monatsnamen:

Das dazugehörige Programm:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
#include "RTClib.h" // Name des RTC-Moduls RTC_PCF8523 rtc; void setup() { // RTC-Modul starten rtc.begin(); // QWIIC-Anschluss // rtc.begin(&Wire1); rtc.start(); rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); } void loop() { // aktuelle Zeit holen DateTime aktuell = rtc.now(); /* Wochentag anzeigen 0 = Sonntag 1 = Montag ... 6 = Samstag */ switch (aktuell.dayOfTheWeek()) { case 0: Serial.print("Sonntag"); break; case 1: Serial.print("Montag"); break; case 2: Serial.print("Dienstag"); break; case 3: Serial.print("Mittwoch"); break; case 4: Serial.print("Donnerstag"); break; case 5: Serial.print("Donnerstag"); break; case 6: Serial.print("Samstag"); break; } // Leerzeichen hinzufügen Serial.print(" "); // Datum anzeigen Serial.print(String(aktuell.day()) + "."); /* Monatsnamen anzeigen 1= Januar 2 = Februar ... 12 = Dezember */ Serial.print(" "); switch (aktuell.month()) { case 1: Serial.print("Januar"); break; case 2: Serial.print("Februar"); break; case 3: Serial.print("M\u00e4rz"); break; case 4: Serial.print("April"); break; case 5: Serial.print("Mai"); break; case 6: Serial.print("Juni"); break; case 7: Serial.print("Juli"); break; case 8: Serial.print("August"); break; case 9: Serial.print("September"); break; case 10: Serial.print("Oktober"); break; case 11: Serial.print("November"); break; case 12: Serial.print("Dezember"); break; } Serial.print(" "); Serial.print(String(aktuell.year()) + " "); // Zeitangabe in Zeichenkette (String) umwandeln und anzeigen char Zeit[] = "hh:mm:ss"; Serial.print("Uhrzeit: "); Serial.println(aktuell.toString(Zeit)); delay(1000); } |
Quelle
Letzte Aktualisierung: