Ich möchte die Uhrzeit von meiner Fritzbox holen und die als lokale Uhrzeit verwenden.
Dazu habe den folgenden Code im Netz gefunden, welcher auch grundsätzlich funktioniert.
Üblicherweise holt sich ein Computer die aktuelle Zeit 1 mal, und zählt sie dann mit seiner eigenen Zeitbasis weiter.
Vermutlich kommt die spezielle println() Ausgabe-Konvertierung für timeinfo aus einer C Standardbibliothek, siehe time.h.
Eine globale timeinfo Struktur kann benutzt werden, muß aber vor jeder Benutzung aktualisiert werden - Muster in printLocalTime().
IMO kommt es drauf an, wofür Du die Uhrzeit brauchst. Für Steuerungszwecke reichen die millis(), wenn man sich ggf. dazu den Offset zur aktuellen Uhrzeit merkt - eben einmal beim Systemstart. So läßt sich leichter mit Zeiten rechnen als mit Stunden, Minuten und Sekunden aus timeinfo.
Habe es jetzt so gemacht, kann mal jemand schauen ob das in Ordnung ist. Danke.
#include <WiFi.h>
#include "time.h"
const char* ssid = "ssid";
const char* password = "pass";
const char* ntpServer = "192.168.134.1";
const long gmtOffset_sec = 3600;
const int daylightOffset_sec = 0; //Sommerzeit / Winterzeit (wird aber nicht gebraucht da die Zeit vom ntpServer kommt)
const uint32_t ntpServer_TimerCounter = 60000; //Zeit festlegen in ms, wann die Uhrzeit und das Datum um ntpServer geholt werden soll
uint32_t ntpServer_TimerComparison = 0; //Vergleichswert für den Zähler(Startwert muss 0 sein)
char ntpDate[50]; //Datum
char ntpTime[50]; //Uhrzeit
struct tm timeinfo; //für time.h
void setup()
{
Serial.begin(115200);
Serial.printf("Connecting to %s ", ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" CONNECTED");
ntpServer_TimerComparison = millis() + 50000; //damit die IF Bedinung das erstmal auch WAHR ist
}
void loop()
{
LocalTime(); //Aktuelle Uhrzeit und das Datum holen
Serial.println(ntpDate);
Serial.println(ntpTime);
delay(1000);
}
void LocalTime()
{
//jede Stunde die Uhrzeit und das Datum vom ntpServer holen
if (millis() - ntpServer_TimerComparison >= ntpServer_TimerCounter)
{
Serial.println("Uhrzzeit und Datum wird aktualisiert...");
ntpServer_TimerComparison = millis();
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); //Verbindung zum ntpServer
}
if(!getLocalTime(&timeinfo))
{
Serial.println("Uhrzzeit und Datum konnte nicht aktualisiert werden!");
return;
}
snprintf (ntpTime, 50, "%02d:%02d:%02d", timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec + 1);
snprintf (ntpDate, 50, "%02d.%02d.%0002d (%1d)", timeinfo.tm_mday, timeinfo.tm_mon + 1, timeinfo.tm_year + 1900, timeinfo.tm_wday);
}
Derfips:
Ich hole die Zeit einmal am Tag von der Fritzbox. Das reicht bei Raumtemperatur für eine hohe Genauigkeit.
eigendlich bin ich der Meinung das bei Verwendung von configtime() mit der time.h automatisch eine Syncronisierung mit dem NTP Server stattfindet. die Zeit lässt sich wohl einstellen .
void NTPstart() {
configTime(0, 0, "192.168.178.1"); // locale Fritzbox
setenv("TZ", "CET-1CEST,M3.5.0,M10.5.0/3", 1); // locale Zeit einstellen mit Sommerzeit
Serial.println("Waiting for time");
while (!time(nullptr)) {
Serial.print(".");
delay(1000);
}
}
Das läuft jetz so seit Monaten so und die Zeit stimmt. Probleme scheint es dann zu geben wenn der NTP Server nicht erreichbar ist. Aber bei meiner FritzBox kommt das ehr selten vor. Und wenn dann ist auch das Wlan weg.
ich hoffe es ist okay wenn ich meine Frage hier drunter stelle, wenn es nicht gewünscht ist eröffne ich einen eigenen Thread. Ich nutze bisher die TimeLib.h von Paul Stoffregen, eine Lib für die RTC sowie eine separate für die NTP Abfrage. Zusätzlich prüfe ich die Sommerzeit mit der Funktion von jurs.
Ich hab es jetzt soweit laufen nur mit der Time.h den NTP Abruf zu starten und die Systemzeit zu stellen - inkl Sommerzeit Prüfung.
Auf der verlinkten Seite von Heinz steht in einem Kommentar "/* change system time and/or the update the RTC clock */". Nur leider finde ich gar keine Dokumentation zu der hauseigenen Lib.
Ist es euch bekannt, ob ich mit der Time.h direkt die RTC updaten kann? Es ist in meinem Fall eine DS3231. Über Tipps würde ich mich sehr freuen.
warum willst Du zusätzlich eine RTC verwenden? Kann man sicher machen. Mein Link sollte nur einen Hinweis darauf geben das eine automatische Syncronisierung mit dem NTP Server in bestimmten Zeitabständen stattfindet und wo man das einstellen kann.
Hier mal ein Beispiel das ich so ähnlich häufig findet. Ist nur das Minimum enthalten.
Rentner:
warum willst Du zusätzlich eine RTC verwenden? Kann man sicher machen.
Ich benutze die RTC an meiner WordClock, deshalb wäre es interessant für mich mit der Time.h Lib direkt auch per NTP Abruf die RTC-Zeit zu aktualisieren.
Im Moment ziehe ich 1x im Monat (oder beim Neustart) die NTP Zeit (UTC) und speicher diese auch als UTC Zeit auf der RTC. Die Systemzeit wird alle 15 Minuten von der RTC ausgelesen und entsprechend auf die Lokale Uhrzeit angepasst (inkl. Sommerzeitprüfung). Würde gerne die benötigten Libs ausdünnen - daher kommt mein Interesse :-).
Vielen Dank für Deinen Beispiel-Code ich versuche, dass mal auf meine Bedürfnisse umzubauen.
Sorry an den TO, dass ich meine Frage in deinen Thread gepackt habe!