ESP8266 Synchronisation mit NTP Server

Abend zusammen,

Was ist eurer Meinung nach der beste Weg den ESP mit einem NTP Server zu Synchronisieren:

Einmalig beim Booten die Zeit abfragen oder dauerhaft während der Laufzeit im z.B. void loop()?

Mir geht es hierbei größtenteils darum, ob die ständigen Anfragen beim NTP Server Auswirkungen auf die Leistung des ESP's haben könnten.

Ich musste nämlich feststellen, dass nach einer bestimmten Laufzeit zusätzliche Anfragen an den ESP (damit meine ich vorrangig Request von der Clientseite, da der ESP gleichzeitig als Webserver dient) deutlich länger dauern.

Hierbei weiß ich nicht, ob das wirklich an den NTP Requests liegt oder an anderen Stellen in meinem Code.

Vielen Dank.

Hi

Ohne Code wissen wir Das auch nicht.

Wenn’s mehrfach sein soll, in loop() - logo, da setup() ja nur beim Neustart 1x ausgeführt wird.
Wie oft?
Kommt drauf an - wie schlecht läuft denn die Zeit des ESP (welcher überhaupt)?
Wenn Du eine Sekunde in der Stunde hast - sollte alle Stunde wohl reichen.
Wenn’s 1 Sekunde pro Minute ist, vll. millis() einen Faktor gönnen und öfter abgleichen - je weniger, desto weniger wird halt dafür gearbeitet.
Solange Du Antwort bekommst, scheint Dich der NTP-Server nicht zu blockieren - aber auch Das wäre möglich, daß Er die nervige Kundschaft halt immer länger warten lässt - vll. gibt Er (der nervende Kunde) ja freiwillig irgend wann auf …

MfG

Also öfter als 1 Mal pro Stunde (besser aller 2 Stunden) solltest Du NTP nicht abfragen, sonst kommst Du schnell auf eine Blockliste.
Aber nur beim Booten ist auch zu wenig. Je nach Genauigkeit Deines Resonators und Deinen Genauigkeitsanforderungen (den realen, nicht den maximal gewünschten) sollte es zwischen 1h und 12h liegen.

Gruß Tommy

Ohh, dann hab ich ja mal richtig Glück, dass ich noch nicht blockiert wurde, denn ich habe das Programm jetzt mal für über einen Tag durchlaufen lassen mit einem NTP Request jede Sekunde :smiley:

Hat der ESP eine interne Uhr die ich mit NTP z.B. Stündlich synchronsieren kann und die dann selbstständig weiterläuft?

Danke schonmal:)

postmaster-ino:
Solange Du Antwort bekommst, scheint Dich der NTP-Server nicht zu blockieren - aber auch Das wäre möglich, daß Er die nervige Kundschaft halt immer länger warten lässt - vll. gibt Er (der nervende Kunde) ja freiwillig irgend wann auf ...

MfG

Das würde erklären warum der NTP Request bei mir manchmal für 10 Sekunde keine Antwort mehr liefert.
(Aber danach läuft es wieder)

Danke, dann werde ich da wohl eine andere Lösung finden müssen :slight_smile:

Also wenn man google dazu befragt kommt die Antwort
der ESP8266 hat keine RTC. Er hat aber RTC-RAM Das finde ich lustig das da "RTC"-RAM da ist
aber keine RTC-Funktionalität oder liegt da google falsch?

Ich hätte das RAM dann irgendwie anders genannt. Aber ich bin ja nicht der Chef vom Hersteller espressif.

Ich bin gerade dabei testweise das RTC-RAM zu lesen/ zu schreiben. Funktioniert auch

Der ESP32 hat eine RTC und die läuft auch ziemlich genau. EInmal mit NTP synchronisieren und dann läuft die
selbst dann wenn man den ESP32 in den deepsleep-mode schickt.

viele Grüße Stefan

Tobsi15:
Das würde erklären warum der NTP Request bei mir manchmal für 10 Sekunde keine Antwort mehr liefert.
(Aber danach läuft es wieder)

Danke, dann werde ich da wohl eine andere Lösung finden müssen :slight_smile:

Wie oben schon geschrieben ESP32 hat eine RTC. Oder du nimmst eine Software-RTC.
Da gibt es eine Library im library-Manager
hier der wesentliche code für eine ultra.simpel software RTC

boolean TimePeriodIsOver (unsigned long &expireTime, unsigned long TimePeriod) {
  unsigned long currentMillis  = millis();
  if ( currentMillis - expireTime >= TimePeriod )
  {
    expireTime = currentMillis; // set new expireTime
    return true;                // more time than TimePeriod) has elapsed since last time if-condition was true
  } 
  else return false;            // not expired
}


