
Die Standardbibliothek time.h wird verwendet um Datum und Zeit auf einem OLED und im Seriellen Monitor anzuzeigen.
So sieht es aus:


ESP32 und NodeMCU mit Steckbrett verwenden

Leider sind der ESP32 und der NodeMCU 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

NodeMCU
gelb -> SCL (D1)
grün -> SDA (D2)
schwarz -> GND (G)
rot -> 3,3 V

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

Wemos D1 Mini
schwarz -> GND
gelb -> SCL (D1)
grün -> SDA (D2)
rot -> 5V

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
Installiere mit dem Boardverwalter das passende Board:
- ESP32-Wroom
- ESP32C6
- ESP32-S3
- Arduino Nano ESP32
- XIAO-ESP32-C3
- ESP32-C3-Zero
- ESP32-C3 Super Mini
- Wemos D1
- NodeMCU
Benötigte Bibliothek:


⇒u8g2
Binde die benötigten Bibliotheken ein und definiere die Variablen.
Die benötigte WiFi-Bibliothek wird durch die #ifdef-Abfrage ermittelt.
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 53 54 55 56 57 58 | #ifdef ESP8266 #include “ESP8266WiFi.h” #else #include “WiFi.h” #endif #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 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. Beachte die Kommentare.
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 | void setup() { Serial.begin(9600); // Zeitzone: Parameter für die zu ermittelnde Zeit configTzTime(Zeitzone, Zeitserver); WiFi.mode(WIFI_STA); // WiFi starten WiFi.begin(Router, Passwort); Serial.println(“————————”); while (WiFi.status() != WL_CONNECTED) { delay(200); Serial.print(“.”); } Serial.println(); Serial.print(“Verbunden mit ”); Serial.println(Router); Serial.print(“IP über DHCP: ”); Serial.println(WiFi.localIP()); // 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”); Serial.println(“————————-”); Serial.println(“Datum und Zeit holen (maximal 90 Sekunden)…”); // 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) { Serial.println(); Serial.println(“Datum und Zeit konnte innerhalb von ” + String(Zaehler) + ” Sekunden nicht geholt werden”); Serial.println(“Programm wird beendet”); // Programm beenden while (1); } Serial.print(“.”); } Serial.println(); // Datum/Zeit erfolgreich synchronisiert if (Suche == -1) { Serial.println(“————————-”); Serial.println(“Datum/Zeit erfolgreich synchronisiert …”); if (Zeit.tm_mday < 10) Serial.print(“0”); Serial.print(Zeit.tm_mday); Serial.print(“.”); // Monat: führende 0 ergänzen if (Zeit.tm_mon < 9) Serial.print(“0”); // Zählung beginnt mit 0 -> +1 Serial.print(Zeit.tm_mon + 1); Serial.print(“.”); // Anzahl Jahre seit 1900 Serial.println(Zeit.tm_year + 1900); if (Zeit.tm_hour < 10) Serial.print(“0”); Serial.print(Zeit.tm_hour); Serial.print(“:”); if (Zeit.tm_min < 10) Serial.print(“0”); Serial.print(Zeit.tm_min); Serial.print(“:”); if (Zeit.tm_sec < 10) Serial.print(“0”); Serial.println(Zeit.tm_sec); Serial.println(“————————-”); } // Zeit in Stunden, Minuten und Sekunden Stunden = Zeit.tm_hour, Minuten = Zeit.tm_min, Sekunden = Zeit.tm_sec; // OLED starten oled.begin(); // Zeichenfarbe weiß oled.setDrawColor(1); 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
Verwandte Anleitungen:
- Datum und Zeit mit dem NTP-Protokoll anzeigen
- DHT — Messdaten und Zeit auf TFT anzeigen
- Stoppuhr
- Uhr mit TFT 240x240 Pixeln
- Zeit mit time.h auf einem TFT anzeigen
- Wecker mit einem RTC-Modul
- Zeit im Seriellen Monitor mit ESP-Mikrocontroller anzeigen
- Datum, Uhrzeit und Temperatur auf einem LCD mit einem RTC-Modul anzeigen
- Uhrzeit und Temperatur auf einem 4‑stelligen 7‑Segment-Modul anzeigen
- Zeit mit time.h auf einer 4‑stelligen 7‑Segment-Anzeige darstellen
letzte Aktualisierung:





