esp12实现的网络时钟校准

网络时间的获取是通过向第三方服务器发送GET请求获取并解析出来的。

在本篇博客中,网络时间的获取是一种自动的行为,当系统成功连接WiFi获取到网络天气后,系统将自动获取并解析得到时间和日期,为了减少误差每两分钟左右进行一次校准。在网络时间成功获取后,定时器中时间计数从这个数开始,并且到达一定数目,系统自动更新上下午和日期信息。

时间日期显示设计如图所示:

访问网络服务器校准网络时钟,需要了解服务器返回给我们的json字符串格式。可以用CJSON库进行解析,但是这里我采用手动解析。

            {"success": "1","result": {"timestamp": "1718090343","datetime_1": "2024-06-11 15:19:03","datetime_2": "2024年06月11日 15时19分03秒","week_1": "2","week_2": "星期二","week_3": "周二","week_4": "Tuesday"}}

对应的接收代码

if(comGetChar(COM3,&getChar))
{	switch(state){case 0:if(getChar == '{'){ state=1;}Recv_len=0;break;case 1:if(getChar == '}') {state=0;Recv_CommandFlag=TIMERECV;}else{*(Recv_Buf+Recv_len) = getChar;Recv_len++;printf("%c",getChar);if(Recv_len>=210){Recv_CommandFlag=UNRECV;state=0;}}break;default:break;}}

 解析调用

Recv_CommandFlag = 0;ret = timeParse(Recv_Buf);if(ret == 0){Times_Change(myday,mymonth,myyear);    //计算当前日期Display_days(myyear, mymonth, myday);  //显示日期GetTimes(myhour,myminute,mysecond);Display_time(TIMES);}else{printf("\r\ntimeParse fail\r\n");}NetStatus=ESP_TLINK_INIT;//回去弄tlink看看是不是有网

mytime.c

#include "mytime.h"
#include "esp8266.h"volatile uint32_t TIMES = 0;void GetTimes(char h,char m, char s )
{TIMES=h*60*60+m*60+s;return;
}
void Times_Change(unsigned char d, unsigned char m, int y)
{if(m == 2)    //如果是2月{if(d == 29){if(!((((y%4) == 0) && ((y%100) != 0)) || ((y % 400) == 0)))  //如果不是闰年{m ++;    d = 1;}}else if(d == 30){if((((y%4) == 0) && ((y%100) != 0)) || ((y % 400) == 0))  //如果是闰年{m ++;    d = 1;}}	 }else if(d == 31){if(m == 4 | m == 6 | m == 9 | m == 11){ m ++; d = 1;}}else if(d > 31){							 if(m == 12){y ++;m = 1;d = 1;}								 else{m ++; d = 1;}}
}/*-------------------------------------------------------------*计算时间函数  *起始页地址  宏定义  TIME_START_PAGE*起始列地址  宏定义  TIME_START_COL*时间  times   为0~86399,即24小时最大秒数*分别计算出时 分 秒 上 下午 并显示在相应位置*-------------------------------------------------------------*/
void Display_time(unsigned int times)    
{char timeStr_lvgldisp[30];unsigned int temp_time = times;unsigned char temp_hour, temp_minutues, temp_seconds;unsigned char t_h_ten, t_h_one, t_m_ten, t_m_one, t_s_ten, t_s_one;char timewhen;temp_hour = times / 3600;            //得到小时数temp_minutues =(times % 3600) / 60;  //得到分钟数temp_seconds = (times % 3600) % 60;  //得到秒数myhour=temp_hour;myminute=temp_minutues;mysecond=temp_seconds;t_h_ten = temp_hour / 10;          //取小时十位数t_h_one = temp_hour % 10;          //取小时个位数t_m_ten = temp_minutues /10;       //取分钟十位数t_m_one = temp_minutues %10;       //取分钟个位数t_s_ten = temp_seconds /10;        //取秒十位数t_s_one = temp_seconds %10;        //取秒个位数if(temp_time < 43200)    //上午{timewhen='A';}else  //下午{timewhen='P';}sprintf((char *)timeStr_lvgldisp, "%d%d:%d%d:%d%d-%cM",t_h_ten,t_h_one,t_m_ten,t_m_one,t_s_ten,t_s_one,timewhen);printf("\r\ntimeStr:%s\n\r",(char *)timeStr_lvgldisp);
}/*-------------------------------------------------------------*计算日期和星期函数*日期起始页地址  宏定义  DAYS_START_PAGE*日期起始列地址  宏定义  DAYS_START_COL*星期起始页地址  宏定义  WEEK_START_PAGE*星期起始列地址  宏定义  WEEK_START_COL*日期  days   为0~86399,即24小时最大秒数*计算出星期 和日期 并显示在相应位置** 吉姆拉尔森公式:w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)mod7*w:week, y = year , m = moon, d = day , 1月=13月,2月=14月*w = 0,星期一 ~ w = 6,星期日 *-------------------------------------------------------------*/
void Display_days(int year, unsigned char moon, unsigned char day)
{char dateStr[20];int temp_year, temp_moon, temp_day, temp_week;unsigned char t_y_frist, t_y_second, t_y_thrid, t_y_forth;unsigned char t_m_ten, t_m_one, t_d_ten, t_d_one;int y, m, d;temp_year = year;temp_moon = moon; temp_day = day;t_y_frist = temp_year / 1000;t_y_second = (temp_year % 1000) / 100;t_y_thrid = (temp_year % 100) / 10;t_y_forth = temp_year % 10;t_m_ten = temp_moon / 10;t_m_one = temp_moon % 10;t_d_ten = temp_day / 10;t_d_one = temp_day % 10;y = year;m = moon;d = day;if((m == 1) || (m == 2)){m += 12;y --;}temp_week = ((d +2*m + 3*(m + 1) / 5 + y +y/4 - y /100 +y/400)%7)+1;   //计算星期几 myweek = temp_week;  //汉字一为第1个字符,方便计算sprintf((char *)dateStr, "%d%d%d%d-%d%d-%d%d:%d",t_y_frist,t_y_second,t_y_thrid,t_y_forth,t_m_ten,t_m_one,t_d_ten,t_d_one,temp_week);printf("dateStr:%s\n\r",(char *)dateStr);
}

mytime.h

#ifndef __MYTIME__
#define __MYTIME__#include "stdint.h"extern volatile uint32_t TIMES;//extern char timeStr_lvgldisp[30];void Times_Change(unsigned char d, unsigned char m, int y);
void Display_time(unsigned int times);
void Display_days(int year, unsigned char moon, unsigned char day);
void GetTimes(char h,char m, char s );#endif

发起请求

ESP_Fefresh_NET_Massage(wifi_ssid,wifi_password,time_address,time_point,GetNet_Time);	

key str的链接,删掉“GET”后复制粘贴浏览器应该是可以看到json字符串的,看不到就说明你模块怎么访问都不会获得的,建议自己先访问看一下 

//time
char time_keystr[150]="GET http://api.k780.com:88/?app=life.time&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json&HTTP/1.1\r\n";
char time_address[25]="api.k780.com";
char time_point[5]="88";//日期时间变量
int myyear=2024;
int mymonth=6;
int myweek=3;
int myday=12;
int myhour=21;
int myminute=31;
int mysecond=56;char subdatetime_1[20]; 
//char subdatetime_2[8];u8 timeParse(char * timestr)
{char *datetime1_start = strstr(timestr,"datetime_1"); if (datetime1_start != NULL) {datetime1_start += (strlen("datetime_1")+3); strncpy(subdatetime_1, datetime1_start, 19); subdatetime_1[19] = '\0'; printf("datetime_1: %s\r\n", subdatetime_1);sscanf(subdatetime_1, "%d-%d-%d %d:%d:%d", &myyear, &mymonth, &myday, &myhour, &myminute, &mysecond);GetTimes(myhour,myminute,mysecond);return 0;} else {printf("\r\nKey not found\r\n");return 1;}
}/*-------------------------------------------------* 更新网络时间函数* 已经连接WIFI,定期连接TCP更新网络时间
-------------------------------------------------*/u8 ESP_Fefresh_NET_Massage(char *ssid,char *pwd,const char *tcp_addr, char *point, void (*function)())
{char tcp_information[160]={0};char wifi_information[56]={0};   //WiFi热点临时数组u8 return_temp = 0;comSendBuf(COM3, (uint8_t *)"+++", 3);vTaskDelay(3000);ESP12_SendAT("AT");if (ESP12_WaitResponse("OK", 5000) != 1){printf("\r\n AT fail!\r\n");failnum|=(1<<0);//vTaskDelay(1000);}	ESP12_SendAT("ATE0");if (ESP12_WaitResponse("OK", 5000) != 1){printf("\r\n ATE0 fail\r\n");failnum|=(1<<1);vTaskDelay(1000);}	ESP12_SendAT("AT+CWMODE=1");if (ESP12_WaitResponse("OK", 5000) != 1){printf("\r\n CWMODE fail\r\n");failnum|=(1<<2);vTaskDelay(2000);}sprintf(wifi_information, "AT+CWJAP=\"%s\",\"%s\"", ssid, pwd);  //将WiFi热点名称和密码			ESP12_SendAT(wifi_information);if (ESP12_WaitResponse("OK", 5000) != 1){printf("\r\n CWJAP fail\r\n");failnum|=(1<<3);//vTaskDelay(1000);}sprintf(tcp_information, "AT+CIPSTART=\"TCP\",\"%s\",%s", tcp_addr, point);  //将TCP,地址和端口号传给临时变量//	printf("%s\n",tcp_information);ESP12_SendAT(tcp_information);if (ESP12_WaitResponse("OK", 5000) != 1){printf("\r\n CIPSTART fail\r\n");failnum|=(1<<4);//vTaskDelay(1000);}ESP12_SendAT("AT+CIPMODE=1");if (ESP12_WaitResponse("OK", 3000) != 1){printf("\r\n CIPMODE fail\r\n");failnum|=(1<<5);//vTaskDelay(1000);}ESP12_SendAT("AT+CIPSEND");if (ESP12_WaitResponse("OK", 1000) != 1){printf("\r\n CIPMODE fail\r\n");//vTaskDelay(1000);failnum|=(1<<6);}// Send KeyStrfunction();return 0;
}

注意两个gettime不一样,一个是更新时间,一个是发起GET请求

“>”是访问成功的标志

可以参考这位博主的博客:

ESP8266获取网络时间 实时时钟-CSDN博客


//获取网络时间并解析给系统
void GetNet_Time(void)
{	if (failnum!=0){failnum=0;WIFI_LOGO=HIDE;vTaskDelay(1000);//NetStatus=ESP_TLINK_INIT;//回去弄tlink看看是不是有网}else{uart2SendStr(time_keystr);  //发送GET请求	if(ESP12_WaitResponse(">", 10000) == 1){printf("\r\n time server connected!\r\n");NetStatus=ESP_TIME_CONNECTED;WIFI_LOGO=SHOW;failnum=0;}}
}

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

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

相关文章

web平台—apache

web平台—apache 1. 学apache前需要知道的知识点2. apache详解2.1 概述2.2 工作模式2.3 启动apache网站整体流程2.4 相关文件保存位置2.5 配置文件详解 3. apache配置实验实验1&#xff1a;设置apache的目录别名实验2&#xff1a;apache的用户认证实验3&#xff1a;虚拟主机 (重…

江门MES制造执行系统:助力工厂实现智能化管理

江门MES制造执行系统(MES)在工厂实现智能化管理方面发挥着重要作用&#xff0c;以下是它的一些助力方面&#xff1a; 实时监控与控制&#xff1a;江门MES系统可以实时监控生产过程中的各个环节&#xff0c;包括设备状态、生产进度、质量指标等&#xff0c;帮助工厂管理人员及时…

LW-DETR: A Transformer Replacement to YOLO for Real-Time Detection

LW-DETR: A Transformer Replacement to YOLO for Real-Time Detection 论文链接&#xff1a;http://arxiv.org/abs/2406.03459 代码链接&#xff1a;https://github.com/Atten4Vis/LW-DETR 一、摘要 介绍了一种轻量级检测变换器LWDETR&#xff0c;它在实时物体检测方面超越…

CF1981D Turtle and Multiplication 题解

Turtle and Multiplication 传送门 Turtle just learned how to multiply two integers in his math class, and he was very excited. Then Piggy gave him an integer n n n , and asked him to construct a sequence a 1 , a 2 , … , a n a_1, a_2, \ldots, a_n a1​,…

Java [ 基础 ] Stream流 ✨

✨探索Java基础Stream流✨ 在现代Java编程中&#xff0c;Stream是一个非常强大的工具&#xff0c;它提供了一种更高效和简洁的方式来处理集合数据。在这篇博客中&#xff0c;我们将深入探讨Java中的Stream流&#xff0c;介绍它的基础知识、常见操作和一些实用示例。 什么是Str…

10-错误-java.lang.IllegalStateException Stopwatch is not running

10-错误-java.lang.IllegalStateException Stopwatch is not running 更多内容欢迎关注我&#xff08;持续更新中&#xff0c;欢迎Star✨&#xff09; Github&#xff1a;CodeZeng1998/Java-Developer-Work-Note 技术公众号&#xff1a;CodeZeng1998&#xff08;纯纯技术文&…

用易查分下发《致家长一封信》,支持在线手写签名,一键导出PDF!

暑假来临之际&#xff0c;学校通常需要下发致家长信&#xff0c;以正式、书面的形式向家长传达重要的通知或建议。传统的发放方式如家长签字后学生将回执单上交&#xff0c;容易存在丢失、遗忘的问题。 那么如何更高效、便捷、安全地将致家长一封信送达给每位家长呢&#xff1f…

Linux[高级管理]——Squid代理服务器的部署和应用(反向代理详解)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f468;‍&#x1f4bb;Linux高级管理专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月24日11点11分 &#x1f004;️文章质量&#xff1a;95分 目录 ————前言———— Squid的几种模式…

游戏录制视频软件哪个好?这份攻略帮你搞定!

随着游戏行业的快速发展&#xff0c;越来越多的玩家开始录制游戏视频&#xff0c;以便分享自己的游戏体验或保存珍贵回忆。而选择一款合适的游戏录制视频软件显得尤为重要。可是游戏录制视频软件哪个好呢&#xff1f;本文将为大家介绍两款优秀的游戏录制视频软件&#xff0c;通…

Vatee万腾平台:科技驱动,智慧生活

随着科技的飞速发展&#xff0c;我们生活的方方面面正在经历前所未有的变革。Vatee万腾平台&#xff0c;作为这一变革的推动者之一&#xff0c;以其科技驱动的理念&#xff0c;正引领我们迈向更加智慧、便捷的生活。 Vatee万腾平台&#xff0c;是一个集科技研发、应用创新、服务…

Unity热更方案HybridCLR+YooAsset,纯c#开发热更,保姆级教程,从零开始

文章目录&#xff1a; 一、前言二、创建空工程三、接入HybridCLR四、接入YooAsset五、搭建本地资源服务器Nginx六、实战七、最后 一、前言 unity热更有很多方案&#xff0c;各种lua热更&#xff0c;ILRuntime等&#xff0c;这里介绍的是YooAssetHybridCLR的热更方案&#xff0…

jvm性能监控常用工具

在java的/bin目录下有许多java自带的工具。 我们常用的有 基础工具 jar:创建和管理jar文件 java&#xff1a;java运行工具&#xff0c;用于运行class文件或jar文件 javac&#xff1a;java的编译器 javadoc&#xff1a;java的API文档生成工具 性能监控和故障处理 jps jstat…

鸿蒙应用更新跳转到应用市场

鸿蒙没有应用下载安装&#xff0c;只支持跳转到应用市场更新 gotoMarket(){try {const request: Want {parameters: {// 此处填入要加载的应用包名&#xff0c;例如&#xff1a; bundleName: "com.huawei.hmsapp.appgallery"bundleName: com.huawei.hmos.maps.app}}…

浅谈定时器之常数吞吐量定时器

浅谈定时器之常数吞吐量定时器 常数吞吐量定时器的主要目的是在JMeter测试中维持一个恒定的吞吐量&#xff08;通常是每分钟的请求数或事务数&#xff09;&#xff0c;从而确保测试能够以预期的负载水平运行。这对于模拟特定的用户访问模式、进行稳定性测试、负载测试以及压力…

量化交易 - 策略回测

策略回测 1、什么是策略回测&#xff1f;2、策略回测的作用3、策略回测系统概述3.1策略回测中相关的指标介绍3.2量化交易策略的资金容量3.3 完整的策略回测系统包含哪些内容 1、什么是策略回测&#xff1f; 策略回测&#xff0c;也称之为策略回溯测试&#xff0c;是指利用交易…

北京酒店订房小程序开发的优势与主要功能

随着我国经济与交通的飞速发展&#xff0c;人们出行的次数越来越多&#xff0c;频率也越来越快。无论是出差还是出游&#xff0c;人家对外出酒店的舒适度与便捷度的要求也越来越高。为了满足人们对于酒店的新需求&#xff0c;北京酒店订房小程序与互联网技术相结合&#xff0c;…

pbootcms后台获取前端表单留言页面url

pbootcms在线留言表单&#xff0c;用户在网页前端提交表单成功后&#xff0c;在网站后台如何获取表单留言页面的url这个参数呢&#xff1f;下面举例说明&#xff1a;首先&#xff0c;我们在PBootcms后台对应的表单&#xff0c;添加需要记录的表单字段&#xff0c;例如 添加liuy…

免费开源AI生产力工具:内置专属ChatGPT、一键智能处理图片和视频(擦除水印、卡通漫画、无损放大、插值补帧、智能修复、3D转制、上色修复、合成整理)

AI 生产力工具 免费开源&#xff0c;提升用户生产力&#xff0c;保障隐私和数据安全。提供高效便捷的AI解决方案&#xff0c;包括但不限于&#xff1a;内置专属ChatGPT、一键批量智能处理图片和视频等。 主要特点 免费开源&#xff1a;免费使用&#xff0c;源代码开放&#…

性价比高真无线蓝牙耳机有哪些?性价比真无线蓝牙耳机推荐

目前真无线蓝牙耳机的音质和性能已经越来越接近甚至超越传统有线耳机。然而&#xff0c;市面上的TWS耳机品牌和型号繁多&#xff0c;价格也从几十元到几千元不等&#xff0c;性价比自然成了消费者选择时的重要考量因素&#xff0c;究竟哪些真无线蓝牙耳机既能够提供满意的音质和…

前沿重器[52] | 聊聊搜索系统5:召回:检索、粗排、多路召回

前沿重器 栏目主要给大家分享各种大厂、顶会的论文和分享&#xff0c;从中抽取关键精华的部分和大家分享&#xff0c;和大家一起把握前沿技术。具体介绍&#xff1a;仓颉专项&#xff1a;飞机大炮我都会&#xff0c;利器心法我还有。&#xff08;算起来&#xff0c;专项启动已经…