Hi zusammen,
mit dem folgenden Sketch möchte ich erreichen, dass ich dauerhaft (ohne externes RTC-Modul) eine nahezu perfekte Uhrzeit aufrechterhalte, d.h. auch wenn das WLAN mal zwischendurch abgeschaltet wird.
#include <WiFi.h>
#include <ESP32Time.h>
#include <time.h>
ESP32Time rtc; // Realtime-Clock
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 3600;
const int daylightOffset_sec = 3600;
unsigned long nextUpdate = 20000;
unsigned long millisMerker = 0;
unsigned long connTimer = 0;
unsigned long connDauer = 5000;
boolean timeSet = false;
boolean online = false;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
// NTP-Uhrzeit initialisierung
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
}
void loop() {
if (millis() - millisMerker > nextUpdate) { // Alle 20 Sekunden Uhrzeit abgleichen
if (WiFi.status() != WL_CONNECTED) {
Serial.println("Neuer Verbindungsversuch:");
connTimer = millis();
WiFi.mode(WIFI_STA);
WiFi.disconnect();
WiFi.begin("MeineSSID", "meinPasswort");
while (WiFi.status() != WL_CONNECTED && (millis() - connTimer < connDauer)) {
Serial.print(".");
delay(500);
}
}
if (WiFi.status() == WL_CONNECTED) {
timeupdate_online();
online=true;
} else {
online=false;
}
millisMerker = millis();
}
if (timeSet) { // Prüfen, ob es überhaupt schon eine Uhrzeit gibt (egal ob On- oder Offline)
if (online) { // Falls der letzte Online-Uhrzeitabgleich geklappt hat....
Serial.println("Online:" + rtc.getTime("%A, %B %d %Y %H:%M:%S")); // (String) returns time with specified format
} else { // Ansonsten kennzeichnen, dass die ESP RTC-Clock gerade "Offline" läuft
Serial.println("Offline:" + rtc.getTime("%A, %B %d %Y %H:%M:%S")); // (String) returns time with specified format
}
} else {
Serial.println("Uhrzeit wurde noch nicht gesetzt!");
}
delay(1000); // Delay nur für dieses Beispiel...geht natürlich auch über millis();
}
void timeupdate_online() {
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
Serial.print("Zeit konnte nicht online abgerufen werden");
return;
}
uint16_t currentYear = timeinfo.tm_year+1900;
if ((int)currentYear > 1970) {
Serial.println("Uhrzeitableich Online erfolgt mit:");
Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
rtc.setTimeStruct(timeinfo);
timeSet=true;
online=true;
} else {
Serial.print("Kein Online-Abgleich...");
}
}
Da sollte doch soweit prinzipiell in Ordnung sein, oder?
Das "Delay" und die Seriellen Ausgaben sind natürlich erstmal nur für mich.
Auch die timeSet / online -booleans sind nur zu Debug-Zwecken drin.
Was ich nicht schnalle und Grund dieses Posts ist:
Ab und an passiert es, dass auf einmal die Uhrzeit nicht mehr stimmt (manchmal sogar um eine Stunde nach geht).
Kann das evtl. an der verwendeten Library "time.h" liegen? Beim googeln bin ich schon desöfteren über eine ander Library (NTPTime.h) gestolpert. Wäre die besser / "Stabiler"?
Und welcher Zeitserver ist der beste?
Danke schon mal für eure Tipps.
LG