基于STM32的ESP8266天气时钟(2)--------MCU获取天气数据
前言:上一章节我们通过串口调试助手,成功获取到天气数据,这一节我们将通过MCU的串口发送、接收功能,实现MCU获取天气数据。
传送门:基于STM32F103的网络天气时钟(1)---------通过串口获取天气
文章目录
- 1、摘要
- 2、硬件准备
- 2.1 、WIFI模块
- 2.2、USB转TTL模块
- 2.3、STM32最小系统板
- 2.4、商品链接
- 3、软件准备
- 4、硬件连线
- 5、代码解析
- 5.1、ESP8266初始化程序
- 5.2、获取实时天气程序
- 6、运行结果
- 7、源程序
- 7.1 百度网盘链接
1、摘要
单片机具有串口发送和接收功能,我们可以通过串口发送AT指令从而获取到知心天气的数据。并在另一个串口输出。
2、硬件准备
除了上一章使用的wifi模块还有USB转TTL模板外,我们还需要准备一块stm32单片机的最小系统板。
2.1 、WIFI模块
同上章节。
2.2、USB转TTL模块
同上章节。
2.3、STM32最小系统板
因为项目比较简单,所以使用哪一款单片机随意~
我使用的是在淘宝上买的stm32f103rct6的最小系统板。
2.4、商品链接
最小系统板:购买链接
USB转TTL(种类有点多,随便选一个就行,我用的是CH340这个芯片的):购买链接
ESP8266:购买链接
OLED(我用的是0.96寸4针,I2C接口):购买链接
ST-Link V2下载线:购买链接
3、软件准备
上一节收到的数据有部分是乱码,经查阅是因为编码方式不一致导致的,不过“QCOM”没有更改编码方式的功能,于是我就换成“XCOM”。使用方法和之前的大体一致。
下载链接
提取码:3mzd
更改编码方式:
4、硬件连线
MCU | ESP8266 |
---|---|
3.3V | VCC |
GND | GND |
PB10 | RXD |
PB11 | TXD |
3.3V | IO |
3.3V | RST |
MCU | USB转TTL |
---|---|
5V | VCC |
GND | GND |
PA9 | RXD |
PA10 | TXD |
5、代码解析
基础功能的代码这里就不详细介绍了,主要讲解关键代码。
源代码在文末下载,大部分代码已经加上注释。
5.1、ESP8266初始化程序
ESP8266初始化,实现建立WIFI连接的功能。
其实就是串口发送AT指令,然后等待ESP8266的回复而已,很简单的。
移植时需要更改的地方为wifi的账号(wifista_ssid)和密码(wifista_password),该定义在esp8266.c中更改。
本代码发送的AT指令有:
指令 | 回复 | 功能 |
---|---|---|
AT | OK | AT测试 |
AT+CWMODE=1 | OK | 设置wifi模式 |
AT+RST | OK | 重启模块 |
AT+CIPMUX=0 | OK | 设置连接模式 |
AT+CWJAP=“ssid”,“pwd” | WIFI GOT IP | 连接wifi |
void esp8266_start_trans(void)
{u8 *p;p=mymalloc(SRAMIN,50); //申请32字节内存,用于存wifista_ssid,wifista_passwordprintf("send:AT\r\n"); while(esp8266_send_cmd("AT","OK",20))//检查WIFI模块是否在线{} //设置工作模式 1:station模式 2:AP模式 3:兼容 AP+station模式printf("send:AT+CWMODE=1\r\n"); esp8266_send_cmd("AT+CWMODE=1","OK",50);//Wifi模块重启printf("send:AT+RST\r\n"); esp8266_send_cmd("AT+RST","OK",20);delay_ms(1000); //延时3S等待重启成功delay_ms(1000);delay_ms(1000); //设置连接到的WIFI网络名称/加密方式/密码,这几个参数需要根据您自己的路由器设置进行修改!! printf("send:AT+CIPMUX=0\r\n"); esp8266_send_cmd("AT+CIPMUX=0","OK",20); //0:单连接,1:多连接 sprintf((char*)p,"AT+CWJAP=\"%s\",\"%s\"",wifista_ssid,wifista_password);//设置无线参数:ssid,密码printf("send:AT+CWJAP=\"%s\",\"%s\"\r\n",wifista_ssid,wifista_password);while(esp8266_send_cmd(p,"WIFI GOT IP",300)); //连接目标路由器,并且获得IPmyfree(SRAMIN,p);
}
5.2、获取实时天气程序
这段代码和wifi初始化的分开,因为初始化代码只需要运行一次,而天气获取,是需要多次运行的。分开的话可以避免重复设置ESP8266的一些功能。
移植时需要更改的地方为代码中u3_printf中的私钥和地点。
本代码发送的AT指令有:
指令 | 回复 | 功能 |
---|---|---|
AT+CIPSTART=“TCP”,“api.seniverse.com”,80 | OK | 建立TCP连接 |
AT+CIPMODE=1 | OK | 开启通透模式 |
AT+CIPSEND | OK | 开始透传 |
GET https://api.seniverse.com/v3/weather/now.json?key=私钥&location=城市&language=zh-Hans&unit=c\n\n | 天气数据 | 提出请求 |
+++ | 退出透传 |
//获取一次实时天气
//返回:0---获取成功,1---获取失败
u8 get_current_weather(void)
{u8 res;p=mymalloc(SRAMIN,40); //申请40字节内存sprintf((char*)p,"AT+CIPSTART=\"TCP\",\"%s\",%s",WEATHER_SERVERIP,WEATHER_PORTNUM); //配置目标TCP服务器printf("send:AT+CIPSTART=\"TCP\",\"%s\",%s\r\n",WEATHER_SERVERIP,WEATHER_PORTNUM);res = esp8266_send_cmd(p,"OK",200);//连接到目标TCP服务器if(res==1){myfree(SRAMIN,p);return 1;}delay_ms(300);printf("send:AT+CIPMODE=1\r\n"); esp8266_send_cmd("AT+CIPMODE=1","OK",100); //传输模式为:透传 USART3_RX_STA=0;printf("send:AT+CIPSEND\r\n"); esp8266_send_cmd("AT+CIPSEND","OK",100); //开始透传printf("start trans...\r\n");u3_printf("GET https://api.seniverse.com/v3/weather/now.json?key=私钥&location=城市&language=zh-Hans&unit=c\n\n"); delay_ms(20);//延时20ms返回的是指令发送成功的状态USART3_RX_STA=0; //清零串口3数据delay_ms(1000);if(USART3_RX_STA&0X8000) //此时再次接到一次数据,为天气的数据{ USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加结束符} printf("USART3_RX_BUF=%s\r\n",USART3_RX_BUF);atk_8266_quit_trans();//退出透传printf("send:AT+CIPCLOSE\r\n"); esp8266_send_cmd("AT+CIPCLOSE","OK",50); //关闭连接myfree(SRAMIN,p);return 0;
}
6、运行结果
将代码烧入后,可在串口调试器中查看到接收到的状态信息以及天气数据。
当按下按键(PA0),可再次获取天气数据。
7、源程序
7.1 百度网盘链接
链接:
https://pan.baidu.com/s/1sd00hF-RVmsDbEoMfnqdBQ
提取码:sgek
传送门:
基于STM32的ESP8266天气时钟(1)---------AT指令获取天气数据
基于STM32的ESP8266天气时钟(2)--------MCU获取天气数据
基于STM32的ESP8266天气时钟(3)--------MCU数据处理及显示
基于STM32F的ESP8266天气时钟(4)--------MCU获取时间及显示(完结)
基于STM32的ESP8266天气时钟(2)--------MCU获取天气数据相关推荐
- 基于STM32与ESP8266的太空人WiFi天气时钟(代码开源)
前言:本文为手把手教学ESP8266著名开源项目--太空人WiFi天气时钟,不同的是本次项目采用的是STM32作为MCU.两者开发过程中有因为各自芯片的特点(时钟频率,内存大小等),导致开发程序大不相 ...
- 基于STM32的ESP8266模块控制多路继电器
基于STM32的ESP8266模块控制多路继电器 1.视频讲解 基于STM32单片机ESP8266物联网阿里云MQTT多路继电器控制 物联网视频教程STM32+ESP8266 2.实物设计 ESP82 ...
- 基于STM32的ESP8266使用教程(一)
关于为什么要写这篇文章,因为之前在做一个项目的时候需要使用WIFI模块.X宝搜WIFI模块的时候推荐ESP8266这个模块,说是价格便宜.使用方便.但是在使用的过程中发现的确使用方便(因为是基于AT指 ...
- 基于STM32的ESP8266使用教程(二)
写在前面:博主懒癌晚期,考研结束之后想着HAPPY一下,结果把这事忘了,开学了又有很多事情要干,直到昨天一博友留言(有邮件提醒),才想起有这么个坑要填,特来填坑.相关软件程序请参考"基于ST ...
- python自动获取天气_用python获取天气数据,并作定时播报
原标题:用python获取天气数据,并作定时播报 数据挖掘入门与实战 公众号: datadw 思路 1.调用和风天气的API,获取天气数据 2.用百度语音API,将天气数据合成语音 3.用树莓派每天早 ...
- 基于STM32的ESP8266获取天气数据(HAL库)
一.介绍 进入主题,下图正是购买的esp8266模块 对于esp01,引脚图如下 二.刷固件 在使用AT指令时,有时候会无法进入AT模式,也就是在串口发送指令,无应答.除了检查引脚和TTL模块是否接错 ...
- 基于STM32+FreeRtos+ESP8266+MQTT连接阿里云
基于STM32+FreeRtos+DHT12+ESP8266+MQTT连接阿里云 1.概述 2.实现步骤 2.1.MQTT.fx模拟器与阿里云通信 2.2.STM32与阿里云通信 3. 搭建云平台 3 ...
- 基于stm32和ESP8266实现wifi模块smartlink功能以及TCP连接
一直想把wifi模块和stm32连接起来,但是网上找了很久,并没有C语言相关的库,只有基于arduino的ESP8266 C++库,这个库是没办法直接给stm32使用的,所以自己动手丰衣足食,自己手动 ...
- linux天气时钟,预报天气时钟软件预约-预报天气时钟手机版v1.0-Linux公社
预报天气时钟中拥有非常精准的天气预报功能,不仅可以预测到温度.湿度.空气质量指数.降水量等等,而且还会为你及时提醒恶劣天气情况,让你尽早做好出行准备,此外在预报天气时钟软件中你还可以享受到实时的空气质 ...
最新文章
- Linux系统调用--getrusage函数详解
- matlab求带参数二重定积分,matlab二重定积分
- 轻松掌柜显示不能连接到服务器,轻松掌柜推出在线进销存云端版
- MyBatis文档观后整理
- maya 替换名称_Maya玛雅入门教程 MAYA粒子替换功能和Mel命令colorAtPoint教程
- 【ATSC】【OTT】Netflix将作为美国有线机顶盒界面中的一个频道
- (九)ThunderbirdMail配置QQ邮件服务
- 我的一百个2019(五):2019,我为什么还在坚持?
- 高德地图api的使用
- win10计算机维护,手把手教您win10系统打开安全和维护功能的问题
- 关于js中e = e || window.event
- audio标签的播放、暂停、重播、进度拖拽等操作
- 【“计算机科学与技术”专业小白成长系列】Linux Shell 编程 极简教程
- 开源项目SMSS开发指南(二)——基于libevent的线程池
- 美在线教育商Lynda连续15年盈利 首度融资1亿美元
- 机器学习教会我们的6个道理
- 3COM SS3 4400系列交换机VLAN功能设置
- eclipse没有自动提示的解决
- AWS题库完美分享(最新更新)
- Word处理控件Aspose.Words功能演示:使用 C++ 合并 MS Word 文档