单片机通过WIFI模块(ESP8266)获取网络时间与天气预报
创始人
2024-01-13 07:32:12

        前几天发布了开源4.3寸触摸屏的文章 《开源4.3寸触摸屏》,里面有WIFI获取时间和天气预报相关的功能,今天就来介绍一下这个功能是怎样实现的。

        1.底层驱动

        首先,硬件上,单片机通过串口AT指令访问WIFI模块(ESP12S)。具体AT指令怎样是写,可以参考之前的文章《AT指令程序的编写》。上电后,先配置WIFI模块的工作模式等,用到的AT指令如下:

        1. 关闭回显

                ATE0                   

        2. 设置为STA模式

                AT+CWMODE_DEF=1 

        3. 设置WIFI名称和密码

                AT+CWJAP_DEF=”SSID”,”Password” 

        4. 开启DHCP

                AT+CWDHCP_DEF=1,1 

        5. 设置为单连接模式

                AT+CIPMUX=0      

        6. 透传模式

                AT+CIPMODE=1         

        2.获取网络时间

        获取网络时间的方式有两种,对于较新版本的固件,可以直接通过AT指令来获取。(可以通过AT+GMR指令来查询固件的版本。)

        AT+CIPSNTPTIME?

        对于较老版本的固件,不支持该AT指令,只能通过自己链接网络服务器来获取当前时间。具体需要的AT指令如下:

        1.建立TCP链接

                 AT+CIPSTART="TCP","www.beijing-time.org",80

        2.打开传透模式

                AT+CIPSEND

        3.收到‘>’符号后,随便发送个数据

        4.等待接收数据

        接收的数据可以先用网络调试助手来测试,如下,可以看大,数据中包含了当前的日期和时间信息,我们可以先找到字符串中“Data”的位置,再解析后面的数据。数据格式固定,直接按照字符位置解析就行。

        需要注意的是,获取的这个时间是格林威治时间,与北京时间相差8个小时。

当然,也可以通过连接其它NTP时间服务器来获取时间,步骤是类似的。

        3.获取天气预报

        天气的获取就要比时间稍复杂一些,网上有很多可以提供天气预报的服务器,有些可以免费试用,一般都需要注册一个账号,这里以“心知天气”为例进行介绍。步骤如下:

        1.在该网站注册一个账号:

        心知天气 - 高精度气象数据 - 天气数据API接口 - 行业气象解决方案。

        注册之后就可以通过其开放的API来获取天气预报。有免费版和付费版,区别在于访问频次和获取的天气信息内容不同。如下:

        2.在控制台查看账号的私钥,这个在程序用要用。

        3.有了这个私钥,我们就可以通过API来获取天气预报了,相关的API可以在这里查询:

未来15天逐日天气预报和昨日天气 · 心知天气

        先用网络调试助手测试一下:

        可以看到,通过TCP连接服务器后,发送GET请求就可以收到天气预报数据,接下来就是解析数据了。

        4.接收的数据是JSON格式的字符串,在单片机中我们可以移植cJSON来进行解析。cJSON是一个开源的C语音解析库,只有cJSON.c、cJSON.h两个文件,直接添加到工程中就可以使用相关函数。程序如下:

