


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
Schließe das LCD an:


➨LCD

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.

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(2020, 12, 13, 13, 31, 30));
*/
// rtc.adjust(DateTime(2020, 12, 13, 13, 31, 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 Aufgaben:
- 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: