目录

前言

user_init

IP定时的回调函数

初始化SNTP

SNTP定时回调函数


前言

介绍了8266如何获取网络时间

user_init

首先将8266设置为sta模式

void ICACHE_FLASH_ATTR user_init(void)
{uart_init(115200,115200);  // 初始化串口波特率os_delay_us(10000);          // 等待串口稳定os_printf("\r\n=================================================\r\n");os_printf("\t Project:\t%s\r\n", ProjectName);os_printf("\t SDK version:\t%s", system_get_sdk_version());os_printf("\r\n=================================================\r\n");// OLED显示初始化//----------------------------------------------------------------OLED_Init();                                // OLED初始化OLED_ShowString(0,0,"                ");    // Internet TimeOLED_ShowString(0,2,"Clock =         "); // Clock:时钟OLED_ShowString(0,4,"Temp  =         ");   // Temperature:温度OLED_ShowString(0,6,"Humid =         "); // Humidity:湿度//----------------------------------------------------------------LED_Init_JX();       // LED初始化ESP8266_STA_Init_JX();         // ESP8266_STA初始化OS_Timer_IP_Init_JX(1000,1);   // 1秒重复定时(获取IP地址)
}

IP定时的回调函数

如果成功获取到ip地址,那么调用ESP8266_SNTP_Init_JX();   来初始化SNTP

// IP定时的回调函数
//=========================================================================================================
void ICACHE_FLASH_ATTR OS_Timer_IP_cb(void)
{u8 C_LED_Flash = 0;               // LED闪烁计次struct ip_info ST_ESP8266_IP; // ESP8266的IP信息u8 ESP8266_IP[4];                // ESP8266的IP地址// 成功接入WIFI【STA模式下,如果开启DHCP(默认),则ESO8266的IP地址由WIFI路由器自动分配】//-------------------------------------------------------------------------------------if( wifi_station_get_connect_status() == STATION_GOT_IP )   // 判断是否获取IP{wifi_get_ip_info(STATION_IF,&ST_ESP8266_IP);    // 获取STA的IP信息ESP8266_IP[0] = ST_ESP8266_IP.ip.addr;            // IP地址高八位 == addr低八位ESP8266_IP[1] = ST_ESP8266_IP.ip.addr>>8;     // IP地址次高八位 == addr次低八位ESP8266_IP[2] = ST_ESP8266_IP.ip.addr>>16;      // IP地址次低八位 == addr次高八位ESP8266_IP[3] = ST_ESP8266_IP.ip.addr>>24;      // IP地址低八位 == addr高八位// 显示ESP8266的IP地址//------------------------------------------------------------------------------------------------//os_printf("\nESP8266_IP = %d.%d.%d.%d\n",ESP8266_IP[0],ESP8266_IP[1],ESP8266_IP[2],ESP8266_IP[3]);//OLED_ShowIP(24,2,ESP8266_IP);    // OLED显示ESP8266的IP地址//------------------------------------------------------------------------------------------------// 接入WIFI成功后,LED快闪3次//----------------------------------------------------for(; C_LED_Flash<=5; C_LED_Flash++){GPIO_OUTPUT_SET(GPIO_ID_PIN(4),(C_LED_Flash%2));delay_ms(100);}os_timer_disarm(&OS_Timer_IP);    // 关闭定时器ESP8266_SNTP_Init_JX();         // 初始化SNTP}
}

初始化SNTP

8266最多支持设置三个SNTP服务器,其中SNTP0是主服务器,剩下的两个是备用服务器

我们可以调用这两个API来设置SNTP服务器,参数一是SNTP服务器的优先级

sntp_setservername(0, "us.pool.ntp.org");    // 服务器_0【域名】 参数二是SNTP的域名
sntp_setserver(2, addr);                    // 服务器_2【IP地址】参数二是SNTP服务器的32位二进制IP地址

所以说在使用sntp_setserver(2, addr);之前要先用ipaddr_aton("210.72.145.44", addr); 来将点分十进制字符串形式ip地址转化成32位的二进制ip地址,作为sntp_setserver(2, addr);的参数

之后调用sntp_init();  SNTP初始化API