void Weather_JSON( )
{	char *data;cJSON *root;cJSON *results;cJSON *last_update;cJSON *loc_json, *daily_json;cJSON *forecast_json;char *loc_tmp, *weather_tmp;int i = 0;data = (char*)(Uart1.RxBuf);//接受到的数据root = cJSON_Parse(data);if(root){//printf("JSON格式正确:\n%s\n\n",cJSON_Print(root));    //输出json字符串results = cJSON_GetObjectItem(root, "results");results = cJSON_GetArrayItem(results,0);if(results){loc_json = cJSON_GetObjectItem(results, "location");   //得到location键对应的值,是一个对象loc_tmp = cJSON_GetObjectItem(loc_json, "id") -> valuestring;//printf("城市ID:%s\n",loc_tmp);loc_tmp = cJSON_GetObjectItem(loc_json, "name") -> valuestring;memset(loc_str,0,20);memcpy(loc_str,loc_tmp,strlen(loc_tmp));loc_tmp = cJSON_GetObjectItem(loc_json, "timezone") -> valuestring;//printf("城市时区:%s\n\n",loc_tmp);daily_json = cJSON_GetObjectItem(results, "daily");if(daily_json){Weather_Dat[0].Flag = 1;for(i = 0; i < 3; i++){forecast_json = cJSON_GetArrayItem(daily_json, i);//weather_tmp = cJSON_GetObjectItem(forecast_json, "date") -> valuestring;//日期weather_tmp = cJSON_GetObjectItem(forecast_json, "code_day") -> valuestring;//白天天气代码Weather_Dat[i].Weathcode = atoi(weather_tmp);//weather_tmp = cJSON_GetObjectItem(forecast_json, "code_night") -> valuestring;//晚上天气代码weather_tmp = cJSON_GetObjectItem(forecast_json, "high") -> valuestring;//最高温度memset(Weather_Dat[i].HighT,0,4);memcpy(Weather_Dat[i].HighT,weather_tmp,strlen(weather_tmp));weather_tmp = cJSON_GetObjectItem(forecast_json, "low") -> valuestring;//最低温度memset(Weather_Dat[i].LowT,0,4);memcpy(Weather_Dat[i].LowT,weather_tmp,strlen(weather_tmp));weather_tmp = cJSON_GetObjectItem(forecast_json, "wind_direction") -> valuestring;//风向memset(Weather_Dat[i].Wind_Dir,0,10);memcpy(Weather_Dat[i].Wind_Dir,weather_tmp,strlen(weather_tmp));weather_tmp = cJSON_GetObjectItem(forecast_json, "wind_scale") -> valuestring;//风力memset(Weather_Dat[i].WindScale,0,4);memcpy(Weather_Dat[i].WindScale,weather_tmp,strlen(weather_tmp));weather_tmp = cJSON_GetObjectItem(forecast_json, "humidity") -> valuestring;//湿度memset(Weather_Dat[i].Humi,0,4);memcpy(Weather_Dat[i].Humi,weather_tmp,strlen(weather_tmp));}}else{//printf("daily json格式错误\r\n");Weather_Dat[0].Flag = 0;}
//            last_update = cJSON_GetObjectItem(results, "last_update");
//            update_tmp = last_update->valuestring;
//            if(last_update)
//            {
//                //printf("更新时间:%s\r\n", update_tmp);
//            }}else{Weather_Dat[0].Flag = 0;//printf("results格式错误:%s\r\n", cJSON_GetErrorPtr());}}else{Weather_Dat[0].Flag = 0;//printf("JSON格式错误\r\n");}cJSON_Delete(root);	
}

        解析后,将有用数据转换为自己想要的格式存储在变量中。需要注意的是,cJSON可能占用较大的堆栈,因此堆栈需要设大一些。

        总结一下,获取天气预报的步骤如下:

        1.注册账号

        2.获取私钥

        3.连接服务器

                AT+CIPSTART="TCP”,” api.seniverse.com”,80

        4..打开传透模式

            AT+CIPSEND

        5..收到‘>’符号后,发送GET请求

GEThttps://api.seniverse.com/v3/weather/daily.json?key=your_key&location=ip&language=zh-Hans&unit=c&start=0&days=3

     6.等待接收数据,并解析

        以上就是单片机通过AT指令访问WIFI模块获取网络时间和天气预报的方法,需要注意的是上述所有指令后面别忘了加回车换行符。

相关内容

热门资讯

苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
阿西吧是什么意思 阿西吧相当于... 即使你没有受到过任何外语培训,你也懂四国语言。汉语:你好英语:Shit韩语:阿西吧(아,씨발! )日...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
阿西吧是什么意思 阿西吧相当于... 即使你没有受到过任何外语培训,你也懂四国语言。汉语:你好英语:Shit韩语:阿西吧(아,씨발! )日...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...