ESP32重要库示例详解(四):获取NTP时间之time库

在物联网项目中,时间同步和管理是至关重要的功能之一,特别是在需要执行定时任务或记录事件时间戳的场景下。Arduino平台通过其内置的<time.h>库提供了强大的时间处理能力,使得开发者能够方便地与网络时间协议(NTP)服务器同步时间,并在本地进行各种日期和时间的操作。本文将通过一个实例项目,介绍如何使用Arduino的Time库来连接WiFi并获取NTP时间,从而为你的项目提供准确的时间服务。
在这里插入图片描述

准备工作

  • 硬件需求:任意支持WiFi的Arduino板(如ESP32、ESP8266等)。
  • 软件需求:Arduino IDE或者PlatformIO,用于编写、上传代码。

使用的库与功能

  • WiFi库:负责建立与WiFi网络的连接。
  • Time库:核心在于configTime()函数,用于配置NTP同步,以及getLocalTime()函数,用于获取当前的本地时间。

示例代码解析

引入必要的库与定义配置

// WiFi配置参数
const char *ssid = "xxx";              // WiFi SSID
const char *password = "xxxxxxxx";    // WiFi密码
int retryCount = 0;                     // WiFi连接重试计数// NTP配置参数, 使用阿里云的NTP服务器
const char *ntpServer = "ntp1.aliyun.com";
const long gmtOffset_sec = 8 * 3600;    // 时区偏移量,北京是GMT+8
const int daylightOffset_sec = 0;       // 夏令时偏移量,中国无夏令时

初始化与连接WiFi

void setup()
{// 连接WiFiWiFi.begin(ssid, password);// 初始化串口通信Serial.begin(115200);// 循环等待WiFi连接成功while (WiFi.status() != WL_CONNECTED){delay(1000);Serial.println("Connecting to WiFi..");retryCount++;if (retryCount >= 10){break; // 最多重试10次}}// 打印连接成功信息及IP地址Serial.println("Connected to the WiFi network");Serial.println("IP address:");Serial.println(WiFi.localIP());// 配置NTP服务器,开始同步时间configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
}

获取并显示本地时间

void printLocalTime()
{struct tm timeinfo;if (!getLocalTime(&timeinfo)){Serial.println("Failed to obtain time");return;}// 格式化并打印时间Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
}

主循环与时间更新

void loop()
{printLocalTime(); // 打印当前本地时间delay(1000); // 每秒更新一次时间
}

完整代码

/** 主程序文件* 包含了连接WiFi和获取NTP时间的功能示例*/// 包含必要的头文件
#include <Arduino.h>
#include <WiFi.h>
#include <time.h>// WiFi配置参数
const char *ssid = "xxx2";              // WiFi SSID
const char *password = "asdfgzxcvb";    // WiFi密码
int retryCount = 0;                     // WiFi连接重试计数// NTP配置参数, 使用阿里云的NTP服务器
const char *ntpServer = "ntp1.aliyun.com";
const long gmtOffset_sec = 8 * 3600;    // 时区偏移量,北京是GMT+8
const int daylightOffset_sec = 0;       // 夏令时偏移量,中国无夏令时//打印本地时间
void printLocalTime()
{struct tm timeinfo;if (!getLocalTime(&timeinfo)){Serial.println("Failed to obtain time");return;}// 格式化并打印时间Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
}void setup()
{// 连接WiFiWiFi.begin(ssid, password);// 初始化串口通信Serial.begin(115200);// 循环等待WiFi连接成功while (WiFi.status() != WL_CONNECTED){delay(1000);Serial.println("Connecting to WiFi..");retryCount++;if (retryCount >= 10){break; // 最多重试10次}}// 打印连接成功信息及IP地址Serial.println("Connected to the WiFi network");Serial.println("IP address:");Serial.println(WiFi.localIP());// 配置NTP服务器,开始同步时间configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
}
void loop()
{printLocalTime(); // 打印当前本地时间delay(1000); // 每秒更新一次时间
}

结论

通过上述步骤,我们不仅学习了如何在Arduino项目中集成WiFi功能,还深入了解了如何利用Time库进行NTP时间同步,这对于构建需要精确时间控制的项目至关重要。此方法简单有效,适用于各种需要时间同步的物联网应用,如智能家庭设备、气象站或是自动控制系统,大大提升了项目的实用性和准确性。

