PlatformIO+ESP32S3学习:通过WIFI获取NTP网络时间进行跑时和时间校准

1. NTP介绍


NTP网络时间协议(Network Time Protocol,NTP),是一种用于在计算机网络上同步时间的协议。它通过在时间服务器和客户端之间交换时间信息来确保网络中的计算机时钟保持准确的时间同步。以下是NTP的一些关键特性:

特点:

精确性: NTP能够提供非常高的时间同步精度,通常在毫秒级,甚至可以达到微秒级。
可扩展性: NTP设计用于在广泛的网络环境中工作,从局域网到广域网,可以支持大量客户端。
分层结构: NTP采用层级化的时间同步架构,时间信息从高精度的参考时钟源通过多个时间服务器层传递到客户端。
鲁棒性: NTP能够处理网络延迟、丢包和其他网络问题,确保时间同步的稳定性和可靠性。

应用:
服务器同步: 确保服务器集群中的所有服务器时钟同步。
网络安全: 在网络安全中,同步的时钟对于日志记录和事件关联至关重要。
分布式系统: 在分布式系统和数据库中,准确的时间同步有助于维护数据一致性和协调操作。

NTP广泛应用于互联网上的各种设备和系统中,是现代网络基础设施的重要组成部分。

以上来自 chatGPT 的介绍

2. 硬件准备


因为项目要有网络时间校准功能,要使用WIFI获取网络时间进行校准。这里使用的是ESP32S3的开发板。

购买地址:立创·ESP32S3R8N8 开发板

在这里插入图片描述

3. 工程创建

在VSCode中打开PlatformIO扩展创建工程。

在这里插入图片描述

设置工程向导

在这里插入图片描述
在这里插入图片描述

等待创建完成。

在这里插入图片描述

4. 安装驱动库

创建完成之后,我们在VSCode中打开我们刚才创建的工程文件夹。

在这里插入图片描述
在VSCode中回到PlatformIO的主页,准备给工程安装NTP的驱动库。

在这里插入图片描述

在这里插入图片描述

搜索NTPClient,安装来自Fabrice WeinbergNTPClient库。

在这里插入图片描述
将库添加到我们的工程之中。

在这里插入图片描述
在这里插入图片描述

安装完成之后,打开platformio.ini文件,可以看到已经安装上了驱动库。

在这里插入图片描述

5. 编辑代码

打开工程下的src文件夹下的main.cpp

在这里插入图片描述
输入以下代码:

#include <Arduino.h>
#include <WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>

//设置你要ESP32S3连接的WIFI名称
#define WIFI_SSID "lckfb"     
//设置你要ESP32S3连接的WIFI密码
#define WIFI_PASS "12345678"

// 定义NTP服务器
const char* ntpServer = "pool.ntp.org";
// 定义时区(以小时为单位,例如:+1或-3)
const long gmtOffset = 8; 
// 定义夏令时(Daylight Saving Time,DST)的偏移量(通常为0或3600秒)
const int daylightOffset = 0;
// 创建UDP实例
WiFiUDP ntpUDP;
// 创建NTP客户端实例
NTPClient timeClient(ntpUDP, ntpServer, gmtOffset * 3600, daylightOffset * 3600);

void setup() 
{
  //初始化串口
  Serial.begin(9600);

  // 连接到Wi-Fi
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  //如果没有连接上串口就一直输出 ...
  //如果连接不上请确保你要连接的WIFI不是5G频段!
  //大部分ESP32系列都只能连接2.4G频段!
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  
  // 启动NTP客户端
  timeClient.begin();
  // 设置时间同步间隔(以毫秒为单位)
  timeClient.setUpdateInterval(60000); // 1分钟更新一次
}

void loop() {
  // 更新NTP时间
  timeClient.update();

  if (timeClient.getEpochTime() > 0) 
  {
    // 获取成功
    unsigned long epochTime = timeClient.getEpochTime();
    struct tm *ptm = gmtime ((time_t *)&epochTime); 

    //年是至1900年后开始计算,所以我们实际使用得+1900
    int year = ptm->tm_year + 1900;
    //月是从0开始算,所以我们实际使用得+1
    int month = ptm->tm_mon + 1;
    int day = ptm->tm_mday;
    int hour = ptm->tm_hour;
    int minute = ptm->tm_min;
    int second = ptm->tm_sec;

    // 打印时间
    Serial.printf("%d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second);
  } else {
    // 获取失败,可以在这里进行重试或错误处理
    Serial.println("Failed to get NTP time");
  }

  delay(1000); // 每1秒尝试一次
}

6. 代码验证

代码编写完成之后,将ESP32S3开发板接入电脑。我当前的开发板上是CH340K的驱动,故我这里选择COM3端口。

在这里插入图片描述

编译并下载到开发板中。

在这里插入图片描述

打开串口监视器。

在这里插入图片描述

实际获取网络时间的效果如下:

在这里插入图片描述

后续我们使用到硬件的RTC时钟模块时,就可以通过NTP的方式获取网络的时间进行校准了。

  • 21
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
根据引用\[1\]中的描述,PlatformIO是一个开发环境,可以与VS Code结合使用,提供了强大的编辑和构建能力。它支持ESP32 S3开发,并可以替代Arduino IDE,提供自动补全、函数跳转、函数提示等功能。从Arduino IDE切换到PlatformIO相对简单,只需要稍作修改文件结构即可。然而,引用中也提到了PlatformIO切换例程稍显麻烦。 根据引用\[2\]中的描述,安装完成PlatformIO后,可以通过点击左下角的蚂蚁头logo图标打开PlatformIO IDE主页。然后可以选择+New Project创建工程,填写项目名称、选择开发板和框架,并选择保存路径。完成后,可以打开工程文件夹,编辑src目录下的main.cpp文件。 根据引用\[3\]中的描述,如果创建ESP32S3文件的过程比较慢,可能是由于网络原因导致的。在创建工程,需要从网络上下载一些文件,如果网络不稳定或速度较慢,就会导致创建过程变慢。在这种情况下,建议耐心等待,或者尝试使用更稳定和快速的网络环境。 综上所述,如果PLATFORMIO创建ESP32S3文件慢,可能是由于网络原因导致的。建议耐心等待或尝试使用更稳定和快速的网络环境。 #### 引用[.reference_title] - *1* *2* [ESP32 S3 的VS Code + PlatformIO 开发环境搭建](https://blog.csdn.net/CNCTECHENT/article/details/125335358)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [[ESP32][esp-idf] esp32s3 快速搭建LVGL V7.9](https://blog.csdn.net/qq_29246181/article/details/125931457)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老怪.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值