当前位置:   article > 正文

江科大STM32+ESP8266实现网上获取天气信息_stm32+esp8266 获取天气

stm32+esp8266 获取天气

大家好,这里是 神仙哈哈哈 , 之前学习了江科大的STM32课程,一直想做点什么,就看网上别人的,本来想做的是一个可以上网的手表类型,结果技术有限,只做出了联网+查天气

网络模块这里用的是ESP8266,从往里面刷固件开始,各种问题,到最后终于解决,成功可以通信,这里放一张   连接我们宿舍wifi成功+成功连接上tiaqiapi.com的截图

 相信STM32大家已经都很熟悉,下面直接讲ESP8266,简单实用只需要将RX,TX,VCC,GND连接即可,ESP8266同时也可以做开发板,这里不做阐述。

这个是本次实验最后现象:

虽然这个天气网api带来的数据量很大,但是以我们这个单片机的栈大小无法存那么多,因此这里只截取了返回JSON 中 ”alarm“前面的元素。

关于栈大小的修改,可以 

然后引入cJOSN.c,cJOSN.h文件

这里补一个链接 https://gitcode.com/mirrors/davegamble/cjson/overview?utm_source=csdn_github_accelerator&isLogin=1bab​​​​​​​b​​​​​​​bicon-default.png?t=N7T8https://gitcode.com/mirrors/davegamble/cjson/overview?utm_source=csdn_github_accelerator&isLogin=1

把这个工程全部git下来,然后 

把这两个文件贴到自己的工程下, 这里我主要使用的是

  1. /* Supply a block of JSON, and this returns a cJSON object you can interrogate. */
  2. CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value); //把一个字符串转化成cJSON对象,严格遵从JSON格式
  3. /* Get item "string" from object. Case insensitive. */
  4. CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string); //获取cJSON其中的字符串元素
  5. /* Delete a cJSON entity and all subentities. */
  6. CJSON_PUBLIC(void) cJSON_Delete(cJSON *item); //释放内存

下面介绍完工具函数,我们来说ESP88266这个模块,该模块波特率为:115200(不一样的话,会乱码),大家在初次使用的时候,可以先拿串口助手调试一下,这里推荐安信可的那个串口调试助手,里面很多的指定都是存好的。这里发个链接,有需要的可以自取

https://docs.ai-thinker.com/toolsicon-default.png?t=N7T8https://docs.ai-thinker.com/tools这个模块主要使用的AT指令来控制,本文只讲用到的指令,有需要的朋友可以自行学习。

https://docs.espressif.com/projects/esp-at/zh_CN/latest/esp32/AT_Command_Set/index.htmlicon-default.png?t=N7T8https://docs.espressif.com/projects/esp-at/zh_CN/latest/esp32/AT_Command_Set/index.html上面是学习网站,首先介绍一些基础的指令   注意:除了+++命令,所有命令默认后面加\r\n

  1. AT\r\n //用来测试是否正常运行
  2. OK
  3. AT+RST\r\n //将该模块重启,一般会返回一串乱码,这里不做讨论
  4. OK
  5. AT+CWMODE=1\r\n //将当前模式变成Statio模式,简单来说就是连别人的Wifi
  6. OK
  7. AT+CWMODE=2\r\n //将当前模式变成AP模式,简单的来说就是热点模式
  8. OK
  9. AT+CWJAP=wifi_ssid,wifi_password\r\n //设置完Station模式就可以开始 链接wifi了,一个是WiFi名称,第二个是Wifi密码
  10. WIFI GOT IP
  11. AT+CIPSTA?\r\n //查询当前esp8266被分配的IP信息
  12. +CIPSTA:ip:<"ip">
  13. +CIPSTA:gateway:<"gateway">
  14. +CIPSTA:netmask:<"netmask">
  15. +CIPSTA:ip6ll:<"ipv6 addr">
  16. +CIPSTA:ip6gl:<"ipv6 addr">
  17. OK
  18. AT+CIPSTART=TCP,tcp_addr,tcp_point\r\n //建立TCP链接,感觉这里类似Socket
  19. 第一个参数可以选择IP地址,第二个可以选择目标的端口号,如果不知道默认可以写80端口
  20. CONNECT
  21. OK
  22. AT+CIPMODE=1\r\n //将当前模式设置成透传模式,可以无限制收发数据
  23. OK
  24. AT+CIPSEND\r\n //开启透传,这个模式下,发送其他指令都无效(除+++)
  25. OK
  26. +++ //退出透传模式注意这个没有换行
  27. OK

 接受完上面的命令以后,大家就可以开始获取api的JSON信息了,这里来一张成功接收到的截图。也可以打开一个解析JOSN的网站,看看自己抓到的数据是否错误。

