首先跟以前一样,连接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上展示