
Ziele des Projekts
Die Weckzeit wird zusammen mit Wochentag, Datum und Uhrzeit auf dem 4-zeiligen LCD-Display mit I²C-Schnittstelle angezeigt. Die Einstellungen können mit Tastern oder einer Fernbedienung vorgenommen werden.
Außerdem wird die mit dem RTC-Modul gemessene Temperatur angezeigt.
Als Wecksignal stehen verschiedene Melodien zur Verfügung.
Weitere Klingeltöne zum Download bei 🔗PICAXE
|
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 |
#include "PlayRtttl.hpp" int Lautsprecher = 5; char TeDeum[] = "Te_Deum:d=4,o=5,b=63:8c,8f,16f,16g,8a,8f,c6,8a,8a,8a#,16c6,16a#,16a,16a#,8c6,16g,16f,16g,16a,8g,8c,8f,16f,16g,8a,8f,c6,8a,8a,16a#,16c6,16a,16a#,g,16f,2f"; char FuerElise[] = "Elise:d=8,o=5,b=125:32p,e6,d#6,e6,d#6,e6,b,d6,c6,4a.,32p,c,e,a,4b.,32p,e,g#,b,4c.6,32p,e,e6,d#6,e6,d#6,e6,b,d6,c6,4a.,32p,c,e,a,4b.,32p,d,c6,b,2a"; char OdeandieFreude[] = "Ode_an_die_Freude:d=4,o=6,b=100:a5,a5,a_5,c,c,a_5,a5,g5,f5,f5,g5,a5,a.5,8g5,2g5,"; char Bolero[] = "Bolero:d=4,o=5,b=80:c6,8c6,16b,16c6,16d6,16c6,16b,16a,8c6,16c6,16a,c6,8c6,16b,16c6,16a,16g,16e,16f,2g,16g,16f,16e,16d,16e,16f,16g,16a,g,g,"; void setup() { startPlayRtttl(Lautsprecher, TeDeum); while (updatePlayRtttl()) { delay(1); } delay(1000); startPlayRtttl(Lautsprecher, FuerElise); while (updatePlayRtttl()) { delay(1); } delay(1000); startPlayRtttl(Lautsprecher, OdeandieFreude); while (updatePlayRtttl()) { delay(1); } delay(1000); startPlayRtttl(Lautsprecher, Bolero); while (updatePlayRtttl()) { delay(1); } } void loop() { // bleibt leer, Programm läuft nur einmal } |
Wecker mit Tastern
- linker Taster: eine Stunde vorwärts
- mittlerer Taster: eine Minute weiter
- rechter Taster: Wecker ein- oder ausschalten
Die zuvor eingestellte Zeit und der Zustand des Weckers (ein/aus) werden auf dem internen Speicher eines Arduinos gespeichert.
Ein konfigurierbare „Nachtschaltung“ schaltet die Hintergrundbeleuchtung des LCDs aus.


Funktionen der Bibliothek LCDIC2
| Schlüsselwort | Aktion |
|---|---|
| begin(); | LCD starten |
| setBacklight(Status); | true = Hintergrundbeleuchtung einschalten false = Hintergrundbeleuchtung ausschalten |
| home(); | Position auf links oben setzen |
| setCursor(Spalte, Zeile); | Cursor in Spalte/Zeile platzieren |
| setCursor(Status); | true = Cursor anzeigen false = Cursor verbergen |
| clear(); | Anzeige löschen |
| print("Text"); | Text anzeigen |
| blink(); | blinkender Cursor |
Benötigte Bauteile
- 3 Taster
- ⇒4-zeiliges LCD mit I²C-Schnittstelle
- ⇒RTC-Modul DS3231
- Lautsprecher
- Leitungsdrähte
Der Schaltplan
(Fahre mit der Maus über das Bild, um die Bezeichnungen der Bauteile zu sehen)
Die Laustärke des Lautsprechers kannst du mit einem vorgeschalteten Widerstand regulieren.
Das Programm
Die zuvor eingestellte Zeit und der Zustand des Weckers (ein/aus) werden auf dem internen Speicher eines Arduinos gespeichert. Du kannst in Zeile eine der Melodien als Wecksignal einstellen.
Bibliotheken und Variablen