使用的具体命令参照下面:

  1. AT+RST
  2. Will force to restart!!!
  3. OK
  4. AT
  5. ERROR
  6. WIFI DISCONNECT
  7. sll��r�c�o��l�p�|����p��|b�p�p~�n�lno�bbp�bl`rl�����|r���slp�n�����lbn�|��⌎�c�|~�n�l��l`�nnl`nr���s��rlp�o��AT
  8. r����bn��n��c�|�n�l`�nnl`os���n�pslp�n�r������bn�|��l��p�|~�n�l`�on�rlor���n���sls��s���`+++AT
  9. +++
  10. ################################################
  11. arch:ESP8266, 1
  12. compile_time:Ai-Thinker|B&T
  13. wifi_mac:fcF5C497BB87
  14. sdk_version:v3.4-22-g967752e2
  15. firmware_version:2.2.0
  16. compile_time:Jun 30 2021 11:28:20
  17. ready
  18. ################################################AT
  19. ERROR
  20. AT+CWMODE?
  21. AT+CWMODE?
  22. +CWMODE:1
  23. OK
  24. Is station mode.
  25. AT+CWAUTOCONN=0
  26. AT+AT+CWMODE?
  27. CWAUTOCONN=0
  28. OK
  29. AT+CWMODE?
  30. +CWMODE:1
  31. OK
  32. AT+CIPSTATUS
  33. AT+CIPSTATUS
  34. STATUS:0
  35. OK
  36. Will conntect to AP 221_2.4G.
  37. AT+CWJAP="221_2.4G","qazwsxedcrfv"
  38. AT+CWJAP="221_2.4G","qazwsxedcrfv"
  39. WIFI CONNECTED
  40. WIFI GOT IP
  41. OK
  42. Have conntected.
  43. AT+CIPSTA?
  44. AT+CIPSTA?
  45. +CIPSTA:ip:"192.168.2.207"
  46. +CIPSTA:gateway:"192.168.2.1"
  47. +CIPSTA:netmask:"255.255.255.0"
  48. OK
  49. AT+CIPSTART="TCP","tianqiapi.com",80
  50. AT+CIPSTART="TCP","tianqiapi.com",80
  51. CONNECT
  52. OK
  53. AT+CIPMODE?
  54. AT+CIPMODE?
  55. +CIPMODE:0
  56. OK
  57. AT+CIPMODE=1
  58. AT+CIPMODE=1
  59. OK
  60. AT+CIPSEND
  61. AT+CIPSEND
  62. OK
  63. >GET https://v1.yiketianqi.com/api?unescape=1&version=v61&appid=15735152&appsecret=PAz30Hha
  64. {"cityid":"101110101","date":"2023-12-17","week":"星期日","update_time":"21:59","city":"西安","cityEn":"xian","country":"中国","countryEn":"China","wea":"晴","wea_img":"qing","tem":"-2.3","tem1":"-2","tem2":"-3","win":"西北风","win_speed":"1级","win_meter":"3km\/h","humidity":"52%","visibility":"14km","pressure":"984","air":"64","air_pm25":"64","air_level":"良","air_tips":"各类人群可多参加户外活动,多呼吸一下清新的空气。","alarm":{"alarm_type":"低温","alarm_level":"蓝色","alarm_title":"陕西省发布低温蓝色预警","alarm_content":"陕西省气象台2023年12月17日16时00分继续发布低温蓝色预警:过去24小时延安、榆林日平均气温较常年同期偏低8~10℃,西安南部、宝鸡北部、咸阳、铜川、渭南、商洛、杨凌日平均气温较常年同期偏低5~7℃,预计未来48小时,延安、榆林最低气温持续偏低5~7℃,宝鸡、咸阳、铜川、渭南、商洛、杨凌最低气温持续偏低4~6℃,西安、汉中、安康最低气温持续偏低3~5℃。(预警信息来源:国家预警信息发布中心)"},"rain_pcpn":"0","uvIndex":"0","uvDescription":"低","wea_day":"阴","wea_day_img":"yin","wea_night":"阴","wea_night_img":"yin","sunrise":"07:43","sunset":"17:36","aqi":{"update_time":"21:00","air":"60","air_level":"良","air_tips":"各类人群可多参加户外活动,多呼吸一下清新的空气。","pm25":"39","pm25_desc":"良","pm10":"69","pm10_desc":"良","o3":"30","o3_desc":"","no2":"43","no2_desc":"","so2":"8","so2_desc":"","co":"0.9","co_desc":"","kouzhao":"不用佩戴口罩","yundong":"适宜运动","waichu":"适宜外出","kaichuang":"适宜开窗","jinghuaqi":"不需要打开"}}
  65. 日期:2023-12-17
  66. 星期:星期日
  67. 更新时间:21:59
  68. 城市:西安
  69. 国家:中国
  70. 天气:qing
  71. 温度:-2.3
  72. 空气污染指数:64

在接受到这些数据之后,我们要做的就是解析了 ,

  1. char *s = (char *) ESP_RX_BUF.buf;
  2. char *l = ",\"alarm\"";
  3. char *p;
  4. p = strstr(s,l);
  5. left((char *)copy_buf,(char *)ESP_RX_BUF.buf,p-s);
  6. copy_buf[p-s] = '}';
  7. // printf("%s",(char *)copy_buf);
  8. json = cJSON_Parse((char *)copy_buf);

这里直接看代码吧,前文有说这个单片机栈的内存不够,即使我调到了最大,也无法接受了,因此我们截取了JSON前面的数据,之后补 '}' 来让cJSON帮我们直接转化成好处理的cJSON结构体

  1. json_date = cJSON_GetObjectItem(json, "date");
  2. json_week = cJSON_GetObjectItem(json, "week");
  3. json_update_time = cJSON_GetObjectItem(json, "update_time");
  4. json_city = cJSON_GetObjectItem(json, "city");
  5. json_country = cJSON_GetObjectItem(json, "country");
  6. json_wea_img = cJSON_GetObjectItem(json, "wea_img");
  7. json_tem = cJSON_GetObjectItem(json, "tem");
  8. json_air = cJSON_GetObjectItem(json, "air");

名字都显而易见,这里不做解释。不懂的可以看上面。之后全部释放内存,结束。

感兴趣的话也可以做一下实时时钟+把这些数据上传至云端什么的。

对此工程感兴趣的朋友可以给我发邮箱:2664067940@qq.com

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/553465
推荐阅读
相关标签
  

闽ICP备14008679号