作者:順哥
email:palmbear@gmail.com
資料來源:
https://randomnerdtutorials.com/esp32-date-time-ntp-client-server-arduino/
Table of Contents
[TOC]
前言
如何使用 ESP32 和 Arduino IDE 從 NTP Server 同步日期和時間?
獲取日期和時間在Aiot應用中很有用。要從 NTP Server獲取時間,ESP32需要連接 Internet,而且不需要額外的硬體(如 RTC 時鐘)。
NTP(Network Time Protocol, 網路時間協議)
NTP想要將所有參與電腦的協調世界時(UTC)時間同步到ms的誤差內。NTP通常可以在internet保持幾十毫秒的誤差,並且在理想的區域網路環境中可以實現超過1毫秒的精度。
MCU與NTP Server同步示意圖:
資料來源:randomnerdtutorials.com
硬體
- AI Thinker ESP32-S(NODMCU-32 V1.2)


- ESP32擴展板

- USB充電傳輸線
軟體
- Arduino IDE 2.0.0 RC5 for MacOS:

- 需要的Library:
<WiFi.h>
<time.h>
程式碼
- 使用 ESP32 加上 ESP32擴展板,程式碼如下:
/*
Rui Santos
Complete project details at https://RandomNerdTutorials.com/esp32-date-time-ntp-client-server-arduino/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*/
#include <WiFi.h>
#include <time.h>
const char* ssid = "Your wifi ssid";
const char* password = "your password";
const char* ntpServer = "time.google.com";
const long gmtOffset_sec = 28800; //台灣時區+8hr,28800=8*60*60
const int daylightOffset_sec = 0; //台灣無日光節約時間
void setup(){
Serial.begin(115200);
// Connect to Wi-Fi
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected.");
// Init and get the time
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
printLocalTime();
//disconnect WiFi as it's no longer needed
WiFi.disconnect(true);
WiFi.mode(WIFI_OFF);
}
void loop(){
delay(5000);
printLocalTime();
}
void printLocalTime(){
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
Serial.println("Failed to obtain time");
return;
}
Serial.println(&timeinfo, "%A, %Y %m %d %H:%M:%S"); //%A-Sunday,%Y-2022,%m-3,%d-27,%H:%M:%S-21:10:02
Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S"); //%A-Sunday,%B-March,%d-27,%Y-2022,%H:%M:%S-21:10:02
Serial.print("Day of week: "); //顯示英文 星期
Serial.println(&timeinfo, "%A"); //Day of week: Sunday
Serial.print("Month: "); //顯示英文 月份
Serial.println(&timeinfo, "%B"); //Month: March
Serial.print("Day of Month: "); //顯示英文 日
Serial.println(&timeinfo, "%d"); //Day of Month: 27
Serial.print("Year: "); //顯示英文 西元年
Serial.println(&timeinfo, "%Y"); //Year: 2022
Serial.print("Hour: "); //顯示英文 時 24小時制
Serial.println(&timeinfo, "%H"); //Hour: 21
Serial.print("Hour (12 hour format): "); //顯示英文 時 12小時制
Serial.println(&timeinfo, "%I"); //Hour (12 hour format): 9
Serial.print("Minute: "); //顯示英文 分
Serial.println(&timeinfo, "%M"); //Minute: 01
Serial.print("Second: "); //顯示英文 秒
Serial.println(&timeinfo, "%S"); //Second: 24
Serial.println("Time variables"); //時間變數Time variables
char timeHour[3]; //宣告時間小時變數:timeHour
strftime(timeHour,3, "%H", &timeinfo);
Serial.println(timeHour); //顯示時數:22
char timeWeekDay[10]; //宣告時間星期變數:timeWeekDay
strftime(timeWeekDay,10, "%A", &timeinfo);
Serial.println(timeWeekDay); //顯示星期:Sunday
Serial.println("*****************************************************");
}