再设置OS_Timer_SNTP_Init_JX(1000,1);  1秒重复定时(SNTP)

// 初始化SNTP
//=============================================================================
void ICACHE_FLASH_ATTR ESP8266_SNTP_Init_JX(void)
{ip_addr_t * addr = (ip_addr_t *)os_zalloc(sizeof(ip_addr_t));sntp_setservername(0, "us.pool.ntp.org");  // 服务器_0【域名】sntp_setservername(1, "ntp.sjtu.edu.cn"); // 服务器_1【域名】ipaddr_aton("210.72.145.44", addr);           // 点分十进制 => 32位二进制sntp_setserver(2, addr);                  // 服务器_2【IP地址】os_free(addr);                                // 释放addrsntp_init();   // SNTP初始化APIOS_Timer_SNTP_Init_JX(1000,1);             // 1秒重复定时(SNTP)
}

SNTP定时回调函数

调用sntp_get_current_timestamp();来查询当前距离基准时间(1970.01.01 00:00:00 GMT+8)的时间戳(单位:秒)  基准时间是1970年1月1号0时0分0秒东8区

如果TimeStamp这个时间戳不等于0,就说明SNTP获取网络时间成功。

调用sntp_get_real_time(TimeStamp);它的参数就是距离基准时间的时间戳,来获取当前的真实时间。

之后串口打印时间戳,串口打印实际时间

根据获取到的时间来将我们所需要的时间,日期,时刻的值用oled显示,并且oled显示读取到的温湿度数据

// SNTP定时回调函数
//===================================================================================================
void ICACHE_FLASH_ATTR OS_Timer_SNTP_cb(void     * arg)
{// 字符串整理 相关变量//------------------------------------------------------u8 C_Str = 0;                // 字符串字节计数char A_Str_Data[20] = {0};   // 【"日期"】字符串数组char *T_A_Str_Data = A_Str_Data;   // 缓存数组指针char A_Str_Clock[10] = {0};   // 【"时间"】字符串数组char * Str_Head_Week;       // 【"星期"】字符串首地址char * Str_Head_Month;     // 【"月份"】字符串首地址char * Str_Head_Day;       // 【"日数"】字符串首地址char * Str_Head_Clock;     // 【"时钟"】字符串首地址char * Str_Head_Year;      // 【"年份"】字符串首地址//------------------------------------------------------uint32 TimeStamp;      // 时间戳char * Str_RealTime;  // 实际时间的字符串// 查询当前距离基准时间(1970.01.01 00:00:00 GMT+8)的时间戳(单位:秒)//-----------------------------------------------------------------TimeStamp = sntp_get_current_timestamp();if(TimeStamp)        // 判断是否获取到偏移时间{//os_timer_disarm(&OS_Timer_SNTP);   // 关闭SNTP定时器// 查询实际时间(GMT+8):东八区(北京时间)//--------------------------------------------Str_RealTime = sntp_get_real_time(TimeStamp);// 【实际时间】字符串 == "周 月 日 时:分:秒 年"//------------------------------------------------------------------------os_printf("\r\n----------------------------------------------------\r\n");os_printf("SNTP_TimeStamp = %d\r\n",TimeStamp);      // 时间戳os_printf("\r\nSNTP_InternetTime = %s",Str_RealTime);  // 实际时间os_printf("--------------------------------------------------------\r\n");// 时间字符串整理,OLED显示【"日期"】、【"时间"】字符串//…………………………………………………………………………………………………………………// 【"年份" + ' '】填入日期数组//---------------------------------------------------------------------------------Str_Head_Year = Str_RealTime; // 设置起始地址while( *Str_Head_Year )        // 找到【"实际时间"】字符串的结束字符'\0'Str_Head_Year ++ ;// 【注:API返回的实际时间字符串,最后还有一个换行符,所以这里 -5】//-----------------------------------------------------------------Str_Head_Year -= 5 ;            // 获取【"年份"】字符串的首地址T_A_Str_Data[4] = ' ' ;os_memcpy(T_A_Str_Data, Str_Head_Year, 4);        // 【"年份" + ' '】填入日期数组T_A_Str_Data += 5;              // 指向【"年份" + ' '】字符串的后面的地址//---------------------------------------------------------------------------------// 获取【日期】字符串的首地址//---------------------------------------------------------------------------------Str_Head_Week  = Str_RealTime;                            // "星期" 字符串的首地址Str_Head_Month = os_strstr(Str_Head_Week, " ") + 1;    // "月份" 字符串的首地址Str_Head_Day   = os_strstr(Str_Head_Month,    " ") + 1;    // "日数" 字符串的首地址Str_Head_Clock = os_strstr(Str_Head_Day,  " ") + 1;    // "时钟" 字符串的首地址// 【"月份" + ' '】填入日期数组//---------------------------------------------------------------------------------C_Str = Str_Head_Day - Str_Head_Month;               // 【"月份" + ' '】的字节数os_memcpy(T_A_Str_Data, Str_Head_Month, C_Str); // 【"月份" + ' '】填入日期数组T_A_Str_Data += C_Str;      // 指向【"月份" + ' '】字符串的后面的地址// 【"日数" + ' '】填入日期数组//---------------------------------------------------------------------------------C_Str = Str_Head_Clock - Str_Head_Day;             // 【"日数" + ' '】的字节数os_memcpy(T_A_Str_Data, Str_Head_Day, C_Str);       // 【"日数" + ' '】填入日期数组T_A_Str_Data += C_Str;      // 指向【"日数" + ' '】字符串的后面的地址// 【"星期" + ' '】填入日期数组//---------------------------------------------------------------------------------C_Str = Str_Head_Month - Str_Head_Week - 1;        // 【"星期"】的字节数os_memcpy(T_A_Str_Data, Str_Head_Week, C_Str);       // 【"星期"】填入日期数组T_A_Str_Data += C_Str;       // 指向【"星期"】字符串的后面的地址// OLED显示【"日期"】、【"时钟"】字符串//---------------------------------------------------------------------------------*T_A_Str_Data = '\0';      // 【"日期"】字符串后面添加'\0'OLED_ShowString(0,0,A_Str_Data);        // OLED显示日期os_memcpy(A_Str_Clock, Str_Head_Clock, 8);       // 【"时钟"】字符串填入时钟数组A_Str_Clock[8] = '\0';OLED_ShowString(64,2,A_Str_Clock);     // OLED显示时间//…………………………………………………………………………………………………………………}// 每5秒,读取/显示温湿度数据//-----------------------------------------------------------------------------------------C_Read_DHT11 ++ ;     // 读取DHT11计时if(C_Read_DHT11>=5)     // 5秒计时{C_Read_DHT11 = 0;  // 计时=0if(DHT11_Read_Data_Complete() == 0)       // 读取DHT11温湿度{DHT11_NUM_Char(); // DHT11数据值转成字符串OLED_ShowString(64,4,DHT11_Data_Char[1]);   // DHT11_Data_Char[0] == 【温度字符串】OLED_ShowString(64,6,DHT11_Data_Char[0]); // DHT11_Data_Char[1] == 【湿度字符串】}else{OLED_ShowString(64,4,"----"); // Temperature:温度OLED_ShowString(64,6,"----"); // Humidity:湿度}}//-----------------------------------------------------------------------------------------
}

可以看到8266已经成功的获取到了距离基准时间的时间戳,并且根据这个时间戳成功的获取了当前的实际时间 Sun Jul 24 19:14:22 2022 跟电脑系统时间是一致的,这就说明8266通过SNTP成功的获取到了网络时间,在olde上秒一直在走,说明它一直在不停地获取准确的网络时间。

