
Ziel des Projekts
Die Standardbibliothek time.h wird verwendet um Datum und Zeit auf einem OLED anzuzeigen.



Die Hardware
ESP32 Wroom mit Steckbrett verwenden

Leider ist der ESP32 Wroom nicht „steckbretttauglich“. Ich habe daher zwei Steckbretter zu einem zusammengefügt. Es ist wichtig, dass auf einer Seite die Plus- und Minusleiste erhalten bleibt.

Die optimale Position des ESP32 auf dem Steckbrett.
Anschluss des OLED

ESP32-WROOM
schwarz -> GND
gelb -> SCL (22)
grün -> SDA (21)
rot -> 3,3 V

ESP32-C6
schwarz -> GND
gelb -> SCL (22)
grün -> SDA (23)
rot -> 5 V

Arduino Nano ESP32
schwarz -> GND
gelb -> SCL (A5)
grün -> SDA (A4)
rot -> 3,3 V

XIAO-ESP32-C3
schwarz -> GND
gelb -> SCL (D5)
grün -> SDA (D4)
rot -> 5 V

ESP32-C3 Zero
schwarz -> GND
gelb -> SCL (9)
grün -> SDA (8)
rot -> 5 V
Konfiguration der Mikrocontroller
Installiere mit dem Boardverwalter das passende Board:
Benötigte Bibliothek

