ESP32入门基础之SNTP时间显示

Posted while(1)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ESP32入门基础之SNTP时间显示相关的知识,希望对你有一定的参考价值。

文章目录

1 实验简介

  1. 在esp-idf合集下就有该该工程,目录如下Espressif\\frameworks\\esp-idf-v4.4.2\\examples\\protocols\\sntp。
  2. 在此工程直接编译烧录即可。

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时间显示的主要内容,如果未能解决你的问题,请参考以下文章

ESP32基础项目之资讯显示(更新中)

ESP32基础项目之资讯显示(更新中)

ESP32学习笔记(41)——SNTP接口使用

ESP32入门基础之资源管理

ESP32入门基础之资源管理

ESP32入门基础之ESP WebSocket Client