硬件平台:ESP8266 WIFI模块、STM32核心板、OLED显示屏
实现方式:
1.ESP8266 WIFI工作模式为STA+TCPClinet;
2.通讯协议:HTTP
3.天气数据获取平台:心知天气网
ESP8266 WIFI模块自带TCP/IP网络协议栈,通过AT指令集完成网络模式配置。知心天气采用精准数据源授权预报信息,可查看全国各地的实时天气预告、24小时预报、15天预报、空气质量指数等预报信息。采样HTTP协议接入服务器。
HTTP:超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。HTTP是应用层协议,同其他应用层协议一样,是为了实现某一类具体应用的协议,并由某一运行在用户空间的应用程序来实现其功能。
功能实现
1.创建心知天气个人账户,心知天气地址:https://www.seniverse.com/api
2.选择产品->天气数据接口,激活产品
3.激活成功后即可看到公钥和私钥,这个参数在后面获取数据是需要用到。
4.HTTP方式获取天气数据
天气实况获取接口参数:
https://api.seniverse.com/v3/weather/now.json?key=SwD4-aaQxhedD1z7U&location=beijing&language=zh-Hans&unit=c
“api.seniverse.com” -- 平台访问域名
“SwD4-aaQxhedD1z7U” --个人私有秘钥
“beijing” --要获取的城市名称
“zh-Hans” --获取到的数据语言(zh-Hans为简体中文)
平台返回数据格式:
5.功能实现
心知的 API 目前基于 http 协议,域名是 api.seniverse.com,端口是缺省的 80(http)和 443(https)。
int main()
{
u8 stat=0;
u16 cnt=0;
Beep_Init();//蜂鸣器初始化
Led_Init();//LED初始化
Key_Init();//按键初始化
Usartx_Init(USART1,115200,72);
Usartx_Init(USART2,9600,36);//蓝牙默认9600
Usartx_Init(USART3,115200,36);//WIFI默认115200
TIMx_Init(TIM2,72,20000);//通过定时器2辅助串口接收数据,20ms
TIMx_Init(TIM3,72,20000);//TIM3辅助串口2数据接收,20ms接收一帧数据
TIMx_Init(TIM4,72,20000);//TIM4辅助串口3数据接收,20ms接收一帧数据
printf("wifi Init\r\n");
count++;
cnt++;
DelayMs(10);
if(count>=500)
{
count=0;
USARTx_Sendstr(USART3,"GET https://api.seniverse.com/v3/weather/now.json?key=SwD4-ybQxhedD1z7U&location=jiangxi nanchang&language=en&unit=c\n");
// USARTx_Sendstr(USART3,"GET https://api.seniverse.com/v3/weather/grid/minutely.json?key=SwD4-ybQxhedD1z7U&location=114.38:27.80\n");
}
if(usart3_flag)
{
usart3_rx_buff[usart3_cnt]='\0';
weather_show_stat=1;
//printf("%s\r\n",usart3_rx_buff);
/*
{"results":[{"location":{"id":"WSCQ4UBFXPTE","name":"Yichun","country":"CN",
"path":"Yichun,Yichun,Jiangxi,China","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},
"now":{"text":"Sunny","code":"0","temperature":"36"},"last_update":"2020-08-03T14:00:00+08:00"}]}
*/
if(key==0)
{
/*解析天气数据*/
stat=Weather_analysis(usart3_rx_buff,(u8 *)""name"",(u8 *)buff);//城市名称
if(!stat)
{
OLED_Display_str((127-48-strlen(buff)*8)/2,4,(u8 *)buff);
}
stat=Weather_analysis(usart3_rx_buff,(u8 *)""temperature"",(u8 *)buff);//获取温度
if(!stat)
{
OLED_Display_str(127-26,6,(u8 *)" ");
OLED_Display_str(127-20-strlen(buff)*8,6,(u8 *)buff);
OLED_Display_Flont(127-20,6,4);//显示℃
}
stat=Weather_analysis(usart3_rx_buff,(u8 *)""code"",(u8 *)buff);//天气代码
if(!stat)
{
sscanf(buff,"%d",(int *)&cnt);
//printf("cnt=%d\n",cnt);
switch(cnt)
{
case 0://晴
case 1://晚上晴
OLED_Dislay_Bmp(127-48,0,48,48,bmp_0);
break;
case 4://多云
OLED_Dislay_Bmp(127-48,0,48,48,bmp_4);
break;
case 5://晴转多云
OLED_Dislay_Bmp(127-48,0,48,48,bmp_5);
break;
case 6:
case 7:
case 8:
case 9://阴
OLED_Dislay_Bmp(127-48,0,48,48,bmp_9);
break;
case 10://阵雨
case 11://雷阵雨
case 13:
case 14://雨
case 15:
case 16://大雨
case 17:
case 18://暴雨
OLED_Dislay_Bmp(127-48,0,48,48,bmp_14);
break;
default:
OLED_Dislay_Bmp(127-48,0,48,48,bmp_0);
break;
}
}
}
usart3_flag=0;
usart3_cnt=0;
}
6.平台返回数据解析
平台返回数据格式为Json格式数据,可自行封装函数完成数据解析。
/******************解析 天气数据****************
形参:u8* buff原始数据
u8 *Weather_stat天气数据标志
u8 *data解析获取到的数据
返回值:0---成功,其他值---失败
************************************************/
u8 Weather_analysis(u8* buff,u8 *Weather_stat,u8 *data)
{
char *p=NULL;
u16 i=0;
p=strstr((char *)buff,(char *)Weather_stat);//获取温度
if(p)
{
p+=strlen((char *)Weather_stat)+2;
i=0;
while(*p!='"' && *p!='\0')
{
data[i++]=*p++;
}
data[i]='\0';
return 0;
}
else return 1;
}
7.天气图标下载和实物效果