一、环境:
arduino IDE或VS Code PlatformIO (我是后者)
二、硬件准备:
一个esp32
一台电脑
一根数据线
三、代码功能:
串口输出时间(时-分-秒):
四、下载NTPClient库:
这是VS Code PlatformIO上NTPClient库的下载方式。 (作为鱼香ROS受众,吹一句大佬好强。)
这里介绍了三种安装方法。
我用了方法一。
见图:
五、最简代码
#include <Arduino.h>
#include <NTPClient.h>
// change next line to use with another board/shield
#include <WiFi.h>
//#include <WiFi.h> // for WiFi shield
//#include <WiFi101.h> // for WiFi 101 shield or MKR1000
#include <WiFiUdp.h>
const char *ssid = "m";
const char *password = "12345678";
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP);
void setup(){
Serial.begin(115200);
WiFi.begin(ssid, password);
while ( WiFi.status() != WL_CONNECTED ) {
delay ( 500 );
Serial.print ( "." );
}
timeClient.begin();
}
void loop() {
timeClient.update();
Serial.println(timeClient.getFormattedTime());
delay(1000);
}
六、实用代码
这里也许是一个比较实用的代码(又是一个神秘的连接,带你见见大佬)。
#include <Arduino.h>
/**
* 通过NTP协议获取Epoch/Unix时间
* @author Jenson
* @date 2021.02.28
*/
#include <WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
// 定义NTP客户端
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org");
// 定义星期名称
String weekDays[7]={"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
// 定义月份名称
String months[12]={"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
/**
* @brief 设置Wifi
*/
void setup_wifi();
/**
* @brief 设置NTP客户端
*/
void setup_ntp_client();
/**
* @brief 获取网络时间
*/
void getDateTime();
void setup() {
// 设置串口
Serial.begin(115200);
setup_wifi();
setup_ntp_client();
}
void loop() {
// put your main code here, to run repeatedly:
getDateTime();
delay(1000);
}
void setup_wifi(){
const char* ssid = "m";
const char* pwd= "12345678";
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, pwd);
Serial.print("Connecting to WiFi ..");
while (WiFi.status() != WL_CONNECTED) {
Serial.print('.');
delay(1000);
}
Serial.println(WiFi.localIP());
}
void setup_ntp_client(){
timeClient.begin();
// 设置时区
// GMT +1 = 3600
// GMT +8 = 28800
// GMT -1 = -3600
// GMT 0 = 0
timeClient.setTimeOffset(28800);
}
void getDateTime(){
// 请求网络时间
timeClient.update();
unsigned long epochTime = timeClient.getEpochTime();
Serial.print("Epoch Time: ");
Serial.println(epochTime);
// 解析网络时间
String formattedTime = timeClient.getFormattedTime();
Serial.print("Formatted Time: ");
Serial.println(formattedTime);
int currentHour = timeClient.getHours();
Serial.print("Hour: ");
Serial.println(currentHour);
int currentMinute = timeClient.getMinutes();
Serial.print("Minutes: ");
Serial.println(currentMinute);
int currentSecond = timeClient.getSeconds();
Serial.print("Seconds: ");
Serial.println(currentSecond);
String weekDay = weekDays[timeClient.getDay()];
Serial.print("Week Day: ");
Serial.println(weekDay);
//Get a time structure
struct tm *ptm = gmtime ((time_t *)&epochTime);
int monthDay = ptm->tm_mday;
Serial.print("Month day: ");
Serial.println(monthDay);
int currentMonth = ptm->tm_mon+1;
Serial.print("Month: ");
Serial.println(currentMonth);
String currentMonthName = months[currentMonth-1];
Serial.print("Month name: ");
Serial.println(currentMonthName);
int currentYear = ptm->tm_year+1900;
Serial.print("Year: ");
Serial.println(currentYear);
//Print complete date:
String currentDate = String(currentYear) + "-" + String(currentMonth) + "-" + String(monthDay);
Serial.print("Current date: ");
Serial.println(currentDate);
Serial.println("");
}
不解释啦,自己读代码吧。
最后,我有话说:
如果文章对你有帮助,我很开心。有疑问请留言,看到后,我会回复。