ESP8266-----SNTP获取网络时间相关推荐

  1. CUBEMX配置STM32实现FTP文件传输以及使用SNTP获取网络时间并写入RTC

    CUBEMX配置STM32实现FTP文件传输以及使用SNTP获取网络时间并写入RTC 引言 FTP代码库的移植 Cubemx配置SNTP以及RTC RTC配置方法 SNTP配置方法 FATFS载入RT ...

  2. ESP32-C3 ESP-IDF 配置smartconfig 和 sntp 获取网络时间

    ESP32-C3 ESP-IDF 配置smartconfig 和 sntp 获取网络时间 /* Esptouch exampleThis example code is in the Public D ...

  3. stm32 + ESP8266 wifi获取网络时间和天气 stm32天气预报

    大家遇到什么什么题,可以私聊我. 近期由于某些原因,玩了一下stm32+WiFi获取网络天气和网络时间.之前一直觉得这个东西会有点难度,其实,做完了才发现,其实那只是想象中的难而已.现在,将这几天的成 ...

  4. 【STM32训练—WiFi模块】第一篇、STM32驱动ESP8266WiFi模块获取网络时间

    目录 第一部分.写在前面 1.硬件准备 2.相关的AT指令 3.参考博客 第二部分.电脑串口助手调试ESP8266模块获取网络时间 1.ESP8266获取时间的流程 2.具体实现步骤 第三部分.STM ...

  5. esp8266获取网络时间

    esp8266获取网络时间 我们使用的手机都有 "使用网络上的时间,自动调整日期和时间" 的功能.如果我们自己做的电子时钟也有自动调整时间的功能,那就很方便,而且不怕时间不准了. ...

  6. ESP8266+STM32获取网络时间、OLED显示时间图片视频。

    学习过程不易,发文共享以下学习过程~ 先说说我的设计内容的组成: 目录 学习过程不易,发文共享以下学习过程~ 1. STM32控制ESP8266获取网络时间 第一步:电脑控制ESP8266获取时间数据 ...

  7. 获取网络时间并刷新本地时间(源码2)

    因为上次那个获取网络时间失效了(使用的是37端口),获取网络时间并刷新本地时间(源码1) 所以网上又找了一份代码,使用的是123端口,虽然没有测试成功,这里也做下记录,估计是本机环境问题,过两天再进行 ...

  8. 8266获取网络时间

    8266获取网络时间 今天第一次用阿里的博客写点东西感受一下.... sntp.sync("ntp1.aliyun.com",function()print("sync ...

  9. Arduino ESP32 获取网络时间并同步本地RTC时钟

    Arduino ESP32 获取网络时间并同步本地RTC时钟 相关篇<Arduino ESP32 最简单直接获取网络时间方法> 在 ArduinoESP32核心支持库当中已经包含相关的获取 ...

最新文章

  1. 作业盒子完成1.5亿美元D轮融资,更名“小盒科技”
  2. [推荐]SharePoint开发WebCast
  3. php网站404页面302,404页面该怎么做?
  4. Python 进程与线程小随笔
  5. Java和甜蜜的科学
  6. go语言服务器运行,Go语言实现Web服务器
  7. ODBC、OLEDB、ADO的区别和联系
  8. jquery easyui Tab 引入页面的问题
  9. 【李宏毅2020 ML/DL】P83 Generative Adversarial Network | Evaluation
  10. Python IDE: 10个最好用的python集成开发环境(IDE)
  11. Linux 如何打开pyo文件,Python的文件类型
  12. YII2中behavior行为的理解与使用
  13. 【JAVA程序设计】(C00019)javaweb高校社团管理系统
  14. 支持向量积【SVM】
  15. 没想到印度年轻人这么惨!我们知足吧!
  16. 24个基本指标精粹讲解(16)--DMA
  17. 松下P2卡数据恢复-删除/格式化100%完美恢复-解决方案
  18. python八段数码管显示小数点_小数点算法处理(数码管显示)
  19. 阿里云短信api 回执 回复
  20. pytorch学习之如何画损失函数曲线图

热门文章

  1. HTTP Redirect
  2. 伯努利分布和多项分布
  3. 把 SpringBoot 的banner换成了美女,被发现了,老板说工作不饱和,快救救我
  4. 搭建自己的git仓库之简单搭建本地git仓库和远程git仓库~
  5. 论文解读《DeepCPP:一种基于核苷酸偏差信息和最小分布相似性特征选择的用于RNA编码潜力预测的深度神经网络》
  6. 数据倾斜及其解决方式
  7. vue3学习—ReactivityAPI
  8. 学习安装libigl库
  9. 跳一跳j算法ava代码_麻将游戏算法深入解析及实现代码
  10. matlab万有引力模拟,测定“万有引力常量”的模拟实验(二)