0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ESP8266调用NTP服务器进行时间校准

DS小龙哥-嵌入式威廉希尔官方网站 来源:DS小龙哥-嵌入式威廉希尔官方网站 作者:DS小龙哥-嵌入式技 2023-05-04 16:29 次阅读

一、背景知识

【1】什么是NTP服务器?

NTP是网络时间协议(Network Time Protocol,简称NTP),是一种用于同步计算机时间的协议。NTP服务器指的是提供NTP服务的计算机或设备。NTP服务器的主要功能是保证网络上的所有设备的时间同步,以确保各个设备相互之间的时间协调一致。NTP服务器通常连接到具有高度精确时间源的设备,例如:GPS接收器或原子钟,以确保提供准确如一的时间。网络上的计算机可以通过连接到NTP服务器来同步其时间,并确保它们在同一时刻进行操作。

目前有许多可以使用的NTP服务器,以下是一些常用的NTP服务器列表:

1. cn.ntp.org.cn
2. ntp.sjtu.edu.cn
3. ntp.linux.org.cn
4. time.nist.gov.cn
5. ntp.aliyun.com
6. ntp.api.bz
7. ntp1.aliyun.com
8. time1.cloud.tencent.com
9. pool.ntp.org.cn

【2】RTC实时时钟是什么?

RTC (Real-Time Clock)实时时钟,是指一种专门用于记忆日期、时间的计时芯片或模块。一般包括一个时钟芯片、一块石英晶体、一块温度补偿电路、电源管理电路等组成。RTC可以精确地记录日期和时间,即使是在断电等异常情况下,也能保持记录的时间长达数年。常常用于嵌入式系统、数据采集设备等领域,是一种至关重要的设备。在某些系统应用中,RTC也会成为其他设备的时钟源,如单片机微控制器单位等。

RTC的时间精度通常为ppm 级别,即每百万分之一,能够满足大多数实时应用场景的要求。为了提高RTC的稳定度和精度,许多RTC都带有自动校正功能,可以自动从外部时钟源或NTP服务器中获取准确的时间,并进行校正。同时,许多RTC还会集成电源管理功能,支持低功耗模式以延长电池寿命。

二、ESP8266获取网络时间

要通过ESP8266联网并获取网络时间,需要执行以下步骤:

  1. STM32F103ZET6上配置UART串口以与ESP8266进行通信
  2. 使用AT指令将ESP8266连接到Wi-Fi网络。可以使用以下指令:
AT+CWJAP="SSID","password"

其中,替换 "SSID" 为自己的Wi-Fi网络名称,"password" 是Wi-Fi密码。

  1. 使用AT指令连接到NTP服务器并获取时间。您可以使用以下指令:
AT+CIPSNTPCFG=0,1,"pool.ntp.org"
AT+CIPSNTPTIME?

这将连接到ntp服务器并检索当前的UTC时间。

  1. 将ESP8266返回的UTC时间转换为本地时间。您需要知道您所在的时区,并对UTC进行适当的调整。
  2. 将本地时间设置为STM32F103ZET6上的RTC实时时钟。

下面是一个示例代码

