![](https://hartmut-waller.info/arduinoblog/wp-content/uploads/2024/04/Arduinos_ohne_WiFi.png)
Die Weckzeit wird zusammen mit Wochentag, Datum und Uhrzeit auf dem LCD-Display angezeigt.
Der linke Taster soll die Stunden, der rechte Taster soll die Minuten einstellen.
Ein Tasterdruck → eine Stunde/eine Minute vorwärts
So sieht es aus:
Schließe das LCD an:
![](https://hartmut-waller.info/arduinoblog/wp-content/uploads/2020/08/LCD_Pinbelegung.jpg)
![](https://hartmut-waller.info/arduinoblog/wp-content/uploads/2022/05/info.png)
➨LCD
![](https://hartmut-waller.info/arduinoblog/wp-content/uploads/2022/05/info.png)
Normalerweise wäre eine komplexe Verkabelung zum Betrieb eines LCDs nötig. Der ➨I2C-Bus regelt über einen eigenen Mikroprozessor die Kommunikation der Datenleitungen untereinander. Es werden deshalb nur vier Anschlüsse benötigt.
![](https://hartmut-waller.info/arduinoblog/wp-content/uploads/2020/08/LCD_Helligkeit_verstellen.png)
Die Helligkeit kann mit einem Potentiometer auf der Rückseite des LCDs eingestellt werden.
Benötigte Bauteile:
- 2 Taster
- LCD 1602
- RTC-Modul DS3231
- Lautsprecher
- Leitungsdrähte
Baue die Schaltung auf.
(Fahre mit der Maus über das Bild, um die Bezeichnungen der Bauteile zu sehen)
Benötigte Bibliotheken:
![]() |
![]() |
Binde die Bibliotheken RTClib und LiquidCrystal_I2C ein und definiere die Variablen.
# include "RTClib.h"
# include "LiquidCrystal_I2C.h"
// Name des RTC-Moduls
RTC_DS3231 rtc;
LiquidCrystal_I2C lcd(0x27, 20, 4);
int Lautsprecher = 3;
int TasterLinks = 7;
int TasterRechts = 8;
int TasterLesenLinks;
int TasterLesenRechts;
// Beginn der Weckzeit
int StundeWeckzeit = 6;
int MinuteWeckzeit = 0;
// Dauer des Signal
int DauerWecksignal = 3;
// Zeit messen für Ticken der Uhr
long Startzeit;
long ZeitJetzt;
Der setup-Teil. Beachte die Kommentare.
void setup()
{
pinMode(TasterLinks, INPUT_PULLUP);
pinMode(TasterRechts, INPUT_PULLUP);
Serial.begin(9600);
// auf serielle Verbindung warten
while (!Serial) {;}
rtc.begin();
/*
wenn Datum und Zeit nicht korrekt -> Datum/Zeit setzen
Jahr, Monat, Tag, Stunde, Minute, Sekunde
keine führende 0 setzen
rtc.adjust(DateTime(2023, 6, 16, 9, 0, 30));
*/
// rtc.adjust(DateTime(2023, 6, 16, 9, 0, 30));
// LCD initialisieren
lcd.init();
lcd.backlight();
Serial.println("Bitte die Weckzeit eingeben:");
Serial.println("Taster links -> Stunde +/Taster rechts -> Minute +");
Startzeit = millis();
}
Verwende diese Schlüsselwörter für die Ausgabe auf dem LCD:
Funktionen der Bibliothek RTClib Adafruit
Schlüsselwort | Anzeige/Parameter |
---|---|
adjust(DateTime(Jahr Monat, Tag, Stunde, Minute, Sekunde) | Beispiel: rtc.adjust(DateTime(2022, 12, 13, 13, 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 |
Der loop-Teil. Beachte die Kommentare.
void loop()
{
String Stunde, Minute, Weckzeit;
// aktuelle Zeit lesen
DateTime aktuell = rtc.now();
// Stunde einstellen
TasterLesenLinks = digitalRead(TasterLinks);
// Minute einstellen
if (TasterLesenLinks == LOW)
{
delay(200);
if (StundeWeckzeit >= 24) StundeWeckzeit = 1;
else StundeWeckzeit ++;
}
TasterLesenRechts = digitalRead(TasterRechts);
if (TasterLesenRechts == LOW)
{
delay(200);
if (MinuteWeckzeit >= 59) MinuteWeckzeit = 0;
else MinuteWeckzeit ++;
}
// 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());
/*
Weckzeit formatieren -> führende 0 ergänzen
4 mögliche Fälle
Stunde < 10 Minute < 10
Stunde < 10 Minute > 9
Stunde > 10 Minute < 10
Stunde > 10 Minute > 9
*/
if (StundeWeckzeit < 10 && MinuteWeckzeit < 10) Weckzeit = "0" + String(StundeWeckzeit) + ":0" + String(MinuteWeckzeit);
if (StundeWeckzeit < 10 && MinuteWeckzeit > 9) Weckzeit = "0" + String(StundeWeckzeit) + ":" + String(MinuteWeckzeit);
if (StundeWeckzeit > 9 && MinuteWeckzeit < 10) Weckzeit = String(StundeWeckzeit) + ":0" + String(MinuteWeckzeit);
if (StundeWeckzeit > 9 && MinuteWeckzeit > 9) Weckzeit = String(StundeWeckzeit) + ":" + String(MinuteWeckzeit);
lcd.setCursor(0, 3);
lcd.print("Weckzeit: " + Weckzeit);
// führende 0 setzen
if (aktuell.hour() < 10) Stunde = "0" + String(aktuell.hour());
else Stunde = String(aktuell.hour());
// führende 0 setzen
if (aktuell.minute() < 10) Minute = "0" + String(aktuell.minute());
else Minute = String(aktuell.minute());
// String zusammensetzen
String aktuelleZeit = Stunde + ":" + Minute;
if (aktuelleZeit == Weckzeit && aktuell.second() < DauerWecksignal)
{
tone(Lautsprecher, 1000, 500);
}
/*
Ticken der Uhr
aktuelle Zeit (ZeitJetzt) messen
millis() -> Zeit, die seit dem Start des Programms
vergangen ist
wenn die Differenz zwischen der gerade gemessenen Zeit
und der im setup gemessenen Startzeit >= 1000 (1 Sekunde) ist
-> kurzen Ton wiedergeben
Startzeit muss anschließend auf die aktuelle Zeit gesetzt werden
*/
ZeitJetzt = millis();
if (ZeitJetzt - Startzeit >= 1000)
{
tone(Lautsprecher, 1000, 2);
Startzeit = ZeitJetzt;
}
}
Verwandte Anleitungen:
- Datum und Zeit mit ESP und time.h anzeigen
- Datum und Zeit mit dem NTP-Protokoll anzeigen
- Lottozahlen mit Zeitstempel anzeigen und auf einer SD-Karte speichern
- Stoppuhr
- Datum, Uhrzeit und Temperatur auf einem LCD mit einem RTC-Modul anzeigen
Letzte Aktualisierung: