日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Arduino ESP32 最简单直接获取网络时间方法

發布時間:2023/12/10 编程问答 94 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Arduino ESP32 最简单直接获取网络时间方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Arduino ESP32 最簡單直接獲取網絡時間方法


?在 ArduinoESP32核心支持庫當中已經包含相關的獲取時間的庫,所有獲取網絡時間,只需要連接好網絡,調用相關的庫函數即可實現NTP時間的獲取,免去的額外加載擴展庫的頭文件。

🧲實施條件

  • ESP32需要在:WiFi.mode(WIFI_STA);模式下,配網并接入網絡。
  • 使用下面函數從網絡時間服務器上獲取并設置時間:
configTime(long gmtOffset_sec, int daylightOffset_sec, const char* server1, const char* server2 = nullptr, const char* server3 = nullptr)

參數說明:
gmtOffset_sec 參數就是用來修正時區的,比如對于我們東八區(UTC/GMT+08:00)來說該參數就需要填寫 8 * 3600 ;
daylightOffset_sec使用夏令時 daylightOffset_sec 就填寫3600,否則就填寫0;

通過網絡時間服務器獲得的時間是世界協調時間(UTC)/格林尼治時間(GMT),不同地區的時間可以通過時區換算.

  • 設置完成后就可以使用下面函數讀取當前時間了:
bool getLocalTime(struct tm * info, uint32_t ms = 5000)

參數說明:
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結構體
struct tm { int tm_sec; // 秒,取值0~59; int tm_min; // 分,取值0~59; int tm_hour; // 時,取值0~23; int tm_mday; // 月中的日期,取值1~31; int tm_mon; // 月,取值0~11; int tm_year; // 年,其值等于實際年份減去1900; int tm_wday; // 星期,取值0~6,0為周日,1為周一,依此類推; int tm_yday; // 年中的日期,取值0~365,0代表1月1日,1代表1月2日,依此類推; int tm_isdst; // 夏令時標識符,實行夏令時的時候,tm_isdst為正;不實行夏令時的進候,tm_isdst為0;不了解情況時,tm_isdst()為負 };
  • 格式化輸出(只能在申明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 每周的第幾天,星期一為第一天 (值從06,星期一為0%U 第年的第幾周,把星期日做為第一天(值從053%V 每年的第幾周,使用基于周的年 %w 十進制表示的星期幾(值從06,星期天為0%W 每年的第幾周,把星期一做為第一天(值從053%x 標準的日期串 %X 標準的時間串 %y 不帶世紀的十進制年份(值從099%Y 帶世紀部分的十進制年份 %z,%Z 時區名稱,如果不能得到時區名稱則返回空字符

總結

以上是生活随笔為你收集整理的Arduino ESP32 最简单直接获取网络时间方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。