unsigned long RTC_Timer  = 0;

int RTC_Hour   = 0;
int RTC_Minute = 0;
int RTC_Second = 0;
int RTC_10nth_Seconds = 0;


void Manage_RTC_Timer() {
  
  if ( TimePeriodIsOver(RTC_Timer,100) ) {
    RTC_10nth_Seconds ++;
    if (RTC_10nth_Seconds == 10) {
      RTC_10nth_Seconds = 0;    
      RTC_Second++;
      if (RTC_Second == 60) {
        RTC_Minute++;
        RTC_Second = 0;
      }
    }
    
    if (RTC_Minute == 60) {
      RTC_Hour++;
      RTC_Minute = 0;  
    }
  
    if (RTC_Hour == 24) {
      RTC_Hour = 0;
    }      
  }
}

man ruft dann in der loop Manage_RTC_Timer() auf.

Vielleicht kann ja jemand mein Beispiel so erweitern das das als cooperative task läuft
viele Grüße Stefan

StefanL38:
Also wenn man google dazu befragt kommt die Antwort
der ESP8266 hat keine RTC. Er hat aber RTC-RAM Das finde ich lustig das da "RTC"-RAM da ist
aber keine RTC-Funktionalität oder liegt da google falsch?

Ich hätte das RAM dann irgendwie anders genannt. Aber ich bin ja nicht der Chef vom Hersteller espressif.

Ich bin gerade dabei testweise das RTC-RAM zu lesen/ zu schreiben. Funktioniert auch

Der ESP32 hat eine RTC und die läuft auch ziemlich genau. EInmal mit NTP synchronisieren und dann läuft die
selbst dann wenn man den ESP32 in den deepsleep-mode schickt.

viele Grüße Stefan

Jap das mit dem RTC RAM klingt schon seltsam :smiley:

Und das mit der Software RTC hatte ich auch schon im Hinterkopf, wollte das aber als letzten Ausweg nehmen.
Ich denke, dann werden ich morgen einen Hybrid aus Stündlicher NTP Abfrage und Software RTC umsetzen, vielen Dank für deine Antwort und das Beipiel :slight_smile:

Schönen abend dir.

Hi

SO ungenau läuft auch der schlechteste NE555 nicht - man muß 'nur' die eigene Laufzeit 'ein-norden'.
Du fragst also die aktuelle Zeit beim NTP ab, bekommst Antwort, fragst millis() ab (ESP??) und merkst Dir, daß zu dieser millis()-Zahl diese Uhrzeit passte.
Die nächste Stunde gibst Du die Uhrzeit anhand Start-Uhrzeit und der vergangenen millis() zurück.
Nun holst Du erneut die aktuelle Uhrzeit.
Jetzt kannst Du errechnen, wie falsch Dein millis() war - Korrektur-Faktor bestimmen, etwas 'in die Zukunft schauend' anpassen - also nicht auf 100% errechneten Wert - vll. 97%.
Ab jetzt hast Du einen Faktor, mit Dem Du millis() verrechnest, bevor Du Das mit der letzten korrekten Uhrzeit verrechnet zurück gibst.
In einer Stunde bekommst Du die nächste 'genaue Uhrzeit' und passt Deinen Korrektur-Faktor an.

Ganz so kompliziert macht's meine LED-Uhr nun nicht, aber die ganzen WS2812B fordern Ihren Tribut - bei meiner Uhr ist eine Sekunde 700(batsch) millis() lang.
In diesen 700 millis() muß ich also meine Sekunden-Animation fertig bekommen, da 'dann irgendwann' das Signal der RTC (Sekunden-Impuls) kommt, um die korrekte Uhrzeit anzuzeigen.
Diese 700 ergeben Sich erst während der Laufzeit.

Bei mir lasse ich also die Animation so ablaufen, daß alle Schritte nach 700 millis() fertig sind.
Knapp danach kommt das Signal und die Animation beginnt von Vorne.
In der ersten Sekunde klappt Das - Wer hätte Das gedacht - nicht so ganz - da hier meine Animation noch von 1000 millis() pro Sekunde ausgeht - wird aber recht schnell korrigiert.
Spätestens nach einer Minute werden alle Fehl-Pixel gelöscht (Animation und Setzen der Zeiger).

MfG

Auch im Esp8266 tickt es so vor sich hin!

NTP Abfrage einmal täglich reicht völlig aus, ausser du betreibst deinen Esp8266 im Kühlschrank.

Beispiel

Beispiel

Beispiel

Gruß Fips