Arduino ESP32 最简单直接获取网络时间方法
生活随笔
收集整理的這篇文章主要介紹了
Arduino ESP32 最简单直接获取网络时间方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Arduino ESP32 最簡單直接獲取網絡時間方法
?在 ArduinoESP32核心支持庫當中已經包含相關的獲取時間的庫,所有獲取網絡時間,只需要連接好網絡,調用相關的庫函數即可實現NTP時間的獲取,免去的額外加載擴展庫的頭文件。
🧲實施條件
- ESP32需要在:WiFi.mode(WIFI_STA);模式下,配網并接入網絡。
- 使用下面函數從網絡時間服務器上獲取并設置時間:
參數說明:
gmtOffset_sec 參數就是用來修正時區的,比如對于我們東八區(UTC/GMT+08:00)來說該參數就需要填寫 8 * 3600 ;
daylightOffset_sec使用夏令時 daylightOffset_sec 就填寫3600,否則就填寫0;
通過網絡時間服務器獲得的時間是世界協調時間(UTC)/格林尼治時間(GMT),不同地區的時間可以通過時區換算.
- 設置完成后就可以使用下面函數讀取當前時間了:
參數說明:
ms 為該操作超時時間,超時則返回false;
info 是一個 struct tm 結構體對象,用于接收當前時間;
- 獲取成功后芯片會使用RTC時鐘保持時間的更新,這時候,就可以不依賴網絡了,可以關閉網絡,運行時讀取本地同步過的時間。
🎯具體獲取時間的代碼
/**ESP32 最簡單直接獲取網絡時間方法 */#include <WiFi.h>#define NTP1 "ntp1.aliyun.com" #define NTP2 "ntp2.aliyun.com" #define NTP3 "ntp3.aliyun.com"//填寫WIFI入網信息 const char* ssid = "MERCURY_D268G"; // WIFI賬戶 const char* password = "pba5ayzk"; // WIFI密碼void setClock() {struct tm timeinfo;if (!getLocalTime(&timeinfo)){//如果獲取失敗,就開啟聯網模式,獲取時間Serial.println("Failed to obtain time");// WiFi.disconnect(false);WiFi.mode(WIFI_STA);//開啟網絡 WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED){delay(500);Serial.print(".");}configTime(8 * 3600, 0, NTP1, NTP2,NTP3);return;}Serial.println(&timeinfo, "%F %T %A"); // 格式化輸出:2021-10-24 23:00:44 SundaySerial.print(asctime(&timeinfo));//默認打印格式:Mon Oct 25 11:13:29 2021// WiFi.disconnect(true);//斷開網絡連接,關閉網絡 }void setup() {Serial.begin(115200);Serial.println();//設置ESP32工作模式為無線終端模式WiFi.mode(WIFI_STA);WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED){delay(500);Serial.print(".");}Serial.println("WiFi connected!");configTime(8 * 3600, 0, NTP1, NTP2,NTP3);setClock();// 從網絡時間服務器上獲取并設置時間// 獲取成功后芯片會使用RTC時鐘保持時間的更新// WiFi.disconnect(true);//斷開wifi網絡 // WiFi.mode(WIFI_OFF);//關閉網絡Serial.println("WiFi disconnected!"); }void loop() {Serial.println("Waiting 10s before the next round...");delay(10000);setClock(); }- 🎉串口打印信息
🧲默認的時間格式輸出:asctime(&timeinfo),如果像將該數據傳遞給其他地方使用,可以使用char*變量來接收。例如:char* timelist=asctime(&timeinfo);需要注意的是,并不能使用const char* timelist2 =(&timeinfo, "%F %T %A");來接收這種格式化的數據,得到的將是%F %T %A的字符串結果。
🎄struct tm結構體與格式化輸出
通過一個結構體將時間數據拆解成段,滿足不同需求的顯示。
- struct tm結構體
- 格式化輸出(只能在申明tm結構體函數內調用執行)
Serial.println(&timeinfo, "%F %T %A"); // 格式化輸出:2021-10-24 23:00:44 Sunday Serial.print(asctime(&timeinfo));//默認打印格式:Mon Oct 25 11:13:29 2021
%a 星期幾的簡寫 %A 星期幾的全稱 %b 月分的簡寫 %B 月份的全稱 %c 標準的日期的時間串 %C 年份的后兩位數字 %d 十進制表示的每月的第幾天 %D 月/天/年 %e 在兩字符域中,十進制表示的每月的第幾天 %F 年-月-日 %g 年份的后兩位數字,使用基于周的年 %G 年分,使用基于周的年 %h 簡寫的月份名 %H 24小時制的小時 %I 12小時制的小時 %j 十進制表示的每年的第幾天 %m 十進制表示的月份 %M 十時制表示的分鐘數 %p 本地的AM或PM的等價顯示 %r 12小時的時間 %R 顯示小時和分鐘:hh:mm %S 十進制的秒數 %t 水平制表符 %T 顯示時分秒:hh:mm:ss %u 每周的第幾天,星期一為第一天 (值從0到6,星期一為0) %U 第年的第幾周,把星期日做為第一天(值從0到53) %V 每年的第幾周,使用基于周的年 %w 十進制表示的星期幾(值從0到6,星期天為0) %W 每年的第幾周,把星期一做為第一天(值從0到53) %x 標準的日期串 %X 標準的時間串 %y 不帶世紀的十進制年份(值從0到99) %Y 帶世紀部分的十進制年份 %z,%Z 時區名稱,如果不能得到時區名稱則返回空字符總結
以上是生活随笔為你收集整理的Arduino ESP32 最简单直接获取网络时间方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习(902):this指向问题
- 下一篇: 如何构建用户画像