
Ziel des Projekts
Auf dem 4-zeiligen LCD soll der Wochentag, das Datum, die aktuelle Uhrzeit und die Temperatur angezeigt werden. Zusätzlich soll die Alarmfunktion genutzt werden.

Benötigte Bauteile
- ⇒4-zeiliges LCD mit I²C-Schnittstelle
- ⇒RTC-Modul DS3231
- Leitungsdrähte

Der Schaltplan
(Fahre mit der Maus über das Bild, um die Bezeichnungen der Bauteile zu sehen)
Benötigte Bibliotheken


Zeit anzeigen
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 |
void setup() { rtc.begin(); // Zeitpunkt des Kompilierens als aktuelle Zeit setzen rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // LCD starten lcd.begin(); // Cursor "verstecken" lcd.setCursor(false); } |
Der loop-Teil.
|
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 |
void loop() { // aktuelle Zeit holen DateTime aktuell = rtc.now(); lcd.setCursor(0, 0); /* Wochentag anzeigen 0 = Sonntag 1 = Montag ... 6 = Samstag Donnerstag längster Name: andere Tage mit Leerzeichen auffüllen */ 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); char Datum[] = "Datum: DD.MM.YYYY"; lcd.print(aktuell.toString(Datum)); lcd.setCursor(0, 2); char Zeit[] = "Uhrzeit: hh:mm:ss"; lcd.print(aktuell.toString(Zeit)); // gemessene Temperatur in String umwandeln // int -> nur ganzzahlige Werte String Temperatur = String(int(rtc.getTemperature())); lcd.setCursor(0, 3); // Sonderzeichen für ° = \337 // Temperatur anzeigen lcd.print("Temperatur: " + Temperatur + "\337C "); } |
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 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 |
#include "RTClib.h" #include "LCDIC2.h" // Name des RTC-Moduls RTC_DS3231 rtc; // 4-zeiliges LCD LCDIC2 lcd(0x27, 20, 4); void setup() { rtc.begin(); // Zeitpunkt des Kompilierens als aktuelle Zeit setzen rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // LCD starten lcd.begin(); // Cursor "verstecken" lcd.setCursor(false); } void loop() { // aktuelle Zeit holen DateTime aktuell = rtc.now(); lcd.setCursor(0, 0); /* Wochentag anzeigen 0 = Sonntag 1 = Montag ... 6 = Samstag Donnerstag längster Name: andere Tage mit Leerzeichen auffüllen */ 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.setCursor(14, 1); // 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 // int -> nur ganzzahlige Werte String Temperatur = String(int(rtc.getTemperature())); lcd.setCursor(0, 3); // Sonderzeichen für ° = \337 // Temperatur anzeigen lcd.print("Temperatur: " + Temperatur + "\337C "); } |
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 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 |
#include "RTClib.h" #include "LCDIC2.h" // Name des RTC-Moduls RTC_DS3231 rtc; // 4-zeiliges LCD LCDIC2 lcd(0x27, 20, 4); void setup() { rtc.begin(); // Zeitpunkt des Kompilierens als aktuelle Zeit setzen rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // LCD starten lcd.begin(); // Cursor "verstecken" lcd.setCursor(false); } void loop() { // aktuelle Zeit holen DateTime aktuell = rtc.now(); lcd.setCursor(0, 0); /* Wochentag anzeigen 0 = Sonntag 1 = Montag ... 6 = Samstag Donnerstag längster Name: andere Tage mit Leerzeichen auffüllen */ 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.setCursor(14, 1); // Jahr anzeigen lcd.print(String(aktuell.year())); lcd.setCursor(0, 2); lcd.print("Uhrzeit: "); // wenn Stunden < 10 -> führende 0 setzen if (aktuell.hour() < 10) lcd.print("0"); lcd.print(String(aktuell.hour())); lcd.print(':'); // wenn Minuten < 10 -> führende 0 setzen if (aktuell.minute() < 10) lcd.print("0"); lcd.print(String(aktuell.minute())); lcd.print(':'); // wenn Sekunden < 10 -> führende 0 setzen if (aktuell.second() < 10) lcd.print("0"); lcd.print(String(aktuell.second())); // gemessene Temperatur in String umwandeln // int -> nur ganzzahlige Werte String Temperatur = String(int(rtc.getTemperature())); lcd.setCursor(0, 3); // Sonderzeichen für ° = \337 // Temperatur anzeigen lcd.print("Temperatur: " + Temperatur + "\337C "); } |
Alarmfunktion nutzen
Alarm jeweils zur vollen Minute
|
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 |
#include "RTClib.h" #include "LCDIC2.h" // 4-zeiliges LCD LCDIC2 lcd(0x27, 20, 4); // Name des RTC-Moduls RTC_DS3231 rtc; // Interrupt-Pin -> Alarm auslösen #define AlarmInterruptPin 2 // Alarm beim Start auf false setzen volatile bool Alarm = false; void setup() { Serial.begin(9600); // auf serielle Verbindung warten while (!Serial) {;} delay(1000); rtc.begin(); rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // 32K-Pin am DS3231 deaktivieren rtc.disable32K(); // Pin 2 als Interrupt-Pin pinMode(AlarmInterruptPin, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(AlarmInterruptPin), AlarmStarten, FALLING); // Alarm1 löschen, Alarm2 deaktivieren rtc.clearAlarm(1); rtc.clearAlarm(2); rtc.disableAlarm(2); rtc.writeSqwPinMode(DS3231_OFF); // LCD starten lcd.begin(); // Cursor "verstecken" lcd.setCursor(false); // aktuelle Zeit lesen DateTime aktuell = rtc.now(); // Alarm1 jede voll Minute setzen DateTime ZeitAlarm1 (aktuell.year(), aktuell.month(), aktuell.dayOfTheWeek(), aktuell.hour(), aktuell.minute(), 0); // Alarme setzen rtc.setAlarm1(ZeitAlarm1, DS3231_A1_Second); } void loop() { // aktuelle Zeit lesen DateTime aktuell = rtc.now(); // Zeit anzeigen lcd.setCursor(0, 2); char Zeit[] = "Uhrzeit: hh:mm:ss"; lcd.print(aktuell.toString(Zeit)); Serial.println(aktuell.toString(Zeit)); if (Alarm) { if(rtc.alarmFired(1)) { Serial.println("Alarm 1 ausgelöst"); lcd.setCursor(0, 0); lcd.print("Alarm 1 ausgel\357st"); rtc.clearAlarm(1); lcd.setCursor(0, 0); delay(2000); lcd.print(" "); } } delay(1000); } void AlarmStarten() { Alarm = true; } |
Zwei Alarme nutzen
Alarm1 wird jede Minute jeweils nach 30 Sekunden ausgelöst, Alarm2 startet zu jeder vollen Minute.
|
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 |
#include "RTClib.h" #include "LCDIC2.h" // 4-zeiliges LCD LCDIC2 lcd(0x27, 20, 4); // Name des RTC-Moduls RTC_DS3231 rtc; // Interrupt-Pin -> Alarm auslösen #define AlarmInterruptPin 2 // Alarm beim Start auf false setzen volatile bool Alarm = false; void setup() { Serial.begin(9600); // auf serielle Verbindung warten while (!Serial) {;} delay(1000); rtc.begin(); rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // 32K-Pin am DS3231 deaktivieren rtc.disable32K(); // Pin 2 als Interrupt-Pin pinMode(AlarmInterruptPin, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(AlarmInterruptPin), AlarmStarten, FALLING); // Alarm1 löschen, Alarm2 deaktivieren rtc.clearAlarm(1); rtc.clearAlarm(2); rtc.disableAlarm(2); rtc.writeSqwPinMode(DS3231_OFF); // LCD starten lcd.begin(); // Cursor "verstecken" lcd.setCursor(false); // aktuelle Zeit lesen DateTime aktuell = rtc.now(); // Alarm1 jeweils nach 30 Sekunden bei jeder Minute setzen DateTime ZeitAlarm1 (aktuell.year(), aktuell.month(), aktuell.dayOfTheWeek(), aktuell.hour(), aktuell.minute(), 30); // Alarm2 jeweils zur vollen Minute (Sekunde = 0) DateTime ZeitAlarm2 (aktuell.year(), aktuell.month(), aktuell.dayOfTheWeek(), aktuell.hour(), aktuell.minute(), 0); // Alarme setzen rtc.setAlarm1(ZeitAlarm1, DS3231_A1_Second); rtc.setAlarm2(ZeitAlarm2, DS3231_A2_PerMinute); } void loop() { // aktuelle Zeit lesen DateTime aktuell = rtc.now(); // Zeit anzeigen lcd.setCursor(0, 2); char Zeit[] = "Uhrzeit: hh:mm:ss"; lcd.print(aktuell.toString(Zeit)); Serial.println(aktuell.toString(Zeit)); if (Alarm) { if(rtc.alarmFired(1)) { Serial.println("Alarm 1 ausgelöst"); lcd.setCursor(0, 0); lcd.print("Alarm 1 ausgel\357st"); rtc.clearAlarm(1); delay(2000); lcd.setCursor(0, 0); lcd.print(" "); } if(rtc.alarmFired(2)) { Serial.println("Alarm 2 ausgelöst"); lcd.setCursor(0, 0); lcd.print("Alarm 2 ausgel\357st"); rtc.clearAlarm(2); delay(2000); lcd.setCursor(0, 0); lcd.print(" "); } } delay(1000); } void AlarmStarten() { Alarm = true; } |
Ähnliche Projekte
- Analoge Uhr mit TFT 240×240 Pixeln und RTC-Modul
- 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
- Analoge Uhr mit TFT 240×240 Pixeln und WiFi
- Uhrzeit auf LED-Matrix anzeigen
- Zeit mit time.h auf einem TFT anzeigen
- Wecker mit RTC-Modul DS3231
- Zeit im Seriellen Monitor mit ESP-Mikrocontroller anzeigen
Letzte Aktualisierung:






