esp32获取网络时间

ESP32连接到WiFi后,通过向NTP服务器发送请求获取当前时间,然后使用内置RTC或外部RTC模块跟踪时间。代码示例展示了如何配置WiFi连接,使用configTime函数同步时间,并将获取的时间转换为Unix时间戳。这一过程对于需要精确时间戳的MQTT通信等应用是必要的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ESP32连接WiFi后获取网络时间

ESP32连接到WiFi并获得Internet访问权限,可以通过向NTP服务器发送请求来获取当前时间。ESP32可以使用内置的NTP客户端库或第三方库来实现此功能。一旦获取了时间信息,ESP32可以使用其内置的Real-Time Clock(RTC)模块或外部RTC芯片来跟踪时间。

目的

ESP32通过连接WiFi后得到当前时间,并且转换为unix时间戳类型,目的是使用mqtt时可以将发送信息时间上传等。

如何实现

此代码需要包含以下库:WiFi、HTTPClient和time。
在开始使用代码之前,请确保已将WiFi的SSID和密码替换为您自己的网络。

#include <WiFi.h>
#include <HTTPClient.h>
#include <time.h>

const char* ssid = "esp32";
const char* password = "guanzhuyixia!";
const char* ntpServer = "pool.ntp.org";
const long utcOffsetInSeconds = 28800; // Beijing: UTC +8  -- 获取东八区时间(默认以英国格林威治天文台所在地的本初子午线为基准线的)

void setup() {
  Serial.begin(115200);
  while (!Serial);
  //连接wifi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  Serial.println("Connected to WiFi");
  //获取时间
  configTime(utcOffsetInSeconds, 0, ntpServer);
  while (!time(nullptr)) {
    delay(1000);
    Serial.println("Waiting for time sync...");
  }
  Serial.println("Time synced successfully");
}

void loop() {
  time_t now = time(nullptr);
  Serial.print("Current time is: ");
  Serial.println(ctime(&now));  //打印时间
  // Convert current time to Unix timestamp
  long unixTimestamp = static_cast<long>(now);  //获取unix时间戳 
  Serial.print("Unix timestamp is: ");
  Serial.println(unixTimestamp);
  delay(1000);
}

此示例中,我们使用static_cast将time_t类型的当前时间转换为long类型的Unix时间戳。然后,我们将Unix时间戳打印到串行监视器中。

在Unix操作系统中,时间戳表示从1970年1月1日00:00:00 UTC(协调世界时)开始经过的秒数。因此,将当前时间转换为时间戳可以帮助我们进行日期和时间计算。
状态
在ESP32的Arduino环境中,time_t数据类型是一个整数,表示自1970年1月1日00:00:00 UTC以来经过的秒数。但是,由于long比time_t更具通用性,因此在转换时使用了static_cast将time_t强制转换为long。

### STM32与ESP8266结合获取当前时间 当STM32与ESP8266配合工作时,可以通过NTP协议从互联网上同步时间。这通常涉及到配置ESP8266作为WiFi模块来访问网络上的NTP服务器,并将接收到的时间数据传递给STM32处理。 #### 配置ESP8266连接至Wi-Fi并设置NTP服务 为了实现这一功能,在`GlobalConfig.h`文件中定义必要的参数用于建立Wi-Fi连接以及指定要使用的NTP服务器: ```c #ifndef __GLOAL_CONFIG_H_ #define __GLOAL_CONFIG_H_ // Wi-Fi 设置 #define WIFI_NAME "MCSCV" #define WIFI_PSWD "jnszstmOBB" // NTP 服务器设定 #define NTP_SERVER "pool.ntp.org" // 使用公共NTP池中的任意一台服务器 #define GMT_OFFSET_SEC 28800 // UTC+8 (北京时间) #endif ``` 接着编写主程序部分,初始化ESP8266并通过AT指令集发送命令让其执行联网操作和请求最新时间戳: ```cpp #include <Arduino.h> #include "GlobalConfig.h" void setup() { Serial.begin(115200); // 初始化 ESP8266 WiFi 模块 delay(1000); Serial.println("Initializing..."); sendCommandToEsp8266("AT+CWMODE=1\r\n"); // 设置为STA模式 sendCommandToEsp8266("AT+CWJAP=\"" WIFI_NAME "\",\"" WIFI_PSWD "\"\r\n"); // 连接到特定SSID/PWD组合下的无线路由器 // 启动自动更新时间和日期的功能 sendCommandToEsp8266("AT+CIPSNTPCFG=\"\""+String(NTP_SERVER)+",\"\",," + String(GMT_OFFSET_SEC) + "\r\n"); } void loop() { if(Serial.available()){ char c = Serial.read(); // 处理来自ESP8266的数据流... } } ``` 上述代码片段展示了如何利用串口通信向ESP8266发出一系列预设好的AT指令完成Wi-Fi接入及NTP查询过程[^2]。 对于STM32而言,则需监听来自ESP8266返回的信息包内含有的标准UTC时间字符串格式(如:"YYYY-MM-DD HH:MM:SS"),解析该字符串后调整内部RTC寄存器以反映最新的实际时刻。 最后需要注意的是,具体实施细节可能会因所选用的具体型号不同而有所差异;此外还需考虑错误重试机制等问题确保系统的稳定性和可靠性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值