基于STM32的ESP8266天气时钟(2)

时间: 2023-08-22 admin IT培训

基于STM32的ESP8266天气时钟(2)

基于STM32的ESP8266天气时钟(2)

前言:上一章节我们通过串口调试助手,成功获取到天气数据,这一节我们将通过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、硬件连线

MCUESP8266
3.3VVCC
GNDGND
PB10RXD
PB11TXD
3.3VIO
3.3VRST
MCUUSB转TTL
5VVCC
GNDGND
PA9RXD
PA10TXD

5、代码解析

基础功能的代码这里就不详细介绍了,主要讲解关键代码。
源代码在文末下载,大部分代码已经加上注释。

5.1、ESP8266初始化程序

ESP8266初始化,实现建立WIFI连接的功能。
其实就是串口发送AT指令,然后等待ESP8266的回复而已,很简单的。
移植时需要更改的地方为wifi的账号(wifista_ssid)和密码(wifista_password),该定义在esp8266.c中更改。
本代码发送的AT指令有:

指令回复功能
ATOKAT测试
AT+CWMODE=1OK设置wifi模式
AT+RSTOK重启模块
AT+CIPMUX=0OK设置连接模式
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”,80OK建立TCP连接
AT+CIPMODE=1OK开启通透模式
AT+CIPSENDOK开始透传
GET .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 .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 百度网盘链接

链接:

提取码:sgek

传送门:
基于STM32的ESP8266天气时钟(1)---------AT指令获取天气数据
基于STM32的ESP8266天气时钟(2)--------MCU获取天气数据
基于STM32的ESP8266天气时钟(3)--------MCU数据处理及显示
基于STM32F的ESP8266天气时钟(4)--------MCU获取时间及显示(完结)