Hi zusammen,
ich hab mal wieder eine Frage zum Thema "Uhrzeitabgleich mit dem NTP-Server", das treibt mich noch in den Wahnsinn. Nun hat bei meinem ESP drei Wochen lang der Uhrzeit-Abgleich mit dem NTP-Server geklappt und heute stimmte die dann plötzlich nicht mehr.
Ich brings mal auf den Punkt: Wie schaffe ich es, dass eine falsche Uhrzeit innerhalb von Sekunden wieder korrekt aus dem Internet gezogen wird?
Zur Veranschaulichung hab ich mal folgenden Sketch zusammengebaut.
Wenn man den Button drückt, wird die Uhrzeit bewusst verstellt.
Wie schaffe ich es, dass nach dem Drücken des Buttons die Uhrzeit wieder korrigiert wird?
Hier der ganze Sketch:
#include <WiFi.h>
#include <time.h>
#include <WebServer.h>
WebServer server(80);
const char* ssid = "MeineSSID";
const char* password = "MeinPW";
const char* NTP_SERVER = "de.pool.ntp.org";
const char* TZ_INFO = "CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00"; // Time zones (https://remotemonitoringsystems.ca/time-zone-abbreviations.php)
tm timeinfo;
time_t now;
unsigned long millisMerker=0;
uint16_t monthDay = 0;
uint16_t currentMonth = 0;
uint16_t currentYear = 0;
uint16_t currentHour = 0;
uint16_t currentMinute = 0;
uint16_t currentSecond = 0;
// Dummyseite
const char indexPage[] PROGMEM = R"=====(
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
</head>
<body>
<button type="button" onclick="setTime()">Uhrzeit setzen</button>
</body>
<script>
function setTime() {
data="currentHour=5¤tMinute=10¤tSecond=30&monthDay=10¤tMonth=10¤tYear=2022";
var url="/setTime?"+data;
var xmlhttp = new XMLHttpRequest();
xmlhttp.open('GET', url, true);
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4) {
if(xmlhttp.status == 200) {
console.log("Uhrzeit wurde geändert!");
}
}
};
xmlhttp.send(null);
}
</script>
</html>
)=====";
void setup() {
Serial.begin(115200);
// Wifi-Verbindung herstellen
WiFi.begin(ssid, password);
int counter = 0;
while (WiFi.status() != WL_CONNECTED) {
delay(200);
if (++counter > 100) ESP.restart();
Serial.print ( "." );
}
Serial.println("\n\nWiFi connected\n\n");
Serial.println(WiFi.localIP());
// NTP-Server und Zeitzone setzen
configTime(0, 0, NTP_SERVER);
setenv("TZ", TZ_INFO, 1);
server.on("/", display_root);
server.on("/setTime", setTime_man);
server.begin();
}
void setTime_man() {
currentHour = server.arg("currentHour").toInt();
currentMinute = server.arg("currentMinute").toInt();
currentSecond = server.arg("currentSecond").toInt();
monthDay = server.arg("monthDay").toInt();
currentMonth = server.arg("currentMonth").toInt();
currentYear = server.arg("currentYear").toInt();
// Falsche Werte setzen
timeinfo.tm_year = currentYear - 1900;
timeinfo.tm_mon = currentMonth - 1;
timeinfo.tm_mday = monthDay;
timeinfo.tm_hour = currentHour;
timeinfo.tm_min = currentMinute;
timeinfo.tm_sec = currentSecond;
time_t t = mktime(&timeinfo);
struct timeval now = { .tv_sec = t };
settimeofday(&now, NULL);
display_root();
}
void loop() {
server.handleClient();
showTime();
delay(1000);
}
void display_root() {
const char * httpType PROGMEM = "text/html";
server.send_P(200, httpType, indexPage);
}
void showTime() {
time(&now);
localtime_r(&now, &timeinfo);
Serial.print(timeinfo.tm_mday);
Serial.print('.');
Serial.print(timeinfo.tm_mon + 1);
Serial.print('.');
Serial.print(timeinfo.tm_year +1900);
Serial.print(' ');
Serial.print(timeinfo.tm_hour);
Serial.print(':');
Serial.print(timeinfo.tm_min);
Serial.print(':');
Serial.println(timeinfo.tm_sec);
}
Ich war bisher immer der Meinung, dass mit diesen zwei Zeilen hier der Abgleich mit dem Internet sichergestellt ist:
time(&now);
localtime_r(&now, &timeinfo);
Aber soweit ich mitbekommen habe, erfolgt der Abgleich nur alle Stunde mal?
Kann man das beschleunigen? Oder hab ich grundsätzlich den Wurm drin ?
Wobei ich mich an dem Beispiel-Sketch "SimpleTime" des ESP32 gehalten habe.
Danke schon mal für eure Hilfe und frohe Ostern allen!