另外,代码并不是每秒都向NTP服务器发送新的请求。代码中的loop()函数确实每秒执行一次printLocalTime()函数,但printLocalTime()本身并不直接发送NTP请求。configTime()函数在setup()中调用了一次,配置了NTP服务器并启动了时间同步,之后的时间获取是通过getLocalTime()函数完成的,这个函数会从已经同步的系统时间中获取信息,而不是每次调用时都去发送一个新的NTP请求。

在实际的NTP协议操作中,通常客户端不会频繁地向服务器发送请求,而是根据需要和NTP的工作机制来决定何时进行同步。在Arduino的环境中,由于资源限制,通常会尽量减少网络通信,所以时间同步通常是周期性的,而不是每秒一次。如果需要频繁获取网络时间,可能会采用更优化的策略,例如缓存时间并在一定间隔后重新同步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/837563.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PDF文件转换为CAD的方法

有时候我们收到一个PDF格式的设计图纸&#xff0c;但还需要进行编辑或修改时&#xff0c;就必须先将PDF文件转换回CAD格式。分享两个将PDF转换回CAD的方法&#xff0c;一个用到在线网站&#xff0c;一个用到PC软件&#xff0c;大家根据情况选择就可以了。 ☞在线CAD网站转换 …

css超出部分省略(单行、多行,多种方法实现)

HTML <p class"text">这是一行测试数据,这是一行测试数据,这是二行测试数据,这是一行测试数据,这是三行测试数据,这是四行测试数据</p>1.单行 .text{width: 200px;border: 1px solid #000000;white-space: nowrap; /* 控制元素不换行 */overflow: hi…

Django图书馆综合项目-学习(2)

接下来我们来实现一下图书管理系统的一些相关功能 1.在书籍的book_index.html中有一个"查看所有书毂"的超链接按钮&#xff0c;点击进入书籍列表book_list.html页面. 这边我们使用之前创建的命名空间去创建超连接 这里的book 是在根路由创建的namespacelist是在bo…

6. RedHat认证-基于公钥的认证方式

6. RedHat认证-基于公钥的认证方式 主要学习客户端访问服务端的时候&#xff0c;免密登录这一方式 注意: 免密登录只是基于公钥认证的一个附带属性(基于公钥认证的方式更加安全&#xff0c;防止黑客暴力破解) 第一步&#xff1a;将客户端生成的秘钥传送到服务器 在客户端通过…

2024中国(厦门)国际医用消毒及感控设备展览会

2024中国&#xff08;厦门&#xff09;国际医用消毒及感控设备展览会 2024 China (Xiamen) International Medical Disinfection And Infection Control Exhibition 致力于打造医用消毒及感控设备产业采购一站式平台 时 间&#xff1a;2024年11月1-3日 November 1-3, 2024 …

一文扫盲(13):电商管理系统的功能模块和设计要点

电商管理系统是一种用于管理和运营电子商务平台的软件系统。它提供了一系列功能模块&#xff0c;帮助企业进行商品管理、订单管理、会员管理、营销推广、数据分析等工作。本文将从以下四个方面介绍电商管理系统。 一、什么是电商管理系统 电商管理系统是一种集成了各种功能模块…

免费的集成组件有哪些?

集成组件是指将多个软件或系统进行整合&#xff0c;以实现更高效、更可靠的数据处理和管理。在数据管理和分析领域&#xff0c;集成组件是不可或缺的工具之一。 在当今高度信息化的时代&#xff0c;集成组件在各行各业的应用中扮演着举足轻重的角色。集成组件能够将不同来源的…

企业安全必备利器:专业级加密软件介绍

随着信息技术的迅猛发展&#xff0c;数据安全问题日益凸显&#xff0c;专业级加密软件应运而生&#xff0c;成为保护数据安全的重要工具。本文将对专业级加密软件进行概述&#xff0c;分析其特点、应用场景及分享。 一、专业级加密软件概述 专业级加密软件是指那些采用高级加密…

三分钟了解计算机网络核心概念-数据链路层和物理层

计算机网络数据链路层和物理层 节点&#xff1a;一般指链路层协议中的设备。 链路&#xff1a;一般把沿着通信路径连接相邻节点的通信信道称为链路。 MAC 协议&#xff1a;媒体访问控制协议&#xff0c;它规定了帧在链路上传输的规则。 奇偶校验位&#xff1a;一种差错检测方…

uniapp怎么使用jsx

安装vitejs/plugin-vue-jsx npm install vitejs/plugin-vue-jsx -Dvite.config.js配置 import { defineConfig } from "vite"; import uni from "dcloudio/vite-plugin-uni"; import vueJsx from vitejs/plugin-vue-jsxexport default defineConfig({plu…

upload-labs靶场通关详解(1-15)

1.pass-01 查看源代码 是js&#xff0c;属于前端校验 可以通过禁用js来上传文件 2.pass-02 根据提示是MIME绕过 MIME&#xff1a;是设定某种扩展名的文件 用一种应用程序来打开的方式类型&#xff0c;当该扩展名文件被访问的时候&#xff0c;浏览器会自动使用指定应用程序来…

冯喜运:5.14黄金价格空头延续反弹空,原油走势分析实时操作

【黄金消息面分析】&#xff1a;周二&#xff08;5月14日&#xff09;亚洲时段&#xff0c;现货黄金窄幅震荡&#xff0c;目前交投于2342美元/盎司。金价周一因获利了结下跌1%&#xff0c;收报2336.10美元/盎司&#xff0c;投资者等待本周的关键通胀数据为今年美国降息提供更多…

使用Subtitle edit合成双语字幕

有的时候从网上下载的字幕有单独的中文版和英语版&#xff0c;但是没有中英文一起的双语字幕&#xff1a; 后缀为chs的是中文简体后缀为cht的是中文繁体后缀为eng的是英文 如果我们在电脑端上可以直接用potplayer添加副字幕来实现双语&#xff0c;但是如果是别的播放器&#…

多线程·线程状态

目录 1.等待一个线程 join 2.休眠当前线程 3.线程的所有状态 4.线程的状态转换 1.等待一个线程 join 有些场景&#xff0c;我们需要控制线程的执行顺序&#xff0c;这时候就需要用到 join 了 比如&#xff1a;把大象装进冰箱要几步&#xff1f; 第一步&#xff1a;打开冰…

【数据结构陈越版笔记】第1章 概论

我最近准备以陈姥姥的数据结构教材为蓝本重新学一下数据结构&#xff0c;写一下读书笔记 第1章 概论 1.1 引子 概论中首先描述了&#xff0c;数据结构的定义没有具体的定义&#xff0c;初学者可以不用管这个定义的问题&#xff0c;但是我理解的和维基百科的说法是一样的“数…

全面了解 Swagger 导出功能的使用方式

Swagger 是一个强大的平台&#xff0c;专门用于开发、构建和记录 RESTful Web 接口。通过其提供的交互式用户界面&#xff0c;开发人员能够轻松且迅速地创建和测试 API。Swagger 还允许用户以多种格式&#xff0c;包括 JSON 和 Markdown&#xff0c;导出 API 文档。选择 JSON 格…

人工神经网络(科普)

人工神经网络&#xff08;Artificial Neural Network&#xff0c;即ANN &#xff09;&#xff0c;是20世纪80 年代以来人工智能领域兴起的研究热点。它从信息处理角度对人脑神经元网络进行抽象&#xff0c; 建立某种简单模型&#xff0c;按不同的连接方式组成不同的网络。在工程…

MySQL中的索引失效问题

索引失效的情况 这是正常查询情况&#xff0c;满足最左前缀&#xff0c;先查有先度高的索引。 1. 注意这里最后一种情况&#xff0c;这里和上面只查询 name 小米科技 的命中情况一样。说明索引部分丢失&#xff01; 2. 这里第二条sql中的&#xff0c;status > 1 就是范围查…

什么品牌洗地机最好?怎么选?2024家用洗地机推荐攻略

随着科技的不断发展&#xff0c;家用洗地机已经成为人们家庭清洁任务重非常重要的辅助工具。家用洗地机集吸尘、扫地、拖地等功能于一体&#xff0c;通过高速旋转的滚刷和强力的吸力&#xff0c;将地面上的污渍、细菌和毛发等吸入污水箱&#xff0c;从而达到清洁地面的目的。但…

软件验收测试包括哪些类型

在软件开发过程中&#xff0c;验收测试是一个至关重要的环节&#xff0c;它确保了软件的质量、功能性和用户体验符合预期。验收测试主要关注于软件是否满足用户需求和业务目标&#xff0c;从而确保软件能够顺利交付并投入使用。本文将介绍软件验收测试的主要类型及其关键要素。…