ESP32实现天气播报
前言
前面几篇已经把WiFi天气语音播报涉及到的知识内容提了一下,这一篇进行项目的整合进而完成WiFi天气语音播报。
1、实现功能
自己编写相关代码,驱动WIFI模组,连接气象服务器,获取当地天气,同时还可以通过温湿度传感器采集到当前室内的温湿度值,并在LCD屏上进行显示,还可以进行语音播报
在这里就不使用温湿度传感器读取实时温湿度了。
2、获取并解析天气数据
首先我们要配置WIFI模块连上热点,检测是否接入 WIFI GOT IP,连接服务器,开启透传,获取天气结果。当WIFI模块获取服务器一次实时天气成功后,会返回对应的json格式数据,然后再对json格式数据解析获取需要的内容。需要说的是JSON是一种特殊的数据结构,ESP32中有一个内置的库cjson,用来处理json格式的数据并且获取内容。
void Get_Weather(void)
{
static uint8_t count = 0;
char http_cmd[256] = {
0};
uint8_t recv = 0;
cJSON *root = NULL,*json_results = NULL,*json_arry = NULL,*json_location = NULL,*json_now = NULL,*json_daily = NULL,*json_daily_arr = NULL;
switch(count)
{
case 0://退出透传
weatherTime[1] = 1000;
WIFI_SendStr("+++");
count++;
break;
case 1://复位
WIFI_SendStr("AT+RST\r\n");
count++;
break;
case 2://自动连接网络 不直接连接服务器防止使用过程中断网
recv = ESP8266_SendCmd_RecAck(NULL, "WIFI GOT IP", 30000, 1);
// if(recv){
// ESP8266_ConnectHotspot();//一键配网模式
// }
count++;
break;
case 3://连接服务器
recv = ESP8266_SendCmd_RecAck("AT+CIPSTART=\"TCP\",\"116.62.81.138\",80\r\n", "OK", 20000, 1);
if(recv == 0) count++;
break;
case 4://开启透传
recv = ESP8266_SendCmd_RecAck("AT+CIPMODE=1\r\n", "OK", 1000, 1);
if(recv == 0) count++;
break;
case 5://开始透传
recv = ESP8266_SendCmd_RecAck("AT+CIPSEND\r\n", ">", 2000, 1);
if(recv == 0) count++;
break;
case 6://获取实时天气数据
sprintf(http_cmd, "GET https://api.seniverse.com/v3/weather/now.json?key=%s&location=%s&language=en&unit=c\r\n",
Key_ID,
location[location_pos]);
printf("%s\r\n", http_cmd);
WIFI_SendStr(http_cmd);
count++;
break;
case 7://解析数据
count =