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…

单链表与双链表

实现一个单链表,链表初始为空,支持三种操作: 向链表头插入一个数;删除第 k 个插入的数后面的一个数;在第 𝑘 个插入的数后插入一个数。现在要对该链表进行 M 次操作,进行完所有操作后,从头到尾输出整个链表。 注意:题目中第 k 个插入的数并不是指当前链表的第 k 个数…

fuel无人机自主探索代码解读1——map_ros.cpp【地图ros接口】

一、概述 map_ros.cpp订阅深度图/雷达点云、世界坐标下传感器pose&#xff0c;每0.05s启动esdf地图更新&#xff0c;每0.05s进行全局地图和局部地图可视化。主要功能为&#xff1a;接受传感器数据、调用sdf_map.cpp文件内部膨胀地图及esdf地图更新接口、地图可视化等。涉及传感…

Python笔记:比较运算符

比较运算符也叫关系运算符。 Python的比较运算符及用法&#xff1a; 比较运算符描述写法等于x y!不等于x ! y>大于x > y<小于x < y>大于等于x > y<小于等于x < y 1、比较运算符会返回布尔类型的结果。&#xff08;True / False&#xff09; num1 …

数电发票、全电发票为什么不是连号的?Node.js发票查验接口集成

全电发票号码为全国统一赋码&#xff0c;采用的是20位发票号码&#xff0c;其实是连续的。只是在实际开票过程中&#xff0c;不止一位纳税人在开&#xff0c;有其他纳税人也在开&#xff0c;所以会出现对某一个纳税人来说号码没有连续的情况。那么&#xff0c;全电发票如何进行…

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;集成组件在各行各业的应用中扮演着举足轻重的角色。集成组件能够将不同来源的…

更正:vue3升级nuxt3,server怎么修改

先给结论&#xff1a;放在nuxt.config.ts的vite中 在Nuxt配置中&#xff0c;nitro和vite的proxy配置虽然都可以用来处理代理&#xff0c;但它们的用途和作用范围有所不同。以下是它们的主要区别&#xff1a; nitro.devServer.proxy nitro 是 Nuxt 3 的服务器引擎&#xff0c…

【halcon踩坑】由于引用dll不一致导致的大坑。

背景 由于引用dll不一致导致的大坑,差点没跳出来。我们知道,halcon 有两个dll: halcondotnet和halcondotnetxl。 平时用的都是halcondotnet,halcondotnetxl时为了应付大图。 比如线扫相机扫出的大图。 踩坑 我的主项目中用到的halcondotnet,子项目中使用的halcondotne…

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

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

LLaMA-Factory环境安装-重点总结

问题&#xff1a;在使用官网介绍的博客&#xff0c;进行安装&#xff0c;比较顺利。只不过&#xff0c;在需要推理加速时&#xff0c;UI界面上&#xff0c;给出的选项所支持的FlashAttention-2和Unsloth&#xff0c;不好实现。在进行一系列的调整&#xff0c;总结如下&#xff…

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

计算机网络数据链路层和物理层 节点&#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;投资者等待本周的关键通胀数据为今年美国降息提供更多…

机器学习——线性回归模型

目录 一、算法思想 二、代码实现 一、算法思想 线性回归模型的训练和预测&#xff0c;并包含了数据预处理、损失函数计算、梯度下降优化等步骤。以下是算法的主要步骤&#xff1a; 1. 数据加载与预处理(load_data函数): 从sklearn.datasets中加载波士顿房价数据集。将数据集…