OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » STM32G070RB探测26-ESP8266(ESP01S)httpget天气

共2条 1/1 1 跳转至

STM32G070RB探测26-ESP8266(ESP01S)httpget天气(单片机控制)

高工
2021-03-04 00:34:08    评分

害,一言难尽啊,过年电脑和板子拿回家,结果我还没开始玩,电脑主板就被傻外甥干坏了,初七提前上班,开始找BUG,初十出差,好吧,这就是我鸽了太久的理由借口,昨天出差回来了,今天先怼完胡辣汤,上图上图

今天来完成get天气的单片机小部分,实现get到天气数据,当然还是按照之前的步骤来的,好像挺久远了,那就回顾一下

首先跟以前一样,连接WIFI,TCP连接,然后发送GET命令,接收数据

跟以前一样,初始化,但需要修改连接域名和端口

{"AT+CIPSTART=\"TCP\",\"api.seniverse.com\",80\r\n", "CONNECT"},

然后跟之前的POST上传一样,写一个封装函数(星号为自己的KEY)

void Get_Weather_FillBuf(char *buf)
{
	sprintf(buf, "GET https://api.seniverse.com/v3/weather/now.json?key=**************&location=zhengzhou&language=en&unit=c\r\n\r\n");
}

同样再写一个发送函数,这里每次发送都会TCP连接都会关闭,所以每次都要重新连接TCP

//==========================================================
//	函数名称:	Get_Weather_SendData
//
//	函数功能:	发送GET api指令到平台
//
//	入口参数:	无
//
//	返回参数:	无
//
//	说明:
//==========================================================
void Get_Weather_SendData(void)
{

	char buf[256];

	memset(buf, 0, sizeof(buf));

	ESP8266_SendCmd(esp_inti_cmd[6][0],esp_inti_cmd[6][1],5000);//重新连接TCP

	Get_Weather_FillBuf(buf);									//封装数据流

	ESP8266_SendData((unsigned char *)buf, strlen(buf));
}

这次启用一个定时器,用来定时GET数据. 就使用以前定时器点灯那篇的定时器6,STM32G070RB探测7-定时器简单计时这里是半秒一次中断,设置一分钟GET一次,频率不要太高,因为免费的一定时间内有次数限制,获取天气,一分钟一次也就够用了(实际应用其实可以更长).

上定时代码

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* tim_baseHandle)
{
    if(tim_baseHandle->Instance == htim6.Instance)
    {
        /* Toggle LED */
    	HAL_GPIO_TogglePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin);
    	time6_count++;
    }
}

主函数内代码

HAL_TIM_Base_Start_IT(&htim6);
time6_count = 120;
while (1)
{
	if(time6_count>119)
	{
		time6_count = 0;
		Get_Weather_SendData();//上传数据
		HAL_Delay(200);//等待平台回复
	}
	if(usart1_rx.flag)//接收到数据
	{
		ipd_rx = ESP8266_GetIPD();//解析数据
		if(ipd_rx.len>0)//判断是否为网络下发数据
		{
			printf("\r\n\r\nipd_rx.IPD_buff:%s\r\n\r\n",ipd_rx.IPD_buff);
		}
		Clear_Usart(&usart1_rx);//清空缓存
	}
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
}

直接看效果

天气已经获取到了

下边一步该解析天气了,依然使用字符串操作(当然也可以json解析)

一样是傻瓜操作,直接上代码了

if(usart1_rx.flag)//接收到数据
{
	ipd_rx = ESP8266_GetIPD();//解析数据
	if(ipd_rx.len>0)//判断是否为网络下发数据
	{
		printf("\r\n\r\nipd_rx.IPD_buff:%s\r\n\r\n",ipd_rx.IPD_buff);

		//获取温度
		//我这里只写了零上的温度,零下的懒狗的我先不写了
		weatheradr= strstr((char *)ipd_rx.IPD_buff, "temperature");//找到"temperature"
		memcpy(buf,weatheradr+14,2);
		temperature = 0;
		if(buf[1]!=0x22)//温度两位数
		{
			temperature += (buf[1]-0x30);
			temperature += ((buf[0]-0x30)*10);
		}
		else//温度一位数
		{
			temperature += (buf[0]-0x30);
		}

		//获取天气代码
		weatheradr= strstr((char *)ipd_rx.IPD_buff, "code");//找到"code"
		memcpy(buf,weatheradr+7,2);
		code = 0;
		if(buf[1]!=0x22)//0x22为双引号的ASCII码
		{
			code += (buf[1]-0x30);
			code += ((buf[0]-0x30)*10);
		}
		else
		{
			code += (buf[0]-0x30);
		}

		//获取天气
		memset(weather, 0, sizeof(weather));
		weatheradr= strstr((char *)ipd_rx.IPD_buff, "text");//找到"code"
		memcpy(buf,weatheradr+7,10);

		for(i=0;i<10;i++)
		{
			if(buf[i]==0x22)
			{
				memcpy(weather,buf,i);
				break;
			}
		}
		printf("\r\n\r\ntemperature:%d℃\r\n",temperature);
		printf("code:%d\r\n",code);
		printf("weather:%s\r\n\r\n",weather);
	}
	Clear_Usart(&usart1_rx);//清空缓存
}

效果如下

蛮好的,下篇在OLED上展示  



专家
2021-03-15 00:30:24    评分
2楼

谢谢分享


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]