0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ESP8266調(diào)用NTP服務(wù)器進(jìn)行時(shí)間校準(zhǔn)

DS小龍哥-嵌入式技術(shù) ? 來(lái)源:DS小龍哥-嵌入式技術(shù) ? 作者:DS小龍哥-嵌入式技 ? 2023-05-04 16:29 ? 次閱讀

一、背景知識(shí)

【1】什么是NTP服務(wù)器?

NTP是網(wǎng)絡(luò)時(shí)間協(xié)議(Network Time Protocol,簡(jiǎn)稱NTP),是一種用于同步計(jì)算機(jī)時(shí)間的協(xié)議。NTP服務(wù)器指的是提供NTP服務(wù)的計(jì)算機(jī)或設(shè)備。NTP服務(wù)器的主要功能是保證網(wǎng)絡(luò)上的所有設(shè)備的時(shí)間同步,以確保各個(gè)設(shè)備相互之間的時(shí)間協(xié)調(diào)一致。NTP服務(wù)器通常連接到具有高度精確時(shí)間源的設(shè)備,例如:GPS接收器或原子鐘,以確保提供準(zhǔn)確如一的時(shí)間。網(wǎng)絡(luò)上的計(jì)算機(jī)可以通過(guò)連接到NTP服務(wù)器來(lái)同步其時(shí)間,并確保它們?cè)谕粫r(shí)刻進(jìn)行操作。

目前有許多可以使用的NTP服務(wù)器,以下是一些常用的NTP服務(wù)器列表:

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實(shí)時(shí)時(shí)鐘是什么?

RTC (Real-Time Clock)實(shí)時(shí)時(shí)鐘,是指一種專門用于記憶日期、時(shí)間的計(jì)時(shí)芯片或模塊。一般包括一個(gè)時(shí)鐘芯片、一塊石英晶體、一塊溫度補(bǔ)償電路、電源管理電路等組成。RTC可以精確地記錄日期和時(shí)間,即使是在斷電等異常情況下,也能保持記錄的時(shí)間長(zhǎng)達(dá)數(shù)年。常常用于嵌入式系統(tǒng)、數(shù)據(jù)采集設(shè)備等領(lǐng)域,是一種至關(guān)重要的設(shè)備。在某些系統(tǒng)應(yīng)用中,RTC也會(huì)成為其他設(shè)備的時(shí)鐘源,如單片機(jī)微控制器單位等。

RTC的時(shí)間精度通常為ppm 級(jí)別,即每百萬(wàn)分之一,能夠滿足大多數(shù)實(shí)時(shí)應(yīng)用場(chǎng)景的要求。為了提高RTC的穩(wěn)定度和精度,許多RTC都帶有自動(dòng)校正功能,可以自動(dòng)從外部時(shí)鐘源或NTP服務(wù)器中獲取準(zhǔn)確的時(shí)間,并進(jìn)行校正。同時(shí),許多RTC還會(huì)集成電源管理功能,支持低功耗模式以延長(zhǎng)電池壽命。

二、ESP8266獲取網(wǎng)絡(luò)時(shí)間

要通過(guò)ESP8266聯(lián)網(wǎng)并獲取網(wǎng)絡(luò)時(shí)間,需要執(zhí)行以下步驟:

  1. STM32F103ZET6上配置UART串口以與ESP8266進(jìn)行通信。
  2. 使用AT指令將ESP8266連接到Wi-Fi網(wǎng)絡(luò)??梢允褂靡韵轮噶睿?/li>
AT+CWJAP="SSID","password"

其中,替換 "SSID" 為自己的Wi-Fi網(wǎng)絡(luò)名稱,"password" 是Wi-Fi密碼。

  1. 使用AT指令連接到NTP服務(wù)器并獲取時(shí)間。您可以使用以下指令:
AT+CIPSNTPCFG=0,1,"pool.ntp.org"
AT+CIPSNTPTIME?

