STM32天气数据获取

STM32天气数据获取

  • 硬件资源
    ESP8266无线上网模块、STM32系统板、OLED屏
  • 实现方式
    ESP8266无线上网模块配置为STA+TCPClinet;
    通讯协议:HTTP
    天气数据获取:心知天气网
  • 实现步骤
    1.创建心知天气个人账户
    平台地址:心知天气
    在这里插入图片描述
    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;	
		}
  • 解析天气数据函数
/******************解析 天气数据****************
形参: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;
}
  • 串口接收数据

在这里插入图片描述

  • 相关图标制作

在这里插入图片描述

  • 实现效果
    在这里插入图片描述
    完整示例:
    https://download.csdn.net/download/weixin_44453694/12799276

猜你喜欢

转载自blog.csdn.net/weixin_44453694/article/details/111874441
今日推荐