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 <WiFi.h>
#include "time.h"
#include <ESP32Time.h>

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);

}

				
			

Verwandte Beiträge

Markise am Haus

Markisenregelung

Unsere Markise hat nun eine Steuerung bekommen Wir besitzen eine funkgesteuerte Markise, die aber keine wetterabhängige Regelung besitzt.Darum habe ich mit dem ESP32S3 eine Regelung

Weiterlesen »
Steckdosen-Box

Steckdosen mit Timer

Die Idee ist, Steckdosen mit Timer extern steuern zu können. Dafür wurde ein ESP32-S3 und eine Echtzeituhr DS3231 mit I2C Interface genutzt. Ein 4×20 LCD-Display

Weiterlesen »

Kommentar