ESP32入门基础之SNTP时间显示
Posted while(1)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ESP32入门基础之SNTP时间显示相关的知识,希望对你有一定的参考价值。
文章目录
1 实验简介
- 在esp-idf合集下就有该该工程,目录如下Espressif\\frameworks\\esp-idf-v4.4.2\\examples\\protocols\\sntp。
- 在此工程直接编译烧录即可。
2 实验分析
程序分析如下,注意以下程序经过增删改
#include <string.h>
#include <time.h>
#include <sys/time.h>
#include "esp_system.h"
#include "esp_event.h"
#include "esp_log.h"
#include "esp_attr.h"
#include "esp_sleep.h"
#include "nvs_flash.h"
#include "esp_sntp.h"
// struct tm
//
// int tm_sec; //秒钟
// int tm_min; //分钟
// int tm_hour; //小时
// int tm_mday; //日期:日,从1开始
// int tm_mon; //日期:月,从0开始
// int tm_year; //年,距离1900年的差值,默认是70
// int tm_wday; //星期,1对应星期一
// int tm_yday; //一年的过去的天数
// int tm_isdst; //是否为夏时制
// #ifdef __TM_GMTOFF
// long __TM_GMTOFF;
// #endif
// #ifdef __TM_ZONE
// const char *__TM_ZONE;
// #endif
// ;
static const char *TAG = "user_sntp.c";
static void obtain_time(void);
static void initialize_sntp(void);
void time_sync_notification_cb(struct timeval *tv)
ESP_LOGI(TAG, "Notification of a time synchronization event");
void user_sntp_init(void)
char strftime_buf[64];
time_t now;
struct tm timeinfo;
time(&now); //获取网络时间, 64bit的秒计数
localtime_r(&now, &timeinfo); //转换成具体的时间参数
// Is time set? If not, tm_year will be (1970 - 1900).
if (timeinfo.tm_year < (2025 - 1900))
ESP_LOGI(TAG, "Time is not set yet. Connecting to WiFi and getting time over NTP.");
obtain_time();
// update 'now' variable with current time
time(&now);
// Set timezone to China Standard Time
setenv("TZ", "CST-8", 1);
tzset();
localtime_r(&now, &timeinfo);
strftime(strftime_buf, sizeof(strftime_buf), "%c", &timeinfo);
ESP_LOGI(TAG, "The current date/time in Shanghai is: %s", strftime_buf);
while(1)
time(&now);
localtime_r(&now, &timeinfo);
ESP_LOGI(TAG, "timeinfo.tm_isdst: %d", timeinfo.tm_isdst);
ESP_LOGI(TAG, "timeinfo.tm_yday: %d", timeinfo.tm_yday);
ESP_LOGI(TAG, "timeinfo.tm_wday: %d", timeinfo.tm_wday);
ESP_LOGI(TAG, "timeinfo.tm_year: %d", timeinfo.tm_year+1900);
ESP_LOGI(TAG, "timeinfo.tm_mon: %d", timeinfo.tm_mon+1);
ESP_LOGI(TAG, "timeinfo.tm_mday: %d", timeinfo.tm_mday);
ESP_LOGI(TAG, "timeinfo.tm_hour: %d", timeinfo.tm_hour);
ESP_LOGI(TAG, "timeinfo.tm_min: %d", timeinfo.tm_min);
ESP_LOGI(TAG, "timeinfo.tm_sec: %d", timeinfo.tm_sec);
strftime(strftime_buf, sizeof(strftime_buf), "%c", &timeinfo);
ESP_LOGI(TAG, "The current date/time in Shanghai is: %s", strftime_buf);
vTaskDelay(1000 / portTICK_PERIOD_MS);
static void obtain_time(void)
/**
* NTP server address could be aquired via DHCP,
* see LWIP_DHCP_GET_NTP_SRV menuconfig option
*/
#ifdef LWIP_DHCP_GET_NTP_SRV
sntp_servermode_dhcp(1);
#endif
initialize_sntp();
// wait for time to be set
time_t now = 0;
struct tm timeinfo = 0 ;
int retry = 0;
const int retry_count = 10;
while (sntp_get_sync_status() == SNTP_SYNC_STATUS_RESET && ++retry < retry_count)
ESP_LOGI(TAG, "Waiting for system time to be set... (%d/%d)", retry, retry_count);
vTaskDelay(2000 / portTICK_PERIOD_MS);
time(&now);
localtime_r(&now, &timeinfo);
static void initialize_sntp(void)
ESP_LOGI(TAG, "Initializing SNTP");
sntp_setoperatingmode(SNTP_OPMODE_POLL);
sntp_setservername(0, "pool.ntp.org");
sntp_set_time_sync_notification_cb(time_sync_notification_cb);
sntp_init();
以上是关于ESP32入门基础之SNTP时间显示的主要内容,如果未能解决你的问题,请参考以下文章