這將連接到ntp服務(wù)器并檢索當(dāng)前的UTC時(shí)間。

  1. 將ESP8266返回的UTC時(shí)間轉(zhuǎn)換為本地時(shí)間。您需要知道您所在的時(shí)區(qū),并對(duì)UTC進(jìn)行適當(dāng)?shù)恼{(diào)整。
  2. 將本地時(shí)間設(shè)置為STM32F103ZET6上的RTC實(shí)時(shí)時(shí)鐘。

下面是一個(gè)示例代碼

#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);
}
?
// 發(fā)送AT指令并等待響應(yīng)
int send_at_command(char* command, char* response, uint32_t timeout) {
 // 發(fā)送命令
 USART_SendData(USART1, (uint8_t*)command, strlen(command));
 
 // 等待響應(yīng)
 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);
? ? ? ?
? ? ? ?// 檢查是否收到了預(yù)期的響應(yīng)
? ? ? ?if (strstr(response, c) != NULL) {
? ? ? ? ?return 0; // 成功
? ? ?  }
? ?  }
?  }
? ?
? ?return -1; // 超時(shí)或沒(méi)有收到預(yù)期的響應(yīng)
?}
??
?// 連接ESP8266到Wi-Fi
?void connect_to_wifi() {
? ?char command[50];
? ?char response[100];
? ?
? ?// 設(shè)置Wi-Fi SSID和密碼
? ?sprintf(command, "AT+CWJAP="%s","%s"rn", "YourSSID", "YourPassword");
? ?send_at_command(command, "OK", 5000);
?}
??
?// 連接到NTP服務(wù)器并獲取時(shí)間
?int get_ntp_time(uint32_t* time) {
? ?char response[100];
? ?
? ?// 配置SNTP客戶端
? ?send_at_command("AT+CIPSNTPCFG=0,1,"pool.ntp.org"rn", "OK", 5000);
? ?
? ?// 獲取時(shí)間
? ?send_at_command("AT+CIPSNTPTIME?rn", response, 5000);
? ?
? ?// 解析響應(yīng)并提取時(shí)間戳
? ?char* token = strtok(response, ",");
? ?uint32_t timestamp = atoi(token);
? ?*time = timestamp - 2208988800UL; // 轉(zhuǎn)換為Unix時(shí)間戳
? ?
? ?return 0;
?}
??
?// 將時(shí)間設(shè)置到RTC
?void set_rtc_time(uint32_t time) {
? ?// 啟用PWR和BKP外設(shè)時(shí)鐘
? ?RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
? ?
? ?// 解鎖備份寄存器區(qū)域
? ?PWR_BackupAccessCmd(ENABLE);
? ?
? ?// 配置RTC
? ?RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128); // RTC時(shí)鐘源為HSE/128
? ?RCC_RTCCLKCmd(ENABLE); // 啟用RTC時(shí)鐘
? ?
? ?RTC_InitTypeDef RTC_InitStructure;
? ?// 配置RTC時(shí)鐘 
? ? ?RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24; RTC_InitStructure.RTC_AsynchPrediv = 127; 
? ? ?RTC_InitStructure.RTC_SynchPrediv = 255; 
? ? ?RTC_Init(&RTC_InitStructure);
??
?// 設(shè)置RTC時(shí)間 
? ? ?RTC_TimeTypeDef RTC_TimeStruct; 
? ? ?RTC_DateTypeDef RTC_DateStruct;
??
?// 將Unix時(shí)間戳轉(zhuǎn)換為RTC時(shí)間和日期 
? ?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;
?
// 設(shè)置RTC時(shí)間和日期 
  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時(shí)間 
  uint32_t ntp_time; get_ntp_time(&ntp_time);
?
// 將時(shí)間設(shè)置到
  RTC set_rtc_time(ntp_time);
