ESP8266 – NTP Protokoll für das lesen eines genauen Zeitstempels

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 Resourcen:

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.

Bibliothek "NTPClient" zum auslesen eines Zeitstempels von einem NTP Server
Bibliothek „NTPClient“ zum auslesen eines Zeitstempels von einem NTP Server

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 noch zusätzlich eine 1h (also 3600 Sekunden)
  //auf diese Zeit draufaddiert werden.
  timeClient.setTimeOffset(7200);
}

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:

ESP8266 - Ausgabe des Zeitstempels auf der seriellen Schnittstelle
ESP8266 – Ausgabe des Zeitstempels auf der seriellen Schnittstelle

Video

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 das 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 (zbsp. DS3132) initial mit einem Zeitstempel zu versorgen.

 

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.