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

1 篇文章 0 订阅
1 篇文章 0 订阅

大家好,这里是 神仙哈哈哈 , 之前学习了江科大的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下来,然后 

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

/* 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/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

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

 接受完上面的命令以后,大家就可以开始获取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

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

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

  • 12
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 34
    评论
评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值