?
while (1) { // 做其他的事情... } }
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6026

    文章

    44455

    瀏覽量

    630924
  • 接收器
    +關(guān)注

    關(guān)注

    14

    文章

    2451

    瀏覽量

    71705
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    8849

    瀏覽量

    84954
  • NTP
    NTP
    +關(guān)注

    關(guān)注

    1

    文章

    153

    瀏覽量

    13864
  • ESP8266
    +關(guān)注

    關(guān)注

    50

    文章

    962

    瀏覽量

    44688
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    使用EsP8266(NodeMCU)連接阿里云服務(wù)器

    ??使用EsP8266(NodeMCU)連接阿里云服務(wù)器,并在服務(wù)器控制臺(tái)點(diǎn)亮板載LED燈,進(jìn)行數(shù)據(jù)上傳和下傳的測(cè)試。創(chuàng)建阿里云產(chǎn)品功能定義:先選擇編輯草稿,才可以看到最下面的布爾值那
    發(fā)表于 11-24 06:23

    求解關(guān)于AT ESP8266 無(wú)法實(shí)現(xiàn)NTP時(shí)間同步的問(wèn)題?

    有影響。另外PING3個(gè)NTP服務(wù)器都能夠正常通信,應(yīng)該說(shuō)通信已經(jīng)建立,分析應(yīng)該是AT SOCKET部分問(wèn)題,但是目前水平有限,折騰多半天,沒(méi)有任何進(jìn)展,項(xiàng)目時(shí)間緊,希望高手們能多多幫助。謝謝!
    發(fā)表于 03-15 14:36

    有人知道使用GPS/RTC模塊作為時(shí)間源的ESP8266 NTP服務(wù)器嗎?

    有人知道使用 GPS/RTC 模塊作為時(shí)間源的 ESP8266 NTP 服務(wù)器嗎?我有一個(gè) WiFi 項(xiàng)目,我想在其中聯(lián)網(wǎng)很多 ESP 板。
    發(fā)表于 02-24 07:48

    如何使用Lua腳本語(yǔ)言進(jìn)行ESP8266和TCP服務(wù)器多連接

    本文檔的主要內(nèi)容詳細(xì)介紹的是如何使用Lua腳本語(yǔ)言進(jìn)行ESP8266和TCP服務(wù)器多連接。
    發(fā)表于 06-10 17:48 ?2次下載
    如何使用Lua腳本語(yǔ)言<b class='flag-5'>進(jìn)行</b><b class='flag-5'>ESP8266</b>和TCP<b class='flag-5'>服務(wù)器</b>多連接

    Esp8266(NodeMCU)連接阿里云服務(wù)器

    ??使用EsP8266(NodeMCU)連接阿里云服務(wù)器,并在服務(wù)器控制臺(tái)點(diǎn)亮板載LED燈,進(jìn)行數(shù)據(jù)上傳和下傳的測(cè)試。創(chuàng)建阿里云產(chǎn)品功能定義:先選擇編輯草稿,才可以看到最下面的布爾值那
    發(fā)表于 11-16 10:21 ?18次下載
    <b class='flag-5'>Esp8266</b>(NodeMCU)連接阿里云<b class='flag-5'>服務(wù)器</b>

    調(diào)用Lua新建的WEB服務(wù)器 操作Nodemcu esp8266 控制繼電器實(shí)現(xiàn)物聯(lián)網(wǎng)

    調(diào)用Lua新建的WEB服務(wù)器 操作Nodemcu esp8266 控制繼電器實(shí)現(xiàn)物聯(lián)網(wǎng)
    發(fā)表于 12-08 16:51 ?13次下載
    <b class='flag-5'>調(diào)用</b>Lua新建的WEB<b class='flag-5'>服務(wù)器</b>  操作Nodemcu <b class='flag-5'>esp8266</b> 控制繼電器實(shí)現(xiàn)物聯(lián)網(wǎng)

    最簡(jiǎn)單DIY基于ESP8266的物聯(lián)網(wǎng)智能小車②(webserver服務(wù)器網(wǎng)頁(yè)高級(jí)遙控版)

    ESP8266ESP32物聯(lián)網(wǎng)智能小車開(kāi)發(fā)系列文章目錄第一篇:最簡(jiǎn)單DIY基于ESP8266的物聯(lián)網(wǎng)智能小車①(webserver服務(wù)器網(wǎng)頁(yè)簡(jiǎn)單遙控版)第二篇:最簡(jiǎn)單DIY基于
    發(fā)表于 12-29 18:58 ?0次下載
    最簡(jiǎn)單DIY基于<b class='flag-5'>ESP8266</b>的物聯(lián)網(wǎng)智能小車②(webserver<b class='flag-5'>服務(wù)器</b>網(wǎng)頁(yè)高級(jí)遙控版)

    如何利用ESP8266實(shí)現(xiàn)智能手表的設(shè)計(jì)

    這是一款簡(jiǎn)單的ESP8266手表,具有多個(gè)位置的 WiFi 連接、NTP 時(shí)間服務(wù)器同步和比較功能。
    的頭像 發(fā)表于 04-01 15:29 ?3140次閱讀
    如何利用<b class='flag-5'>ESP8266</b>實(shí)現(xiàn)智能手表的設(shè)計(jì)

    如何使用ESP8266制作可配置的Web服務(wù)器

    在這個(gè)項(xiàng)目中,我們首先研究如何在 Arduino IDE 中安裝 ESP8266 插件,然后使用 ESP8266 制作可配置的 Web 服務(wù)器。
    的頭像 發(fā)表于 05-10 15:18 ?1.3w次閱讀
    如何使用<b class='flag-5'>ESP8266</b>制作可配置的Web<b class='flag-5'>服務(wù)器</b>

    使用ESP8266NTP服務(wù)器獲取時(shí)間并在OLED顯示上顯示

    在本教程中,我們將使用 ESP8266 NodeMCU 從 NTP 服務(wù)器獲取當(dāng)前時(shí)間和日期,并將其顯示在 OLED 顯示屏上。
    的頭像 發(fā)表于 09-01 16:09 ?1.9w次閱讀
    使用<b class='flag-5'>ESP8266</b>從<b class='flag-5'>NTP</b><b class='flag-5'>服務(wù)器</b>獲取<b class='flag-5'>時(shí)間</b>并在OLED顯示<b class='flag-5'>器</b>上顯示

    基于ESP8266NTP時(shí)鐘

    電子發(fā)燒友網(wǎng)站提供《基于ESP8266NTP時(shí)鐘.zip》資料免費(fèi)下載
    發(fā)表于 11-11 10:06 ?3次下載
    基于<b class='flag-5'>ESP8266</b>的<b class='flag-5'>NTP</b>時(shí)鐘

    NodeMCU ESP8266啟用AJAX的Web服務(wù)器

    電子發(fā)燒友網(wǎng)站提供《NodeMCU ESP8266啟用AJAX的Web服務(wù)器.zip》資料免費(fèi)下載
    發(fā)表于 11-22 09:37 ?1次下載
    NodeMCU <b class='flag-5'>ESP8266</b>啟用AJAX的Web<b class='flag-5'>服務(wù)器</b>

    基于ESP8266的Web服務(wù)器

    項(xiàng)目將告訴你如何在不使用 Arduino 的情況下使用 ESP8266 構(gòu)建 Web 服務(wù)器
    發(fā)表于 12-07 11:02 ?1次下載

    基于ESP8266實(shí)現(xiàn)串口服務(wù)器

    ESP8266工作在TCP服務(wù)器模式時(shí),可以借助IOTGATEWAY很輕松地將傳統(tǒng)設(shè)備接入物聯(lián)網(wǎng),實(shí)現(xiàn)多設(shè)備實(shí)時(shí)監(jiān)控
    的頭像 發(fā)表于 05-17 15:55 ?2954次閱讀
    基于<b class='flag-5'>ESP8266</b>實(shí)現(xiàn)串口<b class='flag-5'>服務(wù)器</b>

    使用ESP8266 OLED和Visuino從NIST TIME服務(wù)器獲取日期和時(shí)間

    電子發(fā)燒友網(wǎng)站提供《使用ESP8266 OLED和Visuino從NIST TIME服務(wù)器獲取日期和時(shí)間.zip》資料免費(fèi)下載
    發(fā)表于 06-28 09:55 ?0次下載
    使用<b class='flag-5'>ESP8266</b> OLED和Visuino從NIST TIME<b class='flag-5'>服務(wù)器</b>獲取日期和<b class='flag-5'>時(shí)間</b>