基于NanoE的NTP网络授时测试
在本教程中,我们将学习如何使用NanoE开发板通过NTP(网络时间协议)获取当前时间。
一、程序原理
1. 库的引入:
#include "Arduino.h"
:引入Arduino核心库;
#include <WiFi.h>
:引入Wi-Fi库,以便NanoE能够连接到Wi-Fi网络;
#include "time.h"
:引入时间库,以便处理时间和日期。
2. Wi-Fi连接信息:
3. NTP服务器和时区设置:
- 使用
pool.ntp.org
作为NTP服务器;
- 设置时区为GMT+8(中国标准时间),
gmtOffset_sec
参数就是用来修正时区的,比如对于我们东八区来说该参数为 8 * 3600 ;
daylightOffset_sec
使用夏令时 daylightOffset_sec 就填写3600,否则就填写0。
// NTP服务器和时区设置
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 28800; // GMT+8
const int daylightOffset_sec = 0; // 不使用夏令时
4. 获取和打印本地时间:
printLocalTime()
函数用于获取当前时间并打印到串口监视器。如果获取时间失败,将输出错误信息;
// 打印本地时间的函数
void printLocalTime() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
Serial.println("获取时间失败");
return;
}
Serial.println(&timeinfo, "%A, %Y-%m-%d %H:%M:%S");
}
setup()
函数:
初始化串口通信,连接到Wi-Fi网络,并等待连接成功;
配置NTP时间,并调用printLocalTime()
函数打印当前时间;
连接成功后,断开Wi-Fi以节省电源。
void setup() {
Serial.begin(115200);
Serial.printf("连接到 %s ", ssid);
WiFi.begin(ssid, password);
// 等待连接
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" 连接成功");
// 配置时间
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
printLocalTime();
// 断开Wi-Fi
WiFi.disconnect(true);
WiFi.mode(WIFI_OFF);
}
在loop()
函数中每秒调用一次printLocalTime()
函数,持续打印当前时间。
二、完整代码
#include "Arduino.h" // 引入Arduino核心库
#include <WiFi.h> // 引入Wi-Fi库,以便NanoE能够连接到Wi-Fi网络
#include "time.h" // 引入时间库,以便处理时间和日期
// Wi-Fi网络的SSID和密码
const char* ssid = "xxxx"; // 替换为你的Wi-Fi SSID
const char* password = "123456789"; // 替换为你的Wi-Fi密码
// NTP服务器和时区设置
const char* ntpServer = "pool.ntp.org"; // 使用的NTP服务器
const long gmtOffset_sec = 28800; // GMT+8时区(中国标准时间)
const int daylightOffset_sec = 0; // 不使用夏令时
// 打印本地时间的函数
void printLocalTime() {
struct tm timeinfo; // 创建一个tm结构体用于存储时间信息
if (!getLocalTime(&timeinfo)) { // 获取本地时间,如果失败
Serial.println("获取时间失败"); // 打印错误信息
return; // 退出函数
}
// 打印格式化后的时间信息
Serial.println(&timeinfo, "%A, %Y-%m-%d %H:%M:%S");
}
void setup() {
Serial.begin(115200); // 初始化串口通信,波特率115200
Serial.printf("连接到 %s ", ssid); // 打印正在连接的Wi-Fi SSID
WiFi.begin(ssid, password); // 开始连接到Wi-Fi网络
// 等待连接
while (WiFi.status() != WL_CONNECTED) { // 当Wi-Fi未连接时循环
delay(500); // 等待500毫秒
Serial.print("."); // 打印点以指示正在连接
}
Serial.println(" 连接成功"); // 打印连接成功的信息
// 配置时间
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); // 设置NTP服务器和时区
printLocalTime(); // 打印当前本地时间
// 断开Wi-Fi
WiFi.disconnect(true); // 断开Wi-Fi连接以节省电源
WiFi.mode(WIFI_OFF); // 将Wi-Fi模式设置为关闭
}
void loop() {
printLocalTime(); // 每秒打印一次当前时间
delay(1000); // 延迟1000毫秒(1秒)
}
三、查看输出