Für meine Software-Projekte musste ich mit das Thema Uhrzeit aus dem Internet holen und die interne ESP-RTC setzen.
Das alles habe ich hier zusammengetragen, damit es an einer stelle zusammen steht und verständlicher wird.
#include
#include "time.h"
#include
const char* ssid = "FRITZ!Box 7590 GAI-2.4G";
const char* password = "05402309404455660062";
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 3600; // 1 Stunde für MEZ
const int daylightOffset_sec = 3600; // 1 Stunde für Sommerzeit
ESP32Time rtc(0); // 3600 offset in seconds GMT+1
struct tm timeinfo;
TaskHandle_t TaskRTCNTP;
//*********************************************************************
//*********************************************************************
// Initialize WiFi
void initWiFi() {
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi ..");
while (WiFi.status() != WL_CONNECTED) {
Serial.print('.');
delay(1000);
}
String ip_adr = WiFi.localIP().toString();
Serial.println(ip_adr);
}
//*********************************************************************
//*********************************************************************
void TaskClock(void * pvParameters){
Serial.println("Starte TaskChangeDisplay");
//String time;
int NTP_holen =0;
String timeStr="";
for(;;){
//Uhrzeit um 2:10 sychronisieren von NTP
timeStr = rtc.getTime();
Serial.println("Uhrzeit vom ESP32 "+timeStr);
int firstColon = timeStr.indexOf(':');
int secondColon = timeStr.indexOf(':', firstColon + 1);
int hours = timeStr.substring(0, firstColon).toInt();
int minutes = timeStr.substring(firstColon + 1, secondColon).toInt();
int seconds = timeStr.substring(secondColon + 1).toInt();
if (hours==3 && minutes>=10 && NTP_holen==0) {
NTP_holen =1;
if(!getLocalTime(&timeinfo)){
Serial.println("Zeit konnte nicht geholt werden");
NTP_holen=0;// Noch einmal
}
Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
rtc.setTimeStruct(timeinfo); //Set Uhrzeit im ESP32
}
if (hours==4 && NTP_holen==1) {
NTP_holen =0; // Holen wieder anschalten
}
vTaskDelay((60*1000) / portTICK_PERIOD_MS); //Uhrzeit prüfen alle 60 Sec.
}
}
//*********************************************************************
//*********************************************************************
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
initWiFi();
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
if(!getLocalTime(&timeinfo)){
Serial.println("Zeit konnte nicht geholt werden");
return;
}
Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
rtc.setTimeStruct(timeinfo);
xTaskCreatePinnedToCore(
TaskClock, /* Funktion */
"ClockTask", /* Name */
10000, /* Stackgröße */
NULL, /* Parameter */
2, /* Priorität */
&TaskRTCNTP, /* Task-Handle */
0); /* Kern 0 */
}
//*********************************************************************
//*********************************************************************
void loop() {
Serial.println("Uhrzeit-Anzeige: "+ rtc.getTime());
delay(70000);
}


