使用 NTPClient_Generic 和 PlatformIO 的最小 ESP32 NTP 客户端示例

使用 NTPClient_Generic 的示例

main.cpp

main.cpp
#include <Arduino.h>
#include <WiFi.h>
#include <NTPClient_Generic.h>

#define TIME_ZONE_OFFSET_HRS 1 // UTC+1 用于德国,冬令时
#define NTP_UPDATE_INTERVAL_MS 60000L // 每 60 秒自动更新
WiFiUDP ntpUDP;
NTPClient ntpClient(ntpUDP, "europe.pool.ntp.org", (3600 * TIME_ZONE_OFFSET_HRS), NTP_UPDATE_INTERVAL_MS);

void ntpUpdateTask(void* param) {
  while(true) {
    // 更新 NTP。这只有在
    // NTP 客户端在 NTP_UPDATE_INTERVAL_MS 内未更新时才会实际更新
    ntpClient.update();
    vTaskDelay(1000 / portTICK_PERIOD_MS);
  }
}

void setup() {
  Serial.begin(115200);
  // 强制重置 Wifi 以避免连接失败
  WiFi.disconnect(true);
  // 设置主机名
  WiFi.config(INADDR_NONE, INADDR_NONE, INADDR_NONE);
  WiFi.setHostname("ESP-NTP");
  // 连接到 Wifi
  WiFi.begin("MyWifiSSID", "MyWifiPassword");
  while (WiFi.status() != WL_CONNECTED) {
      delay(100);
      Serial.println("Wifi connecting...");
  }

  // 启动 NTP 客户端(即开始监听 NTP 数据包)
  ntpClient.begin();
  // 创建任务以在后台自动更新 NTP
  xTaskCreate(ntpUpdateTask, "NTP update", 2000, nullptr, 1, nullptr);
}

void loop() {
  delay(1000);
  if (ntpClient.updated()) {
    Serial.println("# 时间与 NTP 服务器同步");
  } else {
    Serial.println("# 时间未与 NTP 服务器同步!");
    return; // 不打印时间
  }

  Serial.println("UTC : " + ntpClient.getFormattedUTCTime());
  Serial.println("UTC : " + ntpClient.getFormattedUTCDateTime());
  Serial.println("LOC : " + ntpClient.getFormattedTime());
}

platformio.ini

platformio.ini
[env:nodemcu-32s]
platform = espressif32
board = nodemcu-32s
framework = arduino
monitor_speed = 115200
lib_deps =
  khoih.prog/NTPClient_Generic @ ^3.2.2
  Time

示例输出:

example_output.txt
Wifi connecting...
Wifi connecting...
Wifi connecting...
# TIME NOT IN SYNC WITH NTP SERVER !
# Time in sync with NTP server
UTC : 01:22:07
UTC : 01:22:07 Sun 07 Feb 2021
LOC : 02:22:07
# Time in sync with NTP server
UTC : 01:22:08
UTC : 01:22:08 Sun 07 Feb 2021
LOC : 02:22:08
# Time in sync with NTP server
UTC : 01:22:09
UTC : 01:22:09 Sun 07 Feb 2021
LOC : 02:22:09

Check out similar posts by category: C/C++, ESP8266/ESP32, PlatformIO