Das Programm
Es wird der Programmcode für ein Display mit 128×64 Pixeln beschrieben. Das Programm für das Display mit 128×128 Pixelen findest du ⇒hier.
Binde die benötigten Bibliotheken ein und definiere die Variablen.
Es wird der ⇒Full-Buffer-Mode verwendet um das Flackern des Bildschirms beim Wechsel der Uhrzeit zu vermeiden.
|
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 "WiFi.h" #include "time.h" #include "U8g2lib.h" // OLED initialisieren // SSD 1306 Full Buffer U8G2_SSD1306_128X64_NONAME_F_HW_I2C oled(U8G2_R0); // SH1106 // U8G2_SH1106_128X64_NONAME_1_HW_I2C oled(U8G2_R0); // WiFi-Daten char Router[] = "Router_SSID"; char Passwort[] = "xxxxxxxx"; // NTP-Server aus dem Pool #define Zeitserver "de.pool.ntp.org" /* Liste der Zeitzonen https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv Zeitzone CET = Central European Time -1 -> 1 Stunde zurück CEST = Central European Summer Time von M3 = März, 5.0 = Sonntag 5. Woche, 02 = 2 Uhr bis M10 = Oktober, 5.0 = Sonntag 5. Woche 03 = 3 Uhr */ #define Zeitzone "CET-1CEST,M3.5.0/02,M10.5.0/03" // time_t enthält die Anzahl der Sekunden seit dem 1.1.1970 0 Uhr time_t aktuelleZeit; /* Struktur tm tm_hour -> Stunde: 0 bis 23 tm_min -> Minuten: 0 bis 59 tm_sec -> Sekunden 0 bis 59 tm_mday -> Tag 1 bis 31 tm_wday -> Wochentag (0 = Sonntag, 6 = Samstag) tm_mon -> Monat: 0 (Januar) bis 11 (Dezember) tm_year -> Jahre seit 1900 tm_yday -> vergangene Tage seit 1. Januar des Jahres tm_isdst -> Wert > 0 = Sommerzeit (dst = daylight saving time) */ tm Zeit; // Variablen für die Zeit int Stunden, Minuten, Sekunden; // beim Start des loop-Teils wird die Zeit einmalig synchronisiert bool Start = true; unsigned long Zeitmessung = 0; |
Beim Start des Programms – dem Durchlauf des setup-Teils – zeigen die Meldungen auf dem OLED ob Datum und Zeit synchronisiert sind. Wenn nach 90 Sekunden keiner der abgefragten Zeitserver aus dem Pool antwortet, wird das Programm beendet. Nach einem erneuten Hochladen wird die Zeit zumeist schnell ermittelt.

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 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 |
void setup() { Serial.begin(9600); // OLED starten oled.begin(); oled.setFont(u8g2_font_helvB10_tf); // Zeichenfarbe weiß oled.setDrawColor(1); // Zeitzone: Parameter für die zu ermittelnde Zeit configTzTime(Zeitzone, Zeitserver); WiFi.mode(WIFI_STA); oled.setCursor(2, 15); oled.print("WiFi starten"); oled.sendBuffer(); // WiFi starten WiFi.begin(Router, Passwort); while (WiFi.waitForConnectResult() != WL_CONNECTED) { delay(200); Serial.print("."); } oled.setCursor(2, 30); oled.print(WiFi.localIP()); oled.sendBuffer(); // Zeit holen time(&aktuelleZeit); // localtime_r -> Zeit in die lokale Zeitzone setzen localtime_r(&aktuelleZeit, &Zeit); // beim Start entspricht das Datum der Unixtime: 1.1.1970 // Datum/Kalender sollen erst angezeigt werden, wenn das Datum korrekt ist String Jahr = String(Zeit.tm_year + 1900); int Zaehler = 0; // String Jahr nach "1970" durchsuchen int Suche = Jahr.indexOf("1970"); oled.setCursor(2, 45); oled.print("Zeit"); oled.setCursor(2, 60); oled.print("synchronisieren"); oled.sendBuffer(); oled.clearBuffer(); // solange die Suche nicht erfolgreich ist while (Suche != -1) { // aktuelle Zeit holen time(&aktuelleZeit); // localtime_r -> Zeit in die lokale Zeitzone setzen localtime_r(&aktuelleZeit, &Zeit); Jahr = String(Zeit.tm_year + 1900); // String Jahr nach "1970" durchsuchen Suche = Jahr.indexOf("1970"); // Zeit in Stunden, Minuten und Sekunden Stunden = int(Zeit.tm_hour), Minuten = int(Zeit.tm_min), Sekunden = int(Zeit.tm_sec); delay(1000); Zaehler++; if (Zaehler >= 90) { oled.clear(); oled.setCursor(2, 15); oled.print("Programmende!"); oled.sendBuffer(); oled.clearBuffer(); // Programm beenden while (1); } } // Datum/Zeit erfolgreich synchronisiert if (Suche == -1) { oled.setCursor(2, 15); oled.print("Zeit/Datum"); oled.setCursor(2, 30); oled.print("synchronisiert"); oled.sendBuffer(); oled.clearBuffer(); } delay(3000); // Zeit in Stunden, Minuten und Sekunden Stunden = Zeit.tm_hour, Minuten = Zeit.tm_min, Sekunden = Zeit.tm_sec; oled.clear(); Zeitmessung = millis() + 1000; } |
Der loop-Teil
Die Darstellung auf dem OLED übernimmt die Funktion ZeitAnzeigen().
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
void loop() { // Start = true // -> Zeit einmalig synchronisieren if (Start) { Start = false; ZeitAnzeigen(); } // Sekunden weiter zählen if (Zeitmessung < millis()) { Zeitmessung += 1000; Sekunden++; if (Sekunden == 60) { ZeitAnzeigen(); } } } |
Die Funktion ZeitAnzeigen()
|
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 |
void ZeitAnzeigen() { // aktuelle Zeit lesen time(&aktuelleZeit); // localtime_r -> Zeit in die lokale Zeitzone setzen localtime_r(&aktuelleZeit, &Zeit); // Zeit in Stunden, Minuten und Sekunden Stunden = Zeit.tm_hour, Minuten = Zeit.tm_min, Sekunden = Zeit.tm_sec; // Zeichenfarbe weiß oled.setDrawColor(1); // horizontale Schrift oled.setFontDirection(0); // Wochentag anzeigen oled.setCursor(2, 15); oled.setFont(u8g2_font_helvB12_tf); switch (Zeit.tm_wday) { case 0: oled.print("Sonntag "); break; case 1: oled.print("Montag "); break; case 2: oled.print("Dienstag "); break; case 3: oled.print("Mittwoch "); break; case 4: oled.print("Donnerstag "); break; case 5: oled.print("Freitag "); break; case 6: oled.print("Samstag "); break; } // Datum anzeigen oled.setCursor(2, 33); // Tag: führende 0 ergänzen if (Zeit.tm_mday < 10) oled.print("0"); oled.print(Zeit.tm_mday); oled.print("."); // Monat: führende 0 ergänzen if (Zeit.tm_mon < 10) oled.print("0"); oled.print(Zeit.tm_mon + 1); oled.print("."); // Anzahl Jahre seit 1900 oled.print(Zeit.tm_year + 1900); // horizontale Linie oled.drawHLine(1, 36, oled.getDisplayWidth()); // Zeit anzeigen oled.setFont(u8g2_font_helvR24_tf); oled.setCursor(2, 64); if (Zeit.tm_hour < 10) oled.print("0"); oled.print(Zeit.tm_hour); oled.print(":"); if (Zeit.tm_min < 10) oled.print("0"); oled.print(Zeit.tm_min); oled.sendBuffer(); oled.clearBuffer(); } |
Quellen
Ähnliche Projekte
- Analoge Uhr mit BME280 auf ESP32 mit 3,5 Zoll/4 Zoll TFT
- Analoge Uhr mit TFT 240×240 Pixeln und RTC-Modul
- Analoge Uhr mit TFT-Shield und BME280
- Datum und Zeit mit dem NTP-Protokoll auf einem OLED anzeigen
- Messwerte des DHT-Sensors und Zeit auf TFT anzeigen
- Stoppuhr
- Messwerte DHT-Sensor und Zeit auf Waveshare E-Ink 4,2 Zoll anzeigen
- Analoge Uhr mit TFT 240×240 Pixeln und WiFi
- Uhrzeit auf LED-Matrix anzeigen
- Zeit mit time.h auf einem TFT anzeigen
letzte Aktualisierung:
