

Der Arduino kann nur ab dem Zeitpunkt des Einschaltens mit ⇒millis() die Zeit messen. Das aktuelle Datum und die Uhrzeit kann nur mit einem RTC-Modul gesetzt und gelesen werden.
Hier soll das Modul DS3231 zum Einsatz kommen. Zusätzlich zur Zeit misst das Modul auch die Temperatur.
Auf dem 4‑zeiligen LCD soll der Wochentag, das Datum, die aktuelle Uhrzeit und die Temperatur angezeigt werden.
So sieht es auf dem LCD aus:

⇒Zeit im Seriellen Monitor anzeigen
⇒Zeit im Seriellen Monitor mit Wochentag und Monatsnamen anzeigen
Schließe das LCD an:



Normalerweise wäre eine komplexe Verkabelung zum Betrieb eines LCDs nötig. Der ⇒I²C-Bus regelt über einen eigenen Mikroprozessor die Kommunikation der Datenleitungen untereinander. Es werden deshalb nur vier Anschlüsse benötigt.

Die Helligkeit kann mit einem Potentiometer auf der Rückseite des LCDs eingestellt werden.
Benötigte Bauteile:
- 4‑zeiliges LCD mit I²C-Schnittstelle
- RTC-Modul DS3231
- Leitungsdrähte
Baue die Schaltung auf.
(Fahre mit der Maus über das Bild, um die Bezeichnungen der Bauteile zu sehen)
Benötigte Bibliotheken:


Funktionen der Bibliothek Adafruit RTClib
| Schlüsselwort | Anzeige/Parameter |
|---|---|
| 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 |
| getTemperature() | Temperatur ermitteln |
| 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.
Definiere die Variablen und binde die benötigten Bibliotheken ein:
1 2 3 4 5 6 7 8 | #include “RTClib.h” #include “LCDIC2.h” // Name des RTC-Moduls RTC_DS3231 rtc; // 4‑zeiliges LCD LCDIC2 lcd(0x27, 20, 4); |
Der setup-Teil:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | void setup() { // RTC-Modul starten rtc.begin(); /* wenn Datum und Zeit nicht korrekt -> Datum/Zeit setzen Jahr, Monat, Tag, Stunde, Minute, Sekunde rtc.adjust(DateTime(2023, 8, 4, 10, 30, 30)); nach erfolgreichem Hochladen Kommentarzeichen hinzufügen */ // LCD starten lcd.begin(); // Cursor “verstecken” lcd.setCursor(false); } |
Der loop-Teil. Beachte die Kommentare.
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 | void loop() { // aktuelle Zeit holen DateTime aktuell = rtc.now(); lcd.setCursor(0, 0); /* Wochentag anzeigen 0 = Sonntag 1 = Montag … 6 = Samstag */ switch (aktuell.dayOfTheWeek()) { case 0: lcd.print(“Sonntag”); break; case 1: lcd.print(“Montag”); break; case 2: lcd.print(“Dienstag”); break; case 3: lcd.print(“Mittwoch”); break; case 4: lcd.print(“Donnerstag”); break; case 5: lcd.print(“Freitag”); break; case 6: lcd.print(“Samstag”); break; } // Datum anzeigen lcd.setCursor(0, 1); char Datum[] = “Datum: DD.MM.YYYY”; lcd.print(aktuell.toString(Datum)); // Zeit anzeigen lcd.setCursor(0, 2); char Zeit[] = “Uhrzeit hh:mm:ss”; lcd.print(aktuell.toString(Zeit)); // gemessene Temperatur in String umwandeln String Temperatur = String(rtc.getTemperature()); // angelsächsische Schreibweise der Temperatur // . durch , ersetzen Temperatur.replace(“.”, “,”); lcd.setCursor(0, 3); // Sonderzeichen für ° = \337 // Temperatur anzeigen lcd.print(“Temperatur: ” + Temperatur + “\337C”); delay(1000); } |
Du kannst auch die Monatsnamen anzeigen lassen:
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 | void loop() { // aktuelle Zeit holen DateTime aktuell = rtc.now(); lcd.setCursor(0, 0); /* Wochentag anzeigen 0 = Sonntag 1 = Montag … 6 = Samstag */ switch (aktuell.dayOfTheWeek()) { case 0: lcd.print(“Sonntag”); break; case 1: lcd.print(“Montag”); break; case 2: lcd.print(“Dienstag”); break; case 3: lcd.print(“Mittwoch”); break; case 4: lcd.print(“Donnerstag”); break; case 5: lcd.print(“Freitag”); break; case 6: lcd.print(“Samstag”); break; } // Leerzeichen hinzufügen lcd.print(“ ”); // Datum anzeigen -> Tag lcd.setCursor(0, 1); lcd.print(String(aktuell.day()) + “.”); /* Monatsnamen anzeigen 1 = Januar 2 = Februar … 12 = Dezember */ lcd.print(“ ”); switch (aktuell.month()) { case 1: lcd.print(“Januar”); break; case 2: lcd.print(“Februar”); break; case 3: lcd.print(“M\341rz”); break; case 4: lcd.print(“April”); break; case 5: lcd.print(“Mai”); break; case 6: lcd.print(“Juni”); break; case 7: lcd.print(“Juli”); break; case 8: lcd.print(“August”); break; case 9: lcd.print(“September”); break; case 10: lcd.print(“Oktober”); break; case 11: lcd.print(“November”); break; case 12: lcd.print(“Dezember”); break; } lcd.print(“ ”); // Jahr anzeigen lcd.print(String(aktuell.year())); // Zeit anzeigen lcd.setCursor(0, 2); char Zeit[] = “Uhrzeit: hh:mm:ss”; lcd.print(aktuell.toString(Zeit)); // gemessene Temperatur in String umwandeln String Temperatur = String(rtc.getTemperature()); // angelsächsische Schreibweise der Temperatur // . durch , ersetzen Temperatur.replace(“.”, “,”); lcd.setCursor(0, 3); // Sonderzeichen für ° = \337 // Temperatur anzeigen lcd.print(“Temperatur: ” + Temperatur + “\337C”); delay(1000); } |
Eine weitere Alternative: Zeit mit den Funktionen hour(), minute() und second() anzeigen:
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 | void loop() { // aktuelle Zeit lesen DateTime aktuell = rtc.now(); // Wochentag, Datum und Zeit anzeigen lcd.setCursor(0, 0); /* Wochentag anzeigen 0 = Sonntag 1 = Montag … 6 = Samstag */ switch (aktuell.dayOfTheWeek()) { case 0: lcd.print(“Sonntag”); break; case 1: lcd.print(“Montag”); break; case 2: lcd.print(“Dienstag”); break; case 3: lcd.print(“Mittwoch”); break; case 4: lcd.print(“Donnerstag”); break; case 5: lcd.print(“Freitag”); break; case 6: lcd.print(“Samstag”); break; } lcd.setCursor(0, 1); lcd.print(aktuell.day()); lcd.print(“.”); // Monatsnamen anzeigen lcd.print(“ ”); switch (aktuell.month()) { case 1: lcd.print(“Januar”); break; case 2: lcd.print(“Februar”); break; case 3: lcd.print(“M\341rz”); break; case 4: lcd.print(“April”); break; case 5: lcd.print(“Mai”); break; case 6: lcd.print(“Juni”); break; case 7: lcd.print(“Juli”); break; case 8: lcd.print(“August”); break; case 9: lcd.print(“September”); break; case 10: lcd.print(“Oktober”); break; case 11: lcd.print(“November”); break; case 12: lcd.print(“Dezember”); break; } lcd.print(“ ”); lcd.print(aktuell.year()); lcd.setCursor(0, 2); // wenn Stunden < 10 -> führende 0 setzen if (aktuell.hour() < 10) lcd.print(“0”); lcd.print(aktuell.hour()); lcd.print(‘:’); // wenn Minuten < 10 -> führende 0 setzen if (aktuell.minute() < 10) lcd.print(“0”); lcd.print(aktuell.minute()); lcd.print(‘:’); // wenn Sekunden < 10 -> führende 0 setzen if (aktuell.second() < 10) lcd.print(“0”); lcd.print(aktuell.second()); // gemessene Temperatur in String umwandeln String Temperatur = String(rtc.getTemperature()); // angelsächsische Schreibweise der Temperatur // . durch , ersetzen Temperatur.replace(“.”, “,”); lcd.setCursor(0, 3); // Sonderzeichen für ° = \337 // Temperatur anzeigen lcd.print(“Temperatur: ” + Temperatur + “\337C”); } |
Verwandte Anleitungen:
- Datum und Zeit mit ESP und time.h anzeigen
- Datum und Zeit mit dem NTP-Protokoll anzeigen
- DHT — Messdaten und Zeit auf TFT anzeigen
- Stoppuhr
- Uhr mit TFT 240x240 Pixeln
- Zeit mit time.h auf einem TFT anzeigen
- Wecker mit einem RTC-Modul
- Zeit im Seriellen Monitor mit ESP-Mikrocontroller anzeigen
- Uhrzeit und Temperatur auf einem 4‑stelligen 7‑Segment-Modul anzeigen
- Zeit mit time.h auf einer 4‑stelligen 7‑Segment-Anzeige darstellen
Letzte Aktualisierung:







