基于STM32F103的网络天气时钟--------单片机串口获取天气

Posted 绵绵呀。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于STM32F103的网络天气时钟--------单片机串口获取天气相关的知识,希望对你有一定的参考价值。

前言:上一章节我们通过串口调试助手,成功获取到天气数据,这一节我们将通过MCU的串口发送、接收功能,实现MCU获取天气数据。

传送门:基于STM32F103的网络天气时钟(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_password
	printf("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));					//连接目标路由器,并且获得IP
	myfree(SRAMIN,p);
}

5.2、获取实时天气程序

这段代码和wifi初始化的分开,因为初始化代码只需要运行一次,而天气获取,是需要多次运行的。分开的话可以避免重复设置ESP8266的一些功能。
移植时需要更改的地方为代码中u3_printf中的私钥和地点。
本代码发送的AT指令有:

指令回复功能
AT+CIPSTART=“TCP”,“api.seniverse.com”,80OK建立TCP连接
AT+CIPMODE=1OK开启通透模式
AT+CIPSENDOK开始透传
GET …天气数据提出请求
+++退出透传
//获取一次实时天气
//返回: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

以上是关于基于STM32F103的网络天气时钟--------单片机串口获取天气的主要内容,如果未能解决你的问题,请参考以下文章

基于STM32F103的网络天气时钟--------单片机获取天气后OLED显示

基于STM32的ESP8266天气时钟--------MCU获取天气数据

基于STM32的ESP8266天气时钟--------MCU获取天气数据

STM32F103VET6基于STM32CubeMX RTC时钟报警中断使用示例

STM32F103VET6基于STM32CubeMX RTC时钟秒更新中断使用示例

STM32F103VET6基于STM32CubeMX RTC时钟使用示例