赞
踩
大家好,这里是 神仙哈哈哈 , 之前学习了江科大的STM32课程,一直想做点什么,就看网上别人的,本来想做的是一个可以上网的手表类型,结果技术有限,只做出了联网+查天气
网络模块这里用的是ESP8266,从往里面刷固件开始,各种问题,到最后终于解决,成功可以通信,这里放一张 连接我们宿舍wifi成功+成功连接上tiaqiapi.com的截图
相信STM32大家已经都很熟悉,下面直接讲ESP8266,简单实用只需要将RX,TX,VCC,GND连接即可,ESP8266同时也可以做开发板,这里不做阐述。
这个是本次实验最后现象:
虽然这个天气网api带来的数据量很大,但是以我们这个单片机的栈大小无法存那么多,因此这里只截取了返回JSON 中 ”alarm“前面的元素。
关于栈大小的修改,可以
然后引入cJOSN.c,cJOSN.h文件
把这个工程全部git下来,然后
把这两个文件贴到自己的工程下, 这里我主要使用的是
- /* Supply a block of JSON, and this returns a cJSON object you can interrogate. */
-
- CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value); //把一个字符串转化成cJSON对象,严格遵从JSON格式
-
- /* Get item "string" from object. Case insensitive. */
-
- CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string); //获取cJSON其中的字符串元素
-
- /* Delete a cJSON entity and all subentities. */
-
- CJSON_PUBLIC(void) cJSON_Delete(cJSON *item); //释放内存
下面介绍完工具函数,我们来说ESP88266这个模块,该模块波特率为:115200(不一样的话,会乱码),大家在初次使用的时候,可以先拿串口助手调试一下,这里推荐安信可的那个串口调试助手,里面很多的指定都是存好的。这里发个链接,有需要的可以自取
https://docs.ai-thinker.com/toolshttps://docs.ai-thinker.com/tools这个模块主要使用的AT指令来控制,本文只讲用到的指令,有需要的朋友可以自行学习。
https://docs.espressif.com/projects/esp-at/zh_CN/latest/esp32/AT_Command_Set/index.htmlhttps://docs.espressif.com/projects/esp-at/zh_CN/latest/esp32/AT_Command_Set/index.html上面是学习网站,首先介绍一些基础的指令 注意:除了+++命令,所有命令默认后面加\r\n
- AT\r\n //用来测试是否正常运行
-
- OK
-
- AT+RST\r\n //将该模块重启,一般会返回一串乱码,这里不做讨论
-
- OK
-
- AT+CWMODE=1\r\n //将当前模式变成Statio模式,简单来说就是连别人的Wifi
-
- OK
-
- AT+CWMODE=2\r\n //将当前模式变成AP模式,简单的来说就是热点模式
-
- OK
-
- AT+CWJAP=wifi_ssid,wifi_password\r\n //设置完Station模式就可以开始 链接wifi了,一个是WiFi名称,第二个是Wifi密码
-
- WIFI GOT IP
-
- AT+CIPSTA?\r\n //查询当前esp8266被分配的IP信息
-
- +CIPSTA:ip:<"ip">
- +CIPSTA:gateway:<"gateway">
- +CIPSTA:netmask:<"netmask">
- +CIPSTA:ip6ll:<"ipv6 addr">
- +CIPSTA:ip6gl:<"ipv6 addr">
-
- OK
-
- AT+CIPSTART=TCP,tcp_addr,tcp_point\r\n //建立TCP链接,感觉这里类似Socket
- 第一个参数可以选择IP地址,第二个可以选择目标的端口号,如果不知道默认可以写80端口
-
- CONNECT
-
- OK
-
- AT+CIPMODE=1\r\n //将当前模式设置成透传模式,可以无限制收发数据
-
- OK
-
- AT+CIPSEND\r\n //开启透传,这个模式下,发送其他指令都无效(除+++)
-
- OK
-
- +++ //退出透传模式注意这个没有换行
-
- OK
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
接受完上面的命令以后,大家就可以开始获取api的JSON信息了,这里来一张成功接收到的截图。也可以打开一个解析JOSN的网站,看看自己抓到的数据是否错误。
使用的具体命令参照下面:
- AT+RST
-
- Will force to restart!!!
-
- OK
- AT
-
- ERROR
- WIFI DISCONNECT
- 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
- r����bn��n��c�|�n�l`�nnl`os���n�pslp�n�r������bn�|��l��p�|~�n�l`�on�rlor���n���sls��s���`+++AT
- +++
- ################################################
- arch:ESP8266, 1
- compile_time:Ai-Thinker|B&T
- wifi_mac:fcF5C497BB87
- sdk_version:v3.4-22-g967752e2
- firmware_version:2.2.0
- compile_time:Jun 30 2021 11:28:20
-
- ready
-
- ################################################AT
-
- ERROR
- AT+CWMODE?
- AT+CWMODE?
- +CWMODE:1
-
- OK
- Is station mode.
- AT+CWAUTOCONN=0
- AT+AT+CWMODE?
- CWAUTOCONN=0
-
- OK
- AT+CWMODE?
- +CWMODE:1
-
- OK
- AT+CIPSTATUS
- AT+CIPSTATUS
- STATUS:0
-
- OK
- Will conntect to AP 221_2.4G.
- AT+CWJAP="221_2.4G","qazwsxedcrfv"
- AT+CWJAP="221_2.4G","qazwsxedcrfv"
- WIFI CONNECTED
- WIFI GOT IP
-
- OK
- Have conntected.
- AT+CIPSTA?
- AT+CIPSTA?
- +CIPSTA:ip:"192.168.2.207"
- +CIPSTA:gateway:"192.168.2.1"
- +CIPSTA:netmask:"255.255.255.0"
-
- OK
- AT+CIPSTART="TCP","tianqiapi.com",80
- AT+CIPSTART="TCP","tianqiapi.com",80
- CONNECT
-
- OK
- AT+CIPMODE?
- AT+CIPMODE?
- +CIPMODE:0
-
- OK
- AT+CIPMODE=1
- AT+CIPMODE=1
-
- OK
- AT+CIPSEND
- AT+CIPSEND
-
- OK
-
- >GET https://v1.yiketianqi.com/api?unescape=1&version=v61&appid=15735152&appsecret=PAz30Hha
- {"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":"不需要打开"}}
- 日期:2023-12-17
- 星期:星期日
- 更新时间:21:59
- 城市:西安
- 国家:中国
- 天气:qing
- 温度:-2.3
- 空气污染指数:64
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
在接受到这些数据之后,我们要做的就是解析了 ,
- char *s = (char *) ESP_RX_BUF.buf;
- char *l = ",\"alarm\"";
- char *p;
- p = strstr(s,l);
- left((char *)copy_buf,(char *)ESP_RX_BUF.buf,p-s);
- copy_buf[p-s] = '}';
- // printf("%s",(char *)copy_buf);
-
- json = cJSON_Parse((char *)copy_buf);
这里直接看代码吧,前文有说这个单片机栈的内存不够,即使我调到了最大,也无法接受了,因此我们截取了JSON前面的数据,之后补 '}' 来让cJSON帮我们直接转化成好处理的cJSON结构体
- json_date = cJSON_GetObjectItem(json, "date");
- json_week = cJSON_GetObjectItem(json, "week");
- json_update_time = cJSON_GetObjectItem(json, "update_time");
- json_city = cJSON_GetObjectItem(json, "city");
- json_country = cJSON_GetObjectItem(json, "country");
- json_wea_img = cJSON_GetObjectItem(json, "wea_img");
- json_tem = cJSON_GetObjectItem(json, "tem");
- json_air = cJSON_GetObjectItem(json, "air");
名字都显而易见,这里不做解释。不懂的可以看上面。之后全部释放内存,结束。
感兴趣的话也可以做一下实时时钟+把这些数据上传至云端什么的。
对此工程感兴趣的朋友可以给我发邮箱:2664067940@qq.com
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。