#include 
#include "stm32f10x.h"
​
// UART配置
void uart_init() {
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
​
  USART_InitTypeDef USART_InitStructure;
  USART_InitStructure.USART_BaudRate = 115200;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  USART_Init(USART1, &USART_InitStructure);
​
  USART_Cmd(USART1, ENABLE);
}
​
// 发送AT指令并等待响应
int send_at_command(char* command, char* response, uint32_t timeout) {
 // 发送命令
 USART_SendData(USART1, (uint8_t*)command, strlen(command));
 
 // 等待响应
 uint32_t start_time = HAL_GetTick();
 while ((HAL_GetTick() - start_time) < timeout) {
     if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET) {
       char c = USART_ReceiveData(USART1);
       
       // 检查是否收到了预期的响应
       if (strstr(response, c) != NULL) {
         return 0; // 成功
       }
     }
   }
   
   return -1; // 超时或没有收到预期的响应
 }
 ​
 // 连接ESP8266到Wi-Fi
 void connect_to_wifi() {
   char command[50];
   char response[100];
   
   // 设置Wi-Fi SSID和密码
   sprintf(command, "AT+CWJAP="%s","%s"rn", "YourSSID", "YourPassword");
   send_at_command(command, "OK", 5000);
 }
 ​
 // 连接到NTP服务器并获取时间
 int get_ntp_time(uint32_t* time) {
   char response[100];
   
   // 配置SNTP客户端
   send_at_command("AT+CIPSNTPCFG=0,1,"pool.ntp.org"rn", "OK", 5000);
   
   // 获取时间
   send_at_command("AT+CIPSNTPTIME?rn", response, 5000);
   
   // 解析响应并提取时间戳
   char* token = strtok(response, ",");
   uint32_t timestamp = atoi(token);
   *time = timestamp - 2208988800UL; // 转换为Unix时间戳
   
   return 0;
 }
 ​
 // 将时间设置到RTC
 void set_rtc_time(uint32_t time) {
   // 启用PWR和BKP外设时钟
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
   
   // 解锁备份寄存器区域
   PWR_BackupAccessCmd(ENABLE);
   
   // 配置RTC
   RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128); // RTC时钟源为HSE/128
   RCC_RTCCLKCmd(ENABLE); // 启用RTC时钟
   
   RTC_InitTypeDef RTC_InitStructure;
   // 配置RTC时钟 
     RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24; RTC_InitStructure.RTC_AsynchPrediv = 127; 
     RTC_InitStructure.RTC_SynchPrediv = 255; 
     RTC_Init(&RTC_InitStructure);
 ​
 // 设置RTC时间 
     RTC_TimeTypeDef RTC_TimeStruct; 
     RTC_DateTypeDef RTC_DateStruct;
 ​
 // 将Unix时间戳转换为RTC时间和日期 
   uint32_t days = time / 86400; 
     uint32_t seconds = time % 86400; 
     uint32_t hours = seconds / 3600; 
     uint32_t minutes = (seconds % 3600) / 60; 
     uint32_t secs = (seconds % 3600) % 60; 
     uint32_t year = 1970; 
     uint32_t month = 1; 
     while (days > 365) { if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { days -= 366; } else { days -= 365; } year++; } 
  while (days > 0) { if (month == 2) 
   { if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { if (days > 29) { days -= 29; } else { break; } } else { if (days > 28) { days -= 28; } else { break; } } } else if (month == 4 || month == 6 || month == 9 || month == 11) { if (days > 30) { days -= 30; } else { break; } } else { if (days > 31) { days -= 31; } else { break; } } month++; if (month > 12) { month = 1; year++; } }
​
RTC_TimeStruct.RTC_Hours = hours; RTC_TimeStruct.RTC_Minutes = minutes; RTC_TimeStruct.RTC_Seconds = secs; RTC_DateStruct.RTC_Date = days; RTC_DateStruct.RTC_Month = month; RTC_DateStruct.RTC_Year = year - 2000;
​
// 设置RTC时间和日期 
  RTC_SetTime(RTC_Format_BIN, &RTC_TimeStruct); 
  RTC_SetDate(RTC_Format_BIN, &RTC_DateStruct); }
