In diesem Beitrag zeige ich dir, wie du mit dem NTPClient und dem NTP Protokoll einen genauen Zeitstempel eines NTP Servers am ESP8266 auslesen kannst.
Was ist das NTP Protokoll?
Die Abkürzung NTP steht für Network Time Protocol und ist ein Standard für die Synchronisierung von Uhr in Computersystemen. Das NTP Protokoll kann als verbindungslose (UDP) oder verbindungsbezogene (TCP) Transportprotokoll genutzt werden.
Das NTP Protokoll wurde von David L. Mills im Jahre 1985 an der Universität von Delaware entwickelt. Bis heute wird unter seiner Leitung das Protokoll sowie die UNI Implementierung weiterentwickelt.
Möchtest du mehr über das NTP Protokoll erfahren, so möchte ich dir den Beitrag Network Time Protocol (NTP): Definition und Funktionsweise nahelegen.
Benötigte Ressourcen für diesen Beitrag
Um das Beispiel in diesem Beitrag nachstellen zu können, benötigst du folgende Ressourcen:
- einen ESP8266*,
- ein Datenkabel*
- eine Internetverbindung per WLAN
- SSID inkl. Passwort
- die Entwicklungsumgebung Arduino IDE
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!
Lesen der aktuellen Uhrzeit vom NTP Server
benötigte Bibliothek NTPClient
Für das Auslesen des Zeitstempels benötigen wir eine Bibliothek, welche über den Bibliotheksverwalter der Arduino IDE installiert werden kann.
Quellcode
Bevor du nachfolgenden Quellcode auf deinen ESP8266 kopierst / hochlädst, musst du die SSID & das Passwort deines WLAN Netzwerkes eintragen!
#include <ESP8266WiFi.h> #include <NTPClient.h> #include <WiFiUdp.h> //Hier muss die SSID & das Passwort des WLAN Netzwerkes eingetragen werden String ssid = ""; String password = ""; WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP, "pool.ntp.org"); char* wochentage[7]={"Sonntag", "Montag", "Dienstag", "Mitwoch", "Donnerstag", "Freitag", "Samstag"}; void setup() { //beginn der seriellen Kommunikation mit 9600baud Serial.begin(9600); //Aufbau der Verbindung zum WLAN Netzwerk Serial.print("Verbindung zu"); Serial.print(ssid); Serial.print(" wird aufgebaut."); WiFi.begin(ssid, password); //solange keine Verbindung besteht einen Punkt ausgeben while (WiFi.status() != WL_CONNECTED) { //eine Pause von 500ms. delay(500); Serial.print("."); } //initialisieren des NTPClients um die Zeit auszulesen timeClient.begin(); //Offset in Sekunden zur GMT +/- 0 Zeitzone //Für Deutschland muss man 1h = 3600 Sekunden nehmen, //je nach Sommer- /Winterzeit muss jedoch diese Zeit wieder abgezogen werden (also 3600 Sekunden). timeClient.setTimeOffset(3600); } void loop() { //aktualisieren des Zeitstempels timeClient.update(); //Zeitstempel auf der Sekunde genau //(Nicht zuverwechseln mit dem UNIX Timestamp welcher auf die Millisekunde genau ist.) unsigned long epochTime = timeClient.getEpochTime(); Serial.print("Epoch Time: "); Serial.println(epochTime); //Ausgabe des formatierten Zeitstempels String formattedTime = timeClient.getFormattedTime(); Serial.print("formatierter Zeitstempel: "); Serial.println(formattedTime); //einzelne Werte der Uhrzeit lesen int aktuellerTag = timeClient.getDay(); int aktuelleStunde = timeClient.getHours(); int aktuelleMinute = timeClient.getMinutes(); int aktuelleSekunde = timeClient.getSeconds(); //reservieren eines char Arrays mit maximal 20 Zeichen char timestamp[20]; //Formatieren der Werte in einen String sprintf(timestamp,"Heute ist %s, %2d:%2d:%2d",wochentage[aktuellerTag], aktuelleStunde,aktuelleMinute,aktuelleSekunde); //Ausgeben des Formatierten Strings auf der seriellen Schnittstelle Serial.println(timestamp); delay(3000); }
Ausgabe des Sketches auf der seriellen Schnittstelle:
Video – fertiger NTPClient mit ESP8266
In dem nachfolgenden Video stelle ich die Uhrzeit des empfangenen Zeitstempels gegen die der Webseite https://www.atomuhr.de/ gegenüber. Die Zeit einer Atomuhr ist sehr genau und hat nahezu keine Abweichung.
Die entstehende Abweichung in der Uhrzeit ist dem geschuldet, dass der kleine ESP8266 die Daten des NTP Servers empfangen und verarbeiten muss.
Ausblick
Mit diesem Beitrag habe ich dir kurz gezeigt, wie du einen aktuellen Zeitstempel von einem NTP Server lesen kannst. Als Nächstes können wir nun diesen Wert nutzen, um eine Realtimeclock (zum Beispiel DS3132) initial mit einem Zeitstempel zu versorgen.
Hallo Stefan, das klappt prima.
Jetzt würde mich interessieren, ob + wie man das auf den RPi-Pico mit ESP01 als WLAN-Interface übertragen kann. Mit Arduino-IDE , nicht MicroPython .