前几天发布了开源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模块获取网络时间和天气预报的方法,需要注意的是上述所有指令后面别忘了加回车换行符。

单片机通过WIFI模块(ESP8266)获取网络时间与天气预报相关推荐

  1. esp8266获取网络时间

    esp8266获取网络时间 我们使用的手机都有 "使用网络上的时间,自动调整日期和时间" 的功能.如果我们自己做的电子时钟也有自动调整时间的功能,那就很方便,而且不怕时间不准了. ...

  2. 15单片机通过WIFI模块ESP8266实现手机远程监控可燃气体浓度

    15单片机通过WIFI模块ESP8266实现手机远程监控可燃气体浓度 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 一,系统方案 1.方案描 ...

  3. 51单片机通过WIFI模块ESP8266控制LED灯

    完整源码下载地址:https://download.csdn.net/download/tongxin082/21440621 一.系统方案 手机APP通过ESP8266 WIFI模块与51单片机通信 ...

  4. 【STM32训练—WiFi模块】第一篇、STM32驱动ESP8266WiFi模块获取网络时间

    目录 第一部分.写在前面 1.硬件准备 2.相关的AT指令 3.参考博客 第二部分.电脑串口助手调试ESP8266模块获取网络时间 1.ESP8266获取时间的流程 2.具体实现步骤 第三部分.STM ...

  5. ESP8266+STM32获取网络时间、OLED显示时间图片视频。

    学习过程不易,发文共享以下学习过程~ 先说说我的设计内容的组成: 目录 学习过程不易,发文共享以下学习过程~ 1. STM32控制ESP8266获取网络时间 第一步:电脑控制ESP8266获取时间数据 ...

  6. stm32 + ESP8266 wifi获取网络时间和天气 stm32天气预报

    大家遇到什么什么题,可以私聊我. 近期由于某些原因,玩了一下stm32+WiFi获取网络天气和网络时间.之前一直觉得这个东西会有点难度,其实,做完了才发现,其实那只是想象中的难而已.现在,将这几天的成 ...

  7. 51单片机利用8266获取网络时间

    51单片机利用8266获取网络时间 我现在是成都一所不出名的二本院校大三学生,第一次来到CSDN,趁有时间,把我之前做的项目,其中一个模块拿出来和大家分享,我也是小白,希望提出宝贵意见.OK,废话不多 ...

  8. esp8266 at接收数据中断时间_利用ESP8266获取网络同步时间(北京时间)

    本文需要读者有一点ESP8266的基础知识,比如ESP8266的模式设置,AP连接,联网. 1. 提供网络时间的网站 要想获取网络时间首先要有提供网络时间的网站,免费提供网络时间的网站有很多, 这里以 ...

  9. ESP32通过WIFI获取网络时间

    title: ESP32通过WIFI获取网络时间 一.这里首先要知道esp32的wifi如何连接,才能获取到网络服务器的时间 不知道wifi怎么连接的这里有相关链接--esp32wifi连接网络 二. ...

  10. 物联网系列之WIFI模块ESP8266一介绍

    内容 Change history 内容 1        前言 1.1        目的 2        计划 2.1        测试环境 2.2        计划 3        行动 ...

最新文章

  1. 你们是不是真的很缺大数据工程师?
  2. python实现字符串切割
  3. 生成N个0~1的随机数,同时这些随机数的和为1
  4. mysql---表所在数据库
  5. 如何忽略证书继续访问_前5个最容易被忽视的可访问性问题
  6. mysql 8 强制修改密码_Mysql 8.0版本强制无密码进入+更改密码
  7. Hello Quartz (第一部分)
  8. 开发运维已死,无运维万岁
  9. 惠普谢少毅:网络攻击威胁在线交易
  10. 通达信实现自动交易系统
  11. imx8mm yocto_bsp 编译
  12. [Swift]判断字符串是否为空
  13. CCNA题库第一部分
  14. 华中科技大学计算机学院陈迪,华中科技大学2011届“优秀毕业生”公示名单
  15. python身份证系统_(二)Python GUI实战:身份证信息校验系统
  16. 【广度优先搜索】N叉树的层序遍历 | 腐烂的橘子 | 单词接龙 | 最小基因变化 | 打开转盘锁
  17. Oracle兵器谱上古神器之-KFED
  18. matlab 矩阵中最小的数,计算矩阵中最小的N个数值
  19. 河南大学计算机学院夏令营,河南大学数学与统计学院2020年优秀大学生国际夏令营...
  20. matlab积分练习,matlab练习之数值微积分和方程数值求解

热门文章

  1. android 布局如何居中,Android ConstraintLayout约束布局的居中详解
  2. 通过QQ邮箱中转站分享文件
  3. 95年计算机专业的电脑,1995年Windows 95系统正式发行,开创互联网新时代
  4. 图像拼接算法(zz)
  5. 网吧服务器常用设置维护工具,某某网吧专用维护工具
  6. 睿思荐片--最好的电影,最全的排行
  7. Instagram的百万美元Bug
  8. 通达信自编的选股公式如何使用?
  9. C语言从放弃到入门,C语言,从放弃到入门
  10. VMware12虚拟机怎么下载安装?保姆级安装教程,让你一分钟学会