​
int main() 
{ 
  // 初始化UART串口 
  uart_init();
​
  // 连接ESP8266到Wi-Fi
  connect_to_wifi();
​
// 获取NTP时间 
  uint32_t ntp_time; get_ntp_time(&ntp_time);
​
// 将时间设置到
  RTC set_rtc_time(ntp_time);
​
while (1) { // 做其他的事情... } }
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6035

    文章

    44553

    浏览量

    634753
  • 接收器
    +关注

    关注

    14

    文章

    2468

    浏览量

    71879
  • 服务器
    +关注

    关注

    12

    文章

    9129

    浏览量

    85344
  • NTP
    NTP
    +关注

    关注

    1

    文章

    169

    浏览量

    13892
  • ESP8266
    +关注

    关注

    50

    文章

    962

    浏览量

    44970
收藏 人收藏

    评论

    相关推荐

    使用EsP8266(NodeMCU)连接阿里云服务器

      使用EsP8266(NodeMCU)连接阿里云服务器,并在服务器控制台点亮板载LED灯,进行数据上传和下传的测试。创建阿里云产品功能定义:先选择编辑草稿,才可以看到最下面的布尔值那
    发表于 11-24 06:23

    求解关于AT ESP8266 无法实现NTP时间同步的问题?

    有影响。另外PING3个NTP服务器都能够正常通信,应该说通信已经建立,分析应该是AT SOCKET部分问题,但是目前水平有限,折腾多半天,没有任何进展,项目时间紧,希望高手们能多多帮助。谢谢!
    发表于 03-15 14:36

    有人知道使用GPS/RTC模块作为时间源的ESP8266 NTP服务器吗?

    有人知道使用 GPS/RTC 模块作为时间源的 ESP8266 NTP 服务器吗?我有一个 WiFi 项目,我想在其中联网很多 ESP 板。
    发表于 02-24 07:48

    如何使用Lua脚本语言进行ESP8266和TCP服务器多连接

    本文档的主要内容详细介绍的是如何使用Lua脚本语言进行ESP8266和TCP服务器多连接。
    发表于 06-10 17:48 2次下载
    如何使用Lua脚本语言<b class='flag-5'>进行</b><b class='flag-5'>ESP8266</b>和TCP<b class='flag-5'>服务器</b>多连接

    Esp8266(NodeMCU)连接阿里云服务器

      使用EsP8266(NodeMCU)连接阿里云服务器,并在服务器控制台点亮板载LED灯,进行数据上传和下传的测试。创建阿里云产品功能定义:先选择编辑草稿,才可以看到最下面的布尔值那
    发表于 11-16 10:21 18次下载
    <b class='flag-5'>Esp8266</b>(NodeMCU)连接阿里云<b class='flag-5'>服务器</b>

    调用Lua新建的WEB服务器 操作Nodemcu esp8266 控制继电器实现物联网

    调用Lua新建的WEB服务器 操作Nodemcu esp8266 控制继电器实现物联网
    发表于 12-08 16:51 13次下载
    <b class='flag-5'>调用</b>Lua新建的WEB<b class='flag-5'>服务器</b>  操作Nodemcu <b class='flag-5'>esp8266</b> 控制继电器实现物联网

    最简单DIY基于ESP8266的物联网智能小车②(webserver服务器网页高级遥控版)

    ESP8266ESP32物联网智能小车开发系列文章目录第一篇:最简单DIY基于ESP8266的物联网智能小车①(webserver服务器网页简单遥控版)第二篇:最简单DIY基于
    发表于 12-29 18:58 0次下载
    最简单DIY基于<b class='flag-5'>ESP8266</b>的物联网智能小车②(webserver<b class='flag-5'>服务器</b>网页高级遥控版)

    如何利用ESP8266实现智能手表的设计

    这是一款简单的ESP8266手表,具有多个位置的 WiFi 连接、NTP 时间服务器同步和比较功能。
    的头像 发表于 04-01 15:29 3302次阅读
    如何利用<b class='flag-5'>ESP8266</b>实现智能手表的设计

    如何使用ESP8266制作可配置的Web服务器

    在这个项目中,我们首先研究如何在 Arduino IDE 中安装 ESP8266 插件,然后使用 ESP8266 制作可配置的 Web 服务器
    的头像 发表于 05-10 15:18 1.3w次阅读
    如何使用<b class='flag-5'>ESP8266</b>制作可配置的Web<b class='flag-5'>服务器</b>

    使用ESP8266NTP服务器获取时间并在OLED显示上显示

    在本教程中,我们将使用 ESP8266 NodeMCU 从 NTP 服务器获取当前时间和日期,并将其显示在 OLED 显示屏上。
    的头像 发表于 09-01 16:09 1.9w次阅读
    使用<b class='flag-5'>ESP8266</b>从<b class='flag-5'>NTP</b><b class='flag-5'>服务器</b>获取<b class='flag-5'>时间</b>并在OLED显示<b class='flag-5'>器</b>上显示

    基于ESP8266NTP时钟

    电子发烧友网站提供《基于ESP8266NTP时钟.zip》资料免费下载
    发表于 11-11 10:06 5次下载
    基于<b class='flag-5'>ESP8266</b>的<b class='flag-5'>NTP</b>时钟

    NodeMCU ESP8266启用AJAX的Web服务器

    电子发烧友网站提供《NodeMCU ESP8266启用AJAX的Web服务器.zip》资料免费下载
    发表于 11-22 09:37 1次下载
    NodeMCU <b class='flag-5'>ESP8266</b>启用AJAX的Web<b class='flag-5'>服务器</b>

    基于ESP8266的Web服务器

    项目将告诉你如何在不使用 Arduino 的情况下使用 ESP8266 构建 Web 服务器
    发表于 12-07 11:02 1次下载

    基于ESP8266实现串口服务器

    ESP8266工作在TCP服务器模式时,可以借助IOTGATEWAY很轻松地将传统设备接入物联网,实现多设备实时监控
    的头像 发表于 05-17 15:55 3176次阅读
    基于<b class='flag-5'>ESP8266</b>实现串口<b class='flag-5'>服务器</b>

    使用ESP8266 OLED和Visuino从NIST TIME服务器获取日期和时间

    电子发烧友网站提供《使用ESP8266 OLED和Visuino从NIST TIME服务器获取日期和时间.zip》资料免费下载
    发表于 06-28 09:55 0次下载
    使用<b class='flag-5'>ESP8266</b> OLED和Visuino从NIST TIME<b class='flag-5'>服务器</b>获取日期和<b class='flag-5'>时间</b>