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.rhkb.cn/news/367669.html

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

相关文章

代码随想录-Day46

121. 买卖股票的最佳时机 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从…

『MySQL 实战 45 讲』22 - MySQL 有哪些“饮鸩止渴”提高性能的方法?

MySQL 有哪些“饮鸩止渴”提高性能的方法&#xff1f; 需求&#xff1a;业务高峰期&#xff0c;生产环境的 MySQL 压力太大&#xff0c;没法正常响应&#xff0c;需要短期内、临时性地提升一些性能 短连接风暴 短连接模式&#xff1a;执行很少的 SQL 语句就断开&#xff0c;…

使用NFS网关功能将HDFS挂载到本地系统

HDFS安装教程 HDFS安装教程http://t.csdnimg.cn/2ziFd 使用NFS网关功能将HDFS挂载到本地系统 简介 HDFS提供了基于NFS&#xff08;Network File System&#xff09;的插件&#xff0c;可以对外提供NFS网关&#xff0c;供其它系统挂载使用。 NFS 网关支持 NFSv3&#xff0c;并…

接口测试流程及测试点!

一、什么时候开展接口测试 1.项目处于开发阶段&#xff0c;前后端联调接口是否请求的通&#xff1f;&#xff08;对应数据库增删改查&#xff09;--开发自测 2.有接口需求文档&#xff0c;开发已完成联调&#xff08;可以转测&#xff09;&#xff0c;功能测试展开之前 3.专…

使用 Ollama 时遇到的问题

题意&#xff1a; ImportError: cannot import name Ollama from llama_index.llms (unknown location) - installing dependencies does not solve the problem Python 无法从 llama_index.llms 模块中导入名为 Ollama 的类或函数 问题背景&#xff1a; I want to learn LL…

vscode中的字符缩进问题

问题描述&#xff1a; 如图当一行代码中出现不同类型的字符时&#xff0c;使用tab缩只是插入了固定数量&#xff08;默认4&#xff09;的空格或制表符&#xff0c;仍然无法对齐。 解决方法&#xff1a; vscode找到设置&#xff0c;搜索fontFamily&#xff0c;对应输入框写入mon…

Git 基础-创建版本库 git init、添加到暂存区git add、查看状态git status、查看改动git diff

目录 1.创建版本库 git init 1.创建版本库 git init 在目录中创建新的 Git 仓库。 你可以在任何时候、任何目录中这么做&#xff0c;完全是本地化的。 在目录中执行 git init&#xff0c;就可以创建一个 Git 仓库了。 注意: 没事不要手动修改 .git 目录里面的文件&#xff0c;不…

Leetcode[反转链表]

LCR 024. 反转链表 给定单链表的头节点 head &#xff0c;请反转链表&#xff0c;并返回反转后的链表的头节点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示…

Unity 之基于URP使用UniStorm Weather System天气系统

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! Unity 之基于URP使用UniStorm Weather System天气系统 TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、…

【计算机体系结构】缓存的false sharing

在介绍缓存的false sharing之前&#xff0c;本文先介绍一下多核系统中缓存一致性是如何维护的。 目前主流的多核系统中的缓存一致性协议是MESI协议及其衍生协议。 MESI协议 MESI协议的4种状态 MESI协议有4种状态。MESI是4种状态的首字母缩写&#xff0c;缓存行的4种状态分别…

Swift 中强大的 Key Paths(键路径)机制趣谈(上)

概览 小伙伴们可能不知道&#xff1a;在 Swift 语言中隐藏着大量看似“其貌不扬”实则却让秃头码农们“高世骇俗”&#xff0c;堪称卧虎藏龙的各种秘技。 其中&#xff0c;有一枚“不起眼”的小家伙称之为键路径&#xff08;Key Paths&#xff09;。如若将其善加利用&#xff…

java面试课程-SpringIOC部分源码解析

1.SpringIOC的refresh源码解析 核心&#xff1a; 核心使用的是&#xff1a; 需要完成配置类的解析&#xff0c;各种BeanFactoryProcessor的注册。还有写国际化配置的初始化。Web容器的内部构造。 上面几个方法是refresh方法的内容。注意可以与applicationContext里的内容一起…

个人博客|PHP源码|支持多国语言切换

一. 前言 今天小编给大家带来了一款可学习&#xff0c;可商用的&#xff0c;支持多国语言的个人博客网站源码&#xff0c;支持二开&#xff0c;无加密。此博客相当简洁&#xff0c;也适合海外。详细界面和功能见下面视频演示。 如果您正好有此需求源码&#xff0c;请联系小编…

七大排序算法的深入浅出(java篇)

&#x1f341; 个人主页&#xff1a;爱编程的Tom&#x1f4ab; 本篇博文收录专栏&#xff1a;Java专栏&#x1f449; 目前其它专栏&#xff1a;c系列小游戏 c语言系列--万物的开始_ 等等 &#x1f389; 欢迎 &#x1f44d;点赞✍评论⭐收藏&#x1f496;三连支…

【Rust入门教程】hello world程序

文章目录 前言Hello World程序运行总结 前言 对于学习任何一种新的编程语言&#xff0c;我们都会从编写一个简单的Hello World程序开始。这是一个传统&#xff0c;也是一个开始。在这篇文章中&#xff0c;我们将一起学习如何在Rust中编写你的第一个程序&#xff1a;Hello Worl…

解决pip安装时的“SyntaxError: invalid syntax”错误

项目场景&#xff1a; 项目中有新的成员加入时&#xff0c;第一步就是安装开发环境&#xff0c;然而往往同样的机器、同样的配置&#xff0c;我们却总能遇到各种各样不同的问题。 今天分享一个简单的操作问题。 问题描述 项目用到pandas&#xff0c;安装pandas时遇到Syntax…

linux 安装腾讯会议和解决ubuntu打开腾讯会议提示:不兼容 wayland 协议

一. 下载腾讯会议安装包 腾讯会议下载链接 二. 命令行安装 cd [安装包路径] sudo dpkg -i TencentMeeting_0300000000_3.19.1.400_x86_64_default.publish.deb 三. 打开腾讯会议提示无法支持wayland 协议 解决方法: 打开终端 sudo vi /etc/gdm3/custom.conf打开 #Wayland…

GNeRF代码复现

https://github.com/quan-meng/gnerf 之前一直去复现这个代码总是文件不存在&#xff0c;我就懒得搞了&#xff08;实际上是没能力哈哈哈&#xff09; 最近突然想到这篇论文重新试试复现 一、按步骤创建虚拟环境安装各种依赖等 二、安装好之后下载数据&#xff0c;可以用Blen…

Rocky Linux 9 系统OpenSSH CVE-2024-6387 漏洞修复

Rocky Linux 9系统 OpenSSH CVE-2024-6387 漏洞修复 1、漏洞修复2、修复思路3、修复方案3.1、方案一3.2、方案二 4、总结5、参考 1、漏洞修复 CVE-2024-6387&#xff1a;regreSSHion&#xff1a;OpenSSH 服务器中的远程代码执行&#xff08;RCE&#xff09;&#xff0c;至少在…

【Java学习笔记】java图形界面编程

在前面的章节中&#xff0c;我们开发运行的应用程序都没有图形界面&#xff0c;但是很多应用软件&#xff0c;如Windows下的Office办公软件、扑克牌接龙游戏软件、企业进销存ERP系统等&#xff0c;都有很漂亮的图形界面。素以需要我们开发具有图形界面的软件。 Java图形界面编程…