#include "ntp.h" #include #include #include #include "esp_attr.h" #include "esp_event.h" #include "esp_log.h" #include "esp_netif_sntp.h" #include "esp_sleep.h" #include "esp_sntp.h" #include "esp_system.h" #include "lwip/ip_addr.h" #include "nvs_flash.h" #include "sdkconfig.h" static const char* TAG = "NTP"; void obtain_time(void) { ESP_LOGI(TAG, "Initializing SNTP"); esp_sntp_config_t config = ESP_NETIF_SNTP_DEFAULT_CONFIG(CONFIG_SNTP_TIME_SERVER); config.start = false; config.server_from_dhcp = true; config.renew_servers_after_new_IP = true; config.index_of_first_server = 1; config.ip_event_to_renew = IP_EVENT_STA_GOT_IP; esp_netif_sntp_init(&config); ESP_LOGI(TAG, "Starting SNTP"); esp_netif_sntp_start(); // wait for time to be set time_t now = 0; struct tm timeinfo = {0}; int retry = 0; const int retry_count = 15; while (esp_netif_sntp_sync_wait(2000 / portTICK_PERIOD_MS) == ESP_ERR_TIMEOUT && ++retry < retry_count) { ESP_LOGI(TAG, "Waiting for system time to be set... (%d/%d)", retry, retry_count); } time(&now); localtime_r(&now, &timeinfo); esp_netif_sntp_deinit(); } esp_err_t init_ntp(void) { time_t now; struct tm timeinfo; time(&now); localtime_r(&now, &timeinfo); if (timeinfo.tm_year < (2016 - 1900)) { ESP_LOGI( TAG, "Time is not set yet. Connecting to WiFi and getting time over NTP."); obtain_time(); } char strftime_buf[64]; // Set timezone to Eastern Standard Time and print local time setenv("TZ", "CET-1CEST,M3.5.0,M10.5.0/3", 1); tzset(); time(&now); localtime_r(&now, &timeinfo); strftime(strftime_buf, sizeof(strftime_buf), "%c", &timeinfo); ESP_LOGI(TAG, "The current date/time in Berlin/Europe is: %s", strftime_buf); return ESP_OK; }