esp32-通过wifi使用timelib库同步时间(三)

库的安装

本文基于platformIO,安装较为简单如下图

实例代码

完整代码如下,如果时间获取超时请使用time1.aliyun.com获取时间。

/** Time_NTP.pde* Example showing time sync to NTP time source** This sketch uses the Ethernet library*/#include <WiFi.h>
#include <TimeLib.h>
#include <WiFiUdp.h>struct config_type
{char stassid[32]; // 定义配网得到的WIFI名长度(最大32字节)char stapsw[64];  // 定义配网得到的WIFI密码长度(最大64字节)
};
//---------------修改此处""内的信息--------------------
// 如开启WEB配网则可不用设置这里的参数,前一个为wifi ssid,后一个为密码
config_type wificonf = {{"PDCN"}, {"1234567890"}};
// NTP Servers:
static const char ntpServerName[] = "time1.aliyun.com"; // 阿里云的时间服务器
/*              NTP设置                 */
const int NTP_PACKET_SIZE = 48;                         // NTP time is in the first 48 bytes of message
byte packetBuffer[NTP_PACKET_SIZE];                     // buffer to hold incoming & outgoing packets
const int timeZone = 8; // 时区WiFiUDP Udp;
unsigned int localPort = 8888; // local port to listen for UDP packets/*申明函数*/
time_t getNtpTime();
char *num_week(uint8_t dayofweek, int Mode); // 计算星期
void digitalClockDisplay();
void printDigits(int digits);
void sendNTPpacket(IPAddress &address);void setup()
{Serial.begin(115200);delay(250);Serial.println("TimeNTP Example");Serial.print("Connecting to ");Serial.println(wificonf.stassid);WiFi.begin(wificonf.stassid, wificonf.stapsw);while (WiFi.status() != WL_CONNECTED){delay(500);Serial.print(".");}Serial.print("本地IP:");Serial.println(WiFi.localIP());Serial.println("启动UDP");Udp.begin(localPort);Serial.print("本地端口号: ");Serial.println(Udp.remotePort());Serial.println("waiting for sync");setSyncProvider(getNtpTime);setSyncInterval(300);
}void loop()
{//now();digitalClockDisplay();delay(1000);
}/*
@功能:判断星期并赋值
*/
char week1[10], week2[8], week3[3], week4[4];
char *num_week(uint8_t dayofweek, int Mode)
{switch (dayofweek){case 1:strcpy(week1, "Sunday");strcpy(week2, "周日");strcpy(week3, "Su");strcpy(week4, "日");break;case 2:strcpy(week1, "Monday");strcpy(week2, "周一");strcpy(week3, "Mo");strcpy(week4, "一");break;case 3:strcpy(week1, "Tuesday");strcpy(week2, "周二");strcpy(week3, "Tu");strcpy(week4, "二");break;case 4:strcpy(week1, "Wednesday");strcpy(week2, "周三");strcpy(week3, "We");strcpy(week4, "三");break;case 5:strcpy(week1, "Thursday");strcpy(week2, "周四");strcpy(week3, "Th");strcpy(week4, "四");break;case 6:strcpy(week1, "Friday");strcpy(week2, "周五");strcpy(week3, "Fr");strcpy(week4, "五");break;case 7:strcpy(week1, "Saturday");strcpy(week2, "周六");strcpy(week3, "Sa");strcpy(week4, "六");break;default:strcpy(week1, "NO");strcpy(week2, "无");strcpy(week3, "NO");strcpy(week4, "无");break;}switch (Mode){case 1:return week1;break;case 2:return week2;break;case 3:return week3;break;case 4:return week4;break;}
}void digitalClockDisplay()
{// digital clock display of the timeSerial.print(year());Serial.print("/");Serial.print(month());Serial.print("/");Serial.print(day());Serial.print("   ");Serial.print(hour());printDigits(minute());printDigits(second());Serial.print("   星期");Serial.print(num_week(weekday(), 4));Serial.println();
}void printDigits(int digits)
{// utility for digital clock display: prints preceding colon and leading 0Serial.print(":");if (digits < 10)Serial.print('0');Serial.print(digits);
}/*-------- NTP code ---------*/time_t getNtpTime()
{IPAddress ntpServerIP; // NTP server's ip addresswhile (Udp.parsePacket() > 0); // discard any previously received packetsSerial.println("Transmit NTP Request");// get a random server from the poolWiFi.hostByName(ntpServerName, ntpServerIP);Serial.print(ntpServerName);Serial.print(": ");Serial.println(ntpServerIP);sendNTPpacket(ntpServerIP);uint32_t beginWait = millis();while (millis() - beginWait < 1500){int size = Udp.parsePacket();if (size >= NTP_PACKET_SIZE){Serial.println("Receive NTP Response");Udp.read(packetBuffer, NTP_PACKET_SIZE); // read packet into the bufferunsigned long secsSince1900;// convert four bytes starting at location 40 to a long integersecsSince1900 = (unsigned long)packetBuffer[40] << 24;secsSince1900 |= (unsigned long)packetBuffer[41] << 16;secsSince1900 |= (unsigned long)packetBuffer[42] << 8;secsSince1900 |= (unsigned long)packetBuffer[43];return secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR;}}Serial.println("No NTP Response :-(");return 0; // return 0 if unable to get the time
}// send an NTP request to the time server at the given address
void sendNTPpacket(IPAddress &address)
{// set all bytes in the buffer to 0memset(packetBuffer, 0, NTP_PACKET_SIZE);// Initialize values needed to form NTP request// (see URL above for details on the packets)packetBuffer[0] = 0b11100011; // LI, Version, ModepacketBuffer[1] = 0;          // Stratum, or type of clockpacketBuffer[2] = 6;          // Polling IntervalpacketBuffer[3] = 0xEC;       // Peer Clock Precision// 8 bytes of zero for Root Delay & Root DispersionpacketBuffer[12] = 49;packetBuffer[13] = 0x4E;packetBuffer[14] = 49;packetBuffer[15] = 52;// all NTP fields have been given values, now// you can send a packet requesting a timestamp:Udp.beginPacket(address, 123); // NTP requests are to port 123Udp.write(packetBuffer, NTP_PACKET_SIZE);Udp.endPacket();
}

实验结果如下

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

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

相关文章

Kafka入门介绍+集群部署+简单使用

Kafka入门介绍集群部署简单使用 简介核心概念Broker&#xff08;服务节点/实例&#xff09;Producer&#xff08;生产者&#xff09;Topic&#xff08;主题&#xff09;Partition&#xff08;分区&#xff09;Consumer&#xff08;消费者&#xff09;和Consumer Group&#xff…

对组合模式的理解

目录 一、场景1、题目描述 【[案例来源](https://kamacoder.com/problempage.php?pid1090)】2、输入描述3、输出描述4、输入示例5、输出示例 二、实现&#xff08;假的组合模式&#xff09;1、代码2、为什么上面的写法是假的组合模式&#xff1f; 三、实现&#xff08;真的组合…

文本生成任务的评价方法BLEU 和 ROUGE

BLEU 是 2002 年提出的&#xff0c;而 ROUGE 是 2003 年提出的。这两种指标虽然存在着一些问题&#xff0c;但是仍然是比较主流的评价指标。 BLUE BLEU 的全称是 Bilingual evaluation understudy&#xff0c;BLEU 的分数取值范围是 0&#xff5e;1&#xff0c;分数越接近1&a…

YOLOv9改进策略 | 细节创新篇 | 迭代注意力特征融合AFF机制创新RepNCSPELAN4

一、本文介绍 本文给大家带来的改进机制是AFF&#xff08;迭代注意力特征融合&#xff09;&#xff0c;其主要思想是通过改善特征融合过程来提高检测精度。传统的特征融合方法如加法或串联简单&#xff0c;未考虑到特定对象的融合适用性。iAFF通过引入多尺度通道注意力模块(我…

算法打卡day52|单调栈篇03| 84.柱状图中最大的矩形

算法题 Leetcode 84.柱状图中最大的矩形 题目链接:84.柱状图中最大的矩形 大佬视频讲解&#xff1a;84.柱状图中最大的矩形视频讲解 个人思路 这题和接雨水是相似的题目&#xff0c;原理上基本相同&#xff0c;也是可以用双指针和单调栈解决&#xff0c;只是有些细节不同。…

锦瑟香也MYLOVE:音质与颜值俱佳,入坑HiFi的热门好物!

当下尽管无线耳机大行其道&#xff0c;但有线耳机依旧保有其独特的魅力&#xff0c;特别是在音质表现上&#xff0c;它们拥有无线耳机难以企及的优势。如果对音质要求很高的话&#xff0c;口袋里还是少不了一副有线耳机。国产品牌中就有许多性价比高的有线耳机&#xff0c;它们…

Django admin后台添加自定义菜单和功能页面

django admin是根据注册的模型来动态生成菜单&#xff0c;从这个思路出发&#xff0c;如果想添加自定义菜单&#xff0c;那就创建一个空模型并且注册。步骤如下&#xff1a; 1、创建空模型&#xff1a; class ResetSVNAuthFileModel(models.Model):"""仅用来显…

《MATLAB科研绘图与学术图表绘制从入门到精通》示例:绘制伊甸火山3D网格曲面图

11.4.2小节我们使用3D曲面图可视化分析伊甸火山数据&#xff0c;本小节我们采用3D网格曲面图可视化分析伊甸火山数据&#xff0c;以展示其地形&#xff0c;具体示例代码如下。 购书地址&#xff1a;https://item.jd.com/14102657.html

Django数据导出与导入问题

执行: python manage.py loaddata data.json 的常见错误: * 1. UnicodeDecodeError: utf-8 codec cant decode byte 0xff in position 0: invalid start byte* 2. raise JSONDecodeError("Unexpected UTF-8 BOM (decode using utf-8-sig)",...django.core.serializer…

css animation 动画详细学习

学习 CSS 动画是一个深入且富有创造性的过程&#xff0c;它允许开发者创建出引人入胜且交互性强的网页效果。以下是对 CSS 动画学习的一些总结和要点&#xff1a; 1. 关键帧动画&#xff08;keyframes&#xff09; 使用 keyframes 规则定义动画的整个过程。在 keyframes 中&a…

聚道云软件连接器助力企业实现滴滴出差报销自动化

一、客户介绍 某机械有限公司是一家在机械设备制造领域拥有深厚底蕴和卓越实力的企业。自公司成立以来&#xff0c;该公司始终秉承创新、务实、高效的发展理念&#xff0c;专注于机械设备的研发、生产和销售。经过多年的发展&#xff0c;公司已成为国内机械行业的佼佼者&#…

RocketMQ异步消息发送失败重试DEMO

producer.setRetryTimesWhenSendAsyncFailed(3); 都知道通过设置&#xff0c;尝试是在MQClientAPIImpl 中完成 其重试是通过MQClientAPIImpl的onExceptionImpl方法来实现&#xff0c;它会先判断重试次数&#xff0c;然后重新调用sendMessageAsync方法进行重试&#xff0c;调用…

新手必看!嵌入式STM32-PID

本文目录 一、知识点1. 位置式pid&#xff08;1&#xff09;公式&#xff08;2&#xff09;代码 2. 串级PID简易代码 一、知识点 1. 位置式pid &#xff08;1&#xff09;公式 &#xff08;2&#xff09;代码 pid.c typedef struct PID {float Kp; // Proportion…

高效编程工具 JetBrains CLion 2024 中文激活 mac/win

在追求编程高效与精准的道路上&#xff0c;JetBrains CLion 2024 for Mac无疑是您的最佳伙伴。这款专为Mac用户打造的C/C集成开发环境&#xff0c;凭借其强大的功能和出色的性能&#xff0c;赢得了广大开发者的青睐。 CLion 2024拥有智能的代码编辑器和强大的代码分析工具&…

pycharm已有项目增加pipenv

pycharm已有项目增加pipenv 第一步 第一步 python base 需要安装pipenv pip install pipenv在设置&#xff0c;project 之后 会自动查找项目下的pipfile 和pipfile.lock 进行pip配置 如果网络较慢&#xff0c;可以修复pipfile下的url 为国内的pip源 [[source]] name "…

Linux入门学习 之 基础操作指令讲解(小白必看)

股票的规律找到了&#xff0c;不是涨就是跌 一、Linux下基本指令 1.ls 指令 2.pwd 命令 3.cd 指令 4.touch 指令 5.mkdir 指令 6.rmdir指令 && rm 指令 7.man 指令 8.cp 指令 9.mv指令 10.cat 11.more 指令 12.less 指令 13.head 指令 14.tail 指令 15…

新兴存内计算芯片架构、大型语言模型、多位存内计算架构——存内计算架构的性能仿真与对比分析探讨

CSDN存内社区招募&#xff1a;https://bbs.csdn.net/forums/computinginmemory? 首个存内计算开发者社区&#xff0c;现0门槛新人加入&#xff0c;发文享积分兑超值礼品&#xff1b; 存内计算先锋/大使在社区投稿&#xff0c;可获得双倍积分&#xff0c;以及社区精选流量推送…

Redis进阶——点赞和点赞排行

目录 发布达人探店笔记实现步骤 查看探店笔记点赞功能问题分析&#xff1a;功能完善具体实现 点赞排行榜实现需求实现步骤 发布达人探店笔记 实现类似于大众点评的发布个人笔记的效果 实现步骤 准备数据表如下&#xff1a; SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;…

与助听器相关的职业主要有哪些?

助听装置是目前解决听觉障碍的几乎唯一科学的方法。然而助听装置改变的不是听力&#xff0c;而是外界的声音信息。也就是助听装置只能将外界的声音信息改变成能够适应听觉障碍患者听觉动态范围的声音。显然助听器并不知道听觉障碍患者的听觉动态范围是多少&#xff1f;也不知道…

分布式系统——全站监控

文章目录 全站监控要点**监控范围与对象****监控指标与数据****监控工具与技术****监控策略与实践****全站监控的价值** 实例展示 全站监控要点 全站监控是针对分布式架构中所有组件和服务进行全方位、多层次、实时的性能监控、状态检测和故障告警的系统化方法。在分布式环境下…