Nie wieder die Uhr stellen: Atomgenaue Zeit mit dem ESP32 und NTP
Um für das ein oder andere Projekt das aktuelle Datum oder Zeit zu erhalten, habe ich oft ein externes RTC-Modul (Real Time Clock) wie das DS3231 verbaut. Das kostet Platz, Geld, benötigt eine Knopfzelle und tanktet nicht genau. Aber wir nutzen den ESP32 – und der hat ein Ass im Ärmel: WLAN.

Heute zeige ich euch, wie ihr ganz ohne Zusatzhardware die exakte Uhrzeit aus dem Internet zieht, nämlich mit NTP.
Was ist NTP eigentlich?
NTP steht für Network Time Protocol. Es ist einer der ältesten Dienste im Internet. Einfach gesagt: Euer ESP32 fragt bei einem Server (einem sogenannten Zeitserver) höflich an: „Wie spät ist es?“ und der Server antwortet mit der atomgenauen Weltzeit.
Der ESP32 ist dafür besonders gut geeignet, weil die notwendigen Bibliotheken bereits fest im System integriert sind. Wir müssen nichts kompliziertes installieren.
Das braucht ihr
• Einen ESP32
• Ein Micro-USB Kabel
• Die Arduino IDE auf eurem Rechner
Der Code
Hier ist das „Rundum sorglos“-Skript. Es verbindet sich mit eurem WLAN, synchronisiert die Zeit und gibt sie sekündlich im Seriellen Monitor aus.
Kopiert den Code einfach in eure Arduino IDE:
/*
ESP32 NTP Uhr Beispiel
Dieses Programm verbindet den ESP32 mit dem WLAN, synchronisiert die Zeit
über einen NTP-Server (Network Time Protocol) und gibt sie im Seriellen Monitor aus.
Anleitung:
1. Trage WLAN-Zugangsdaten bei 'ssid' und 'password' ein.
2. Lade den Code auf Ihr ESP32 Board hoch.
3. Öffne den Seriellen Monitor mit Baudrate 115200.
*/
#include <WiFi.h>
#include "time.h"
// ---------------- KONFIGURATION ----------------
// WLAN-Daten eintragen
const char* ssid = "IHR_WLAN_NAME";
const char* password = "IHR_WLAN_PASSWORT";
// NTP Server Einstellungen
const char* ntpServer = "de.pool.ntp.org"; // Deutscher Server-Pool für bessere Latenz
const long gmtOffset_sec = 3600; // Zeitzone: Deutschland ist UTC+1 (3600 Sekunden)
const int daylightOffset_sec = 3600; // Sommerzeit: Weitere 3600 Sekunden (1 Stunde)
// -----------------------------------------------
void setup() {
// Start der seriellen Kommunikation
Serial.begin(115200);
// Kurze Wartezeit, damit der Serielle Monitor bereit ist
delay(1000);
Serial.println("\nESP32 NTP Uhr gestartet");
// Verbindung zum WLAN herstellen
Serial.printf("Verbinde mit %s ", ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" VERBUNDEN");
// Zeit konfigurieren
// configTime kümmert sich im Hintergrund um die NTP-Synchronisation
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
Serial.println("Warte auf Zeit-Synchronisation...");
// Wir warten kurz, bis die erste Zeit empfangen wurde
struct tm timeinfo;
while(!getLocalTime(&timeinfo)){
Serial.print(".");
delay(100);
}
Serial.println("\nZeit erfolgreich synchronisiert!");
}
void loop() {
printLocalTime();
delay(1000); // Aktualisierung jede Sekunde
}
// Hilfsfunktion zum Formatieren und Anzeigen der Zeit
void printLocalTime(){
struct tm timeinfo;
// Versuchen, die lokale Zeit abzurufen
if(!getLocalTime(&timeinfo)){
Serial.println("Fehler beim Abrufen der Zeit");
return;
}
// Formatierte Ausgabe
// %A = Wochentag, %d = Tag, %B = Monat, %Y = Jahr, %H:%M:%S = Uhrzeit
Serial.println(&timeinfo, "%A, %d. %B %Y %H:%M:%S");
}
Jetzt wird euch im Seriellen Monitor das aktuelle Datum und die Uhrzeit sekündlich angezeigt.

TIPP FÜR OLED DISPLAYS:
Wenn Ihr ein OLED Display (z.B. SSD1306) nutzen wollt, würde die Ausgabe mit diesem Code auch
an das Display gesendet, statt nur Serial.println.
Beispiel:
display.clearDisplay();
display.setCursor(0,0);
display.println(&timeinfo, "%H:%M:%S");
display.display();
Mehr Details:
Wie bekomme ich ein OLED Display SSD1306 an einem ESP32 zum laufen
Fehlersuche:
Wenn Serieller Monitor leer bleibt:
Bei ESP32 Chips mit USB‑CDC direkt im Chip muss man in der Arduino IDE oder im ESP‑IDF explizit die Option aktivieren (z. B. USB CDC On Boot → Enabled).

Ohne diese Einstellung bleibt der serielle Monitor leer, obwohl der Sketch läuft.
Unterschiede zu klassischen ESP32‑Boards
- ESP32 (Original, DevKit V1, WROOM, WROVER usw.) → kein USB‑CDC im Chip, benötigt externe USB‑UART‑Bridge (CP2102, CH340, FTDI).
- ESP32‑S2/S3/C3/C6/H2 → haben den USB‑Controller direkt integriert. Das Board muss aber einen USB‑Port mit den richtigen Pins herausführen, sonst bleibt nur UART.