![]() | ![]() |

Einstellungen:
- Uhrzeiten, in denen das Display dunkel geschaltet werden kann
ZeitBeleuchtungAus/ZeitBeleuchtungEin - Anzeige der Sekunden ein/aus
SekundenAnzeigen true/false - Dauer des Wecksignals in Sekunden
DauerWecksignal - Anzeige der Temperatur ein/aus
AnzeigeTemperatur true/false - Auswahl der Melodie:
0: TeDeum
1: FuerElise
2: OdeAnDieFreude
3: Bolero

Solange die Weckmelodie abgespielt wird, bleibt der Sekundenzeiger stehen. Anschließend wird wieder der aktuelle Wert angezeigt.
|
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 |
#include "RTClib.h" #include "LCDIC2.h" #include "EEPROM.h" #include "Bounce2.h" #include "PlayRtttl.hpp" // 4-zeiliges LCD LCDIC2 lcd(0x27, 20, 4); // Name des RTC-Moduls RTC_DS3231 rtc; int Lautsprecher = 5; int TasterLinks = 7; int TasterMitte = 8; int TasterRechts = 9 ; // Beginn der Weckzeit int StundeWeckzeit; int MinuteWeckzeit; // Uhrzeiten Aus/-einschaltung Hintergrundbeleuchtung int ZeitBeleuchtungAus = 22; int ZeitBeleuchtungEin = 7; // Sekunden anzeigen ein/aus bool SekundenAnzeigen = true; // Dauer des Signal in Sekunden int DauerWecksignal = 10; bool WeckerEinAus; bool AnzeigeTemperatur = true; Bounce WeckzeitStunde = Bounce(); Bounce WeckzeitMinute = Bounce(); Bounce StatusWecker = Bounce(); // 0 char TeDeum[] = "Te_Deum:d=4,o=5,b=63:8c,8f,16f,16g,8a,8f,c6,8a,8a,8a#,16c6,16a#,16a,16a#,8c6,16g,16f,16g,16a,8g"; // 1 char FuerElise[] = "Elise:d=8,o=5,b=125:32p,e6,d#6,e6,d#6,e6,b,d6,c6,4a.,32p,c,e,a,4b.,32p,e,g#,b,4c.6,32p,e,e6,d#6,e6,d#6,e6,b,d6,c6,4a"; // 2 char OdeandieFreude[] = "Ode_an_die_Freude:d=4,o=6,b=100:a5,a5,a_5,c,c,a_5,a5,g5,f5,f5,g5,a5,a.5,8g5,2g5,"; // 3 char Bolero[] = "Bolero:d=4,o=5,b=80:c6,8c6,16b,16c6,16d6,16c6,16b,16a,8c6,16c6,16a,c6,8c6,16b,16c6,16a,16g,16e,16f,2g,16g,16f,16e,16d,16e,16f,16g,16a,g,g,"; int Weckmelodie = 0; |
Der setup-Teil
Nachdem die Zeit mit dem Zeitpunkt des Kompilierens gesetzt wurde, musst du vor einem erneutem Hochladen die Zeile 82 mit // versehen, ansonsten stimmt nach einem Stromausfall die Zeit nicht mehr.
|
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 |
void setup() { pinMode(TasterLinks, INPUT_PULLUP); pinMode(TasterMitte, INPUT_PULLUP); pinMode(TasterRechts, INPUT_PULLUP); // Instanzen des Objekts Bounce für jede Taste zuordnen // Zeitintervall einstellen WeckzeitStunde.attach(TasterLinks); WeckzeitStunde.interval(20); WeckzeitMinute.attach(TasterMitte); WeckzeitMinute.interval(20); StatusWecker.attach(TasterRechts); StatusWecker.interval(20); Serial.begin(9600); // auf serielle Verbindung warten while (!Serial) {;} delay(1000); 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(2025, 4, 14, 16, 42, 30)); */ // rtc.adjust(DateTime(2025, 4, 14, 16, 42, 30)); // Zeitpunkt des Kompilierens als aktuelle Zeit setzen rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // LCD starten lcd.begin(); // Cursor "verstecken" lcd.setCursor(false); // Weckzeit Stunde/Minute aus EEPROM lesen StundeWeckzeit = EEPROM.read(0); MinuteWeckzeit = EEPROM.read(2); // Status der Weckzeit lesen ein/aus WeckerEinAus = EEPROM.read(4); Serial.println(StundeWeckzeit); Serial.println(MinuteWeckzeit); Serial.println(WeckerEinAus); } |
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 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 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 |
void loop() { String Stunde, Minute, Weckzeit; // aktuelle Zeit lesen DateTime aktuell = rtc.now(); // Stunde einstellen if (WeckzeitStunde.update()) { if (WeckzeitStunde.read() == LOW) { if (StundeWeckzeit >= 23) StundeWeckzeit = 0; else StundeWeckzeit ++; // Weckzeit Stunde an Position 0 in EEPROM schreiben EEPROM.update(0, StundeWeckzeit); } } // Minute einstellen if (WeckzeitMinute.update()) { if (WeckzeitMinute.read() == LOW) { if (MinuteWeckzeit >= 59) MinuteWeckzeit = 0; else MinuteWeckzeit ++; // Weckzeit Minute an Position 2 in EEPROM schreiben EEPROM.update(2, MinuteWeckzeit); } } // Wecker ein/aus if (StatusWecker.update()) { if (StatusWecker.read() == LOW) { WeckerEinAus = !WeckerEinAus; // Status Wecker schreiben if(WeckerEinAus) EEPROM.update(4, 1); else EEPROM.update(4, 0); } } // 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; } if(AnzeigeTemperatur) { // Temperatur ermitteln String Temperatur = String(rtc.getTemperature(), 1); // Wert wid im angelsächsisches Zahlenformat ermittelt // . durch , ersetzen Temperatur.replace(".", ","); lcd.print(Temperatur + "\337C "); } lcd.setCursor(0, 1); lcd.print(String(aktuell.day()) + "."); // 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(String(aktuell.year())); lcd.setCursor(0, 2); // 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())); if(SekundenAnzeigen) { lcd.print(':'); // wenn Sekunden < 10 -> führende 0 setzen if (aktuell.second() < 10) lcd.print("0"); lcd.print(String(aktuell.second())); } // Steuerung der Hintergrundbeleuchtung if(aktuell.hour() == ZeitBeleuchtungAus) lcd.setBacklight(false); if(aktuell.hour() == ZeitBeleuchtungEin) lcd.setBacklight(true); if (WeckerEinAus) lcd.print(" Wecker ein"); else lcd.print(" Wecker aus"); /* 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) { switch(Weckmelodie) { case 0: startPlayRtttl(Lautsprecher, TeDeum); while (updatePlayRtttl()) { delay(1); } break; case 1: startPlayRtttl(Lautsprecher, FuerElise); while (updatePlayRtttl()) { delay(1); } break; case 2: startPlayRtttl(Lautsprecher, OdeandieFreude); while (updatePlayRtttl()) { delay(1); } break; case 3: startPlayRtttl(Lautsprecher, Bolero); while (updatePlayRtttl()) { delay(1); } break; default: break; } } } |
Wecker mit Fernbedienung
Die zuvor eingestellte Weckzeit in Stunden und Minuten und der Zustand des Weckers (ein/aus) werden auf dem internen Speicher eines Arduinos gespeichert.


Benötigte Bauteile
- ⇒Infrarot-Empfänger mit Keyes-Fernbedienung
alternativ eine ⇒andere Fernbedienung - ⇒4-zeiliges LCD mit I²C-Schnittstelle
- ⇒RTC-Modul DS3231
- Lautsprecher
- Leitungsdrähte
Der Schaltplan
(Fahre mit der Maus über das Bild, um die Bezeichnungen der Bauteile zu sehen)
Die weiße LED ist optional.
Das Programm
Einstellungen
Wenn du das Programm zum ersten Mal startest, sind alle Werte im EEPROM auf 0 gesetzt. Mit diesem Programm kannst du die Werte anzeigen:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include "EEPROM.h" void setup() { Serial.begin(9600); // auf serielle Verbindung warten while (!Serial); delay(1000); for (int i = 0; i < 12; i++) { Serial.println(EEPROM.read(i)); } } void loop() { // bleibt leer, Programm wird nur einmal ausgeführt } |
Alle Werte auf 0 setzen:
|
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 |
#include "EEPROM.h" void setup() { Serial.begin(9600); // auf serielle Verbindung warten while (!Serial); delay(1000); for (int i = 0; i < 12; i++) { EEPROM.write(i, 0); } // Zufallszahlen lesen for (int i = 0; i < 12; i++) { Serial.println(EEPROM.read(i)); } } void loop() { // bleibt leer, Programm wird nur einmal ausgeführt } |
Die Tasten der Fernbedienung verändern die Einstellungen und schreiben sie neu.

- nach oben: eine Stunde vorwärts
- nach unten: eine Stunde zurück
- nach rechts: eine Minute weiter
- nach links: eine Minute zurück
- OK: Wecker ein- oder ausschalten
- # Hintergrundbeleuchtung ausschalten
- * Hintergrundbeleuchtung einschalten
- 1: Melodie TeDeum
- 2: Melodie FuerElise
- 3: Melodie OdeandieFreude
- 4: Melodie Bolero
- 0: Licht ein-/ausschalten
- 9: Anzeige der Sekunden ein/aus
Bibliotheken und Variable

![]() | ![]() |

- Anzeige der Sekunden ein/aus
SekundenAnzeigen true/false - Dauer des Wecksignals in Sekunden
DauerWecksignal - zusätzliches Licht zum Wecksignal (optional)
LichtWecker true/false

Wenn Tasten auf der Fernbedienung gedrückt werden, kann es zu kurzen zeitlichen Verzögerungen kommen. Diese werden aber bei der nächsten Abfrage des RTC-Moduls korrigiert.

Solange die Weckmelodie abgespielt wird, bleibt die Sekundenanzeige stehen. Anschließend wird wieder der aktuelle Wert angezeigt.
|
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 |
#include "RTClib.h" #include "LCDIC2.h" #include "EEPROM.h" #include "IRremote.hpp" #include "PlayRtttl.hpp" // der Pin, an dem der Infrarot-Empfänger angeschlossen ist #define EmpfaengerPin 8 #define Lautsprecher 5 #define LED 6 // 4-zeiliges LCD LCDIC2 lcd(0x27, 20, 4); // Name des RTC-Moduls RTC_DS3231 rtc; // Beginn der Weckzeit int StundeWeckzeit = 7; int MinuteWeckzeit = 0; // Standardwerte werden durch EEPROM überschrieben bool SekundenAnzeigen = true; int DauerWecksignal = 10; bool WeckerEinAus = true; bool LichtWecker = true; bool LichtEinschalten = true; bool AnzeigeTemperatur = true; int Weckmelodie = 0; // 0 char TeDeum[] = "Te_Deum:d=4,o=5,b=63:8c,8f,16f,16g,8a,8f,c6,8a,8a,8a#,16c6,16a#,16a,16a#,8c6,16g,16f,16g,16a,8g"; // 1 char FuerElise[] = "Elise:d=8,o=5,b=125:32p,e6,d#6,e6,d#6,e6,b,d6,c6,4a.,32p,c,e,a,4b.,32p,e,g#,b,4c.6,32p,e,e6,d#6,e6,d#6,e6,b,d6,c6,4a"; // 2 char OdeandieFreude[] = "Ode_an_die_Freude:d=4,o=6,b=100:a5,a5,a_5,c,c,a_5,a5,g5,f5,f5,g5,a5,a.5,8g5,2g5,"; // 3 char Bolero[] = "Bolero:d=4,o=5,b=80:c6,8c6,16b,16c6,16d6,16c6,16b,16a,8c6,16c6,16a,c6,8c6,16b,16c6,16a,16g,16e,16f,2g,16g,16f,16e,16d,16e,16f,16g,16a,g,g,"; |
Der setup-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 |
void setup() { // Infrarot-Empfänger starten IrReceiver.begin(EmpfaengerPin); Serial.begin(9600); // auf serielle Verbindung warten while (!Serial) {;} delay(1000); 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(2025, 4, 14, 16, 42, 30)); */ // rtc.adjust(DateTime(2025, 4, 14, 16, 42, 30)); // Zeitpunkt des Kompilierens als aktuelle Zeit setzen // rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // LCD starten lcd.begin(); // Cursor "verstecken" lcd.setCursor(false); // Weckzeit Stunde/Minute aus EEPROM lesen StundeWeckzeit = EEPROM.read(0); MinuteWeckzeit = EEPROM.read(2); // Status der Weckzeit lesen ein/aus WeckerEinAus = EEPROM.read(4); // Status der Weckzeit lesen ein/aus Weckmelodie = EEPROM.read(8); // Status Sekunden anzeigen lesen SekundenAnzeigen = EEPROM.read(8); Serial.println(StundeWeckzeit); Serial.println(MinuteWeckzeit); Serial.println(WeckerEinAus); Serial.println(Weckmelodie); Serial.println(SekundenAnzeigen); } |
Der loop-Teil
Die Tastencodes beziehen sich auf die Keyes-Fernbedienung. Wenn du eine andere Fernbedienung verwendest, musst du die ⇒Tastencodes anpassen.

Wenn der Druck auf die Taste der Fernbedienung zu schnell hintereinander registriert wird, kannst du in Zeile 14 die Zeit für delay etwas erhöhen.
|
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 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 |
void loop() { String Stunde, Minute, Weckzeit; // aktuelle Zeit lesen DateTime aktuell = rtc.now(); if (IrReceiver.decode()) { // resume -> nächsten Wert lesen IrReceiver.resume(); if (IrReceiver.decodedIRData.command >= 0 && IrReceiver.decodedIRData.command < 95) { delay(200); // Pfeil oben -> Stunden ++ if (IrReceiver.decodedIRData.command == 70) { if (StundeWeckzeit >= 23) StundeWeckzeit = 0; else StundeWeckzeit ++; // Weckzeit Stunde an Position 0 in EEPROM schreiben EEPROM.update(0, StundeWeckzeit); } // Pfeil unten Stunden -- if (IrReceiver.decodedIRData.command == 21) { if (StundeWeckzeit == 0) StundeWeckzeit = 23; else StundeWeckzeit --; // Weckzeit Stunde an Position 0 in EEPROM schreiben EEPROM.update(0, StundeWeckzeit); } // Pfeil rechts -> Minuten ++ if (IrReceiver.decodedIRData.command == 67) { if (MinuteWeckzeit >= 59) { MinuteWeckzeit = 0; StundeWeckzeit ++; EEPROM.update(0, StundeWeckzeit); } else MinuteWeckzeit ++; // Weckzeit Stunde an Position 0 in EEPROM schreiben EEPROM.update(2, MinuteWeckzeit); } // Pfeil links -> Minuten -- if (IrReceiver.decodedIRData.command == 68) { if (MinuteWeckzeit == 0) { MinuteWeckzeit = 59; StundeWeckzeit --; EEPROM.update(0, StundeWeckzeit); } else MinuteWeckzeit --; // Weckzeit Stunde an Position 0 in EEPROM schreiben EEPROM.update(2, MinuteWeckzeit); } // OK -> Wecker ein/aus if (IrReceiver.decodedIRData.command == 64) { WeckerEinAus = !WeckerEinAus; // Status Wecker schreiben if(WeckerEinAus) EEPROM.update(4, 1); else EEPROM.update(4, 0); } // # -> Hintergrundbeleuchtung aus if (IrReceiver.decodedIRData.command == 74) lcd.setBacklight(false); // * -> Hintergrundbeleuchtung ein if (IrReceiver.decodedIRData.command == 66) lcd.setBacklight(true); // 1 -> Melodie TedDeum if (IrReceiver.decodedIRData.command == 22) { Weckmelodie = 0; EEPROM.update(6, 0); } // 2 -> Melodie FuerElise if (IrReceiver.decodedIRData.command == 25) { Weckmelodie = 1; EEPROM.update(6, 1); } // 3 -> Melodie OdeandieFreude if (IrReceiver.decodedIRData.command == 13) { Weckmelodie = 2; EEPROM.update(6, 2); } // 4 -> Melodie Bolero if (IrReceiver.decodedIRData.command == 12) { Weckmelodie = 3; EEPROM.update(6, 3); } // 0 Licht ein/aus if (IrReceiver.decodedIRData.command == 82) { if (LichtEinschalten) { analogWrite(LED, 200); LichtEinschalten =!LichtEinschalten; } else { analogWrite(LED, 0); LichtEinschalten =!LichtEinschalten; } } } } // 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; } if(AnzeigeTemperatur) { // Temperatur ermitteln String Temperatur = String(rtc.getTemperature(), 1); // Wert wid im angelsächsisches Zahlenformat ermittelt // . durch , ersetzen Temperatur.replace(".", ","); lcd.print(Temperatur + "\337C "); } lcd.setCursor(0, 1); lcd.print(String(aktuell.day()) + "."); // 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(String(aktuell.year())); lcd.setCursor(0, 2); // 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())); if(SekundenAnzeigen) { lcd.print(':'); // wenn Sekunden < 10 -> führende 0 setzen if (aktuell.second() < 10) lcd.print("0"); lcd.print(String(aktuell.second())); } if (WeckerEinAus) lcd.print(" Wecker ein"); else lcd.print(" Wecker aus"); /* 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; /* Weckzeit -> Melodie abspielen -> wenn Variable Lichtwecker gesetzt: LED einschalten -> LCD-Hintergrundbeleuchtung einschalten */ if (aktuelleZeit == Weckzeit && aktuell.second() < DauerWecksignal) { // 255 = maximaler Wert if (LichtWecker) analogWrite(LED, 255); lcd.setBacklight(true); switch(Weckmelodie) { case 1: playRtttlBlocking(Lautsprecher, TeDeum); break; case 2: playRtttlBlocking(Lautsprecher, FuerElise); break; case 3: playRtttlBlocking(Lautsprecher, OdeandieFreude); break; case 4: playRtttlBlocking(Lautsprecher, Bolero); break; default: break; } analogWrite(LED, 0); IrReceiver.begin(EmpfaengerPin); } } |
Ähnliche Projekte
- 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 240×240 Pixeln
- Uhrzeit auf LED-Matrix anzeigen
- Zeit mit time.h auf einem TFT anzeigen
- Zeit im Seriellen Monitor mit ESP-Mikrocontroller anzeigen
- Datum, Uhrzeit und Temperatur auf einem LCD mit einem RTC-Modul anzeigen
- Zeit auf Waveshare E-Ink 2,9 Zoll anzeigen
Letzte Aktualisierung:









