STM32+ESP8266水墨屏天气时钟:ESP8266连接心知天气获取数据

本文介绍了如何使用STM32F103C8T6微控制器配合ESP8266模块进行串口通信,实现WiFi连接,通过心知天气API获取实时天气数据的过程,包括设置WiFi模式、连接AP、发送API请求及数据解析。
摘要由CSDN通过智能技术生成

项目背景

利用STM32F103C8T6和ESP8266模块进行通信,获取心知天气的数据。
硬件设计为串口1(PA9和PA10)连接ESP8266.
串口2打印

一.ESP8266连接WIFI

ESP8266模块可以通过AT指令控制搭配使用源代码API函数开发,总体开发速度快,难度较低。
说明:下面仅列举一些最常用的AT指令及用法,指令的详细参数及使用说明请参考官方文档:ESP8266 AT指令集。
基础指令
AT 测试AT启动
AT+RST 重启模块
AT+GMR 查看版本信息
WiFi功能AT指令
AT+CWMODE 设置WiFi模式(sta/AP/sta+AP)
AT+CWLAP 扫描附近的AP信息
AT+CWJAP 连接AP
AT+CWQAP 与AP断开连接
AT+CWSAP 设置ESP8266 softAP配置
AT+CWLIF 获取连接到 ESP8266 softAP 的 station 的信息
关于WiFi模式这里要说明一下,sta模式下模块相当于客户端,像我们手机平板一样是要去连接路由器的,而AP模式下模块相当于路由器,是发射WiFi被别人连的。ESP8266支持两种模式并存(模块出厂默认的是AP模式) 。另外,扫描WiFi指令 AT+CWLAP 只能在sta模式下使用,否则会报ERRO错误, AT+CWJAP 和 AT+CWQAP 指令也同理。
ESP8266开启sta模式连接WiFi步骤

1.发送 AT+CWMODE=1 指令配置模块为sta模式(参数1,2,3分别对应模式sta,AP和sta/AP)。
2.发送 AT+CWLAP 指令扫描当前附近WiFi,模块会返回可用AP列表。
3.使用 AT+CWJAP=“WiFi名称”,“WiFi密码” 连接到指定的路由器,比如WiFi是 “ESP8266”,密码是“12345678”,实际连接WiFi发送的指令就是 AT+CWJAP=“ESP8266”,“12345678” 。
返回的“WIFI CONNECTED”说明连接成功,“WIFI GOT IP”代表模块分配到了IP。
4.最后可使用 AT+CWQAP 断开当前连接的WiFi。

//连接WIFI
//返回值:0,成功;1,失败
u8 esp8266_start_trans(void)
{
	u8 *p;
	u8 res=1; 
	int trans_time=0;
	p=mymalloc(SRAMIN,50);							//申请32字节内存,用于存wifista_ssid,wifista_password
	u2_printf("send:AT\r\n");	
	while(esp8266_send_cmd("AT","OK",20))//检查WIFI模块是否在线
	{
	} 
	//设置工作模式 1:station模式   2:AP模式  3:兼容 AP+station模式
	u2_printf("send:AT+CWMODE=1\r\n");	
	esp8266_send_cmd("AT+CWMODE=1","OK",100);
	
	//Wifi模块重启
	u2_printf("send:AT+RST\r\n");	
	esp8266_send_cmd("AT+RST","OK",50);
	delay_ms(1000);         //延时3S等待重启成功
	delay_ms(1000);
	delay_ms(1000);	
	
	//设置单路连接模式
	u2_printf("send:AT+CIPMUX=0\r\n");	
	esp8266_send_cmd("AT+CIPMUX=0","OK",20);   

	sprintf((char*)p,"AT+CWJAP=\"%s\",\"%s\"",wifista_ssid,wifista_password);//设置无线参数:ssid,密码
	u2_printf("send:AT+CWJAP=\"%s\",\"%s\"\r\n",wifista_ssid,wifista_password);
	
	while(esp8266_send_cmd(p,"WIFI GOT IP",300))		//连接目标路由器,并且获得IP
	{
		 //连接不到退出
		delay_ms(500);
        trans_time++;
		 if(trans_time>4)
		 {
		   return 10;
		 }
	}
	myfree(SRAMIN,p);
	return 0;		
}

二.心知天气注册

本项目为WiFi天气时钟,自然离不开需要从网页上读取天气信息。这里我们使用业内比较著名的知心天气。
登陆心知天气官网https://www.seniverse.com
注册完成后点击“产品”,进入“天气数据”在这里插入图片描述
立即免费试用
在这里插入图片描述
免费版申请
在这里插入图片描述
申请后可查看到自己的私钥(自行保存后面需要用到)
在这里插入图片描述
目前,大部分网络数据调用都是习惯性的调用数据提供商的API接口函数
重新点击“产品”—>“天气数据”,点击“查看API文档”
在这里插入图片描述点击"天气实况",打开对应的API接口文档
在这里插入图片描述
查看天气实况的接口地址,以及返回的数据结果示例(自行保存后面需要用到)
心知天气会为每个账户提供公钥和私钥,这里我们只用到私钥,只需替代掉接口网址中your_api_key为自己的私钥即可。
在这里插入图片描述
在这里插入图片描述

三.ESP8266获取天气数据

1.发送指令AT+CIPSTART=“TCP”,“api.seniverse.com”,80,和心知天气建立TCP连接。
2.发送指令“AT+CIPMODE=1”设置成功则返回OK。
3.发送指令“AT+CIPSEND” 开始透传。
4.发送“GET https://api.seniverse.com/v3/weather/now.json?key=私钥&location=城市拼音&language=zh-Hans&unit=c”向网址提出请求。
5.解析返回的数据。
6.退出透传。
7.关闭TCP连接。

//获取一次实时天气
//返回:0---获取成功,1---获取失败
u8 get_current_weather(void)
{
	u8 res;
	p=mymalloc(SRAMIN,40);							//申请40字节内存
	
	//配置目标TCP服务器
	sprintf((char*)p,"AT+CIPSTART=\"TCP\",\"%s\",%s",WEATHER_SERVERIP,WEATHER_PORTNUM);    
	u2_printf("send:%s\r\n",p);  
	res = esp8266_send_cmd(p,"OK",100);//连接到目标TCP服务器
	if(res==1)
	{
		myfree(SRAMIN,p);
		return 1;
	}
	delay_ms(300);
	
	//传输模式为:透传	
	u2_printf("send:AT+CIPMODE=1\r\n");	
	esp8266_send_cmd("AT+CIPMODE=1","OK",100);      
	
	//开始透传
	USART_RX_STA=0;
	u2_printf("send:AT+CIPSEND\r\n");	
	esp8266_send_cmd("AT+CIPSEND","OK",100);       

	u2_printf("GET https://api.seniverse.com/v3/weather/now.json?key=私钥&location=城市拼音\r\n");  
	printf("GET https://api.seniverse.com/v3/weather/now.json?key=私钥&location=城市拼音\r\n");  

	delay_ms(20);//延时20ms返回的是指令发送成功的状态
	USART_RX_STA=0;	//清零串口数据
	delay_ms(1000);
	if(USART_RX_STA&0X8000)		//此时再次接到一次数据,为天气的数据
	{ 
		USART_RX_BUF[USART_RX_STA&0X7FFF]=0;//添加结束符
	} 

	//解析天气数据
	cJSON_WeatherParse(USART_RX_BUF, results);		
	//退出透传
	atk_8266_quit_trans();

	//关闭TCP连接
	u2_printf("send:AT+CIPCLOSE\r\n");	
	esp8266_send_cmd("AT+CIPCLOSE","OK",50);    
	
	myfree(SRAMIN,p);
	return 0;
}

最终的效果就是串口打印出
在这里插入图片描述

代码工程连接链接:https://pan.baidu.com/s/1fyeJFAyB0rBoF9bS7ysIYQ?pwd=1cni
提取码:1cni

基于STM32ESP8266的桌面型网络天气时钟系统设计如下:该系统主要由STM32单片机、ESP8266无线模块、RTC实时时钟模块、LCD显示和温湿度传感器等组成。 首先,STM32作为主控单元,负责整个系统的控制和协调。它通过串口与ESP8266进行通信,将获取到的天气数据发送给ESP8266进行处理和联网。 其次,ESP8266无线模块实现了系统的网络连接功能。它能够通过WiFi无线网络连接到互联网,从而获取天气数据。ESP8266利用HTTP协议与已有的天气API进行通信,获取实时的天气数据,并将其返回给STM32。 RTC实时时钟模块用于实时记录当前时间,并在断电后能够继续保持时间的准确性。它提供了精确的时钟信号以及日期显示功能,确保系统能够准确显示当前时间和日期。 LCD显示用于显示系统中的各种信息,包括时间、日期、天气预报等。通过与STM32进行通信,LCD幕能够根据接收到的数据更新显示内容。 最后,温湿度传感器用于实时监测环境的温度和湿度。它通过与STM32连接,将监测到的数据传输给STM32进行处理和显示,并可以根据数据判断是否需要提醒用户进行调整。 总之,基于STM32ESP8266的桌面型网络天气时钟系统能够通过连接到互联网获取实时的天气数据,并将其显示在LCD幕上。同时,它还能够显示当前时间、日期和环境温湿度等信息,为用户提供了一种实用的功能,并能够根据实时数据进行提醒和调整。
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱学习的王大胖子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值