ESP32通过NTPClient库获取实时时间

一、环境:

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("");
}

不解释啦,自己读代码吧。

最后,我有话说:

        如果文章对你有帮助,我很开心。有疑问请留言,看到后,我会回复。

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值