ESP32_HTTP请求获取天气,含json解析


//安装 ArduinoJson@6.21.3
#include "WiFi.h"
#include "HTTPClient.h"
#include "ArduinoJson.h"
 
//**********宏、常量********************
//WIFI名和密码
const char *ssid = "";                         //SSID
const char *password = "";        //PASSWORD
 
//心知天气配置
const char *private_key = "SJo8p9FiiIu6gDNz4";    //私钥
const char *city = "guangzhou";                   //查询的城市
const char *day = "3";                            //查询几日内的天气(免费用户最多可查3日)
 
//**********全局变量********************
String http_req;           //http请求
String http_rsp;           //http应答
HTTPClient http_client;
DynamicJsonDocument doc(2048);  //json
 
//***********函数声明*******************
void WIFI_Config(void);           //连接WIFI
void set_weather_httpclient(void);//设置获取天气的接口
void anylasize_weather_json(String jsonStr);
 
//***********初始化*********************
void setup()
{
  Serial.begin(115200);
  WIFI_Config();                
  set_weather_httpclient();
}
 
//***********循环************************
void loop()
{
  int http_code = http_client.GET();
  
  if (http_code == HTTP_CODE_OK) {
    http_rsp = http_client.getString();
    Serial.println(http_rsp);             //打印原始的http响应
    anylasize_weather_json(http_rsp);
    while(1);
  }else{
    Serial.printf("HTTP get code: %d\n", http_code);
  }
  delay(5000);
}
 
//***********函数实现*******************
//连接WIFI
void WIFI_Config()
{
  Serial.println("connecting WIFI");
  WiFi.begin(ssid, password);
  while (!WiFi.isConnected()){        //等待连接
    Serial.print(".");
    delay(500);
  }
  Serial.println("Wifi connected\n");   //连接成功
}
 
//设置获取天气的接口
void set_weather_httpclient()
{
  http_req = (String)"https://api.seniverse.com/v3/weather/daily.json?key=" + private_key ;
  http_req += (String)"&location=" + city + "&language=en&unit=c&start=0&days=" + day;
  Serial.println(http_req);
  if (http_client.begin(http_req)){
    Serial.println("set_weather_httpclient ok.\n");
  }
}
 
//解析JSON字符串
//{"results":[{"location":{"id":"WS0E9D8WN298","name":"Guangzhou","country":"CN","path":"Guangzhou,Guangzhou,Guangdong,China","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},"daily":[{"date":"2023-10-07","text_day":"Overcast","code_day":"9","text_night":"Overcast","code_night":"9","high":"26","low":"20","rainfall":"0.00","precip":"0.00","wind_direction":"N","wind_direction_degree":"2","wind_speed":"21.06","wind_scale":"4","humidity":"73"},{"date":"2023-10-08","text_day":"Overcast","code_day":"9","text_night":"Overcast","code_night":"9","high":"25","low":"21","rainfall":"0.00","precip":"0.00","wind_direction":"NE","wind_direction_degree":"63","wind_speed":"23.94","wind_scale":"4","humidity":"71"},{"date":"2023-10-09","text_day":"Overcast","code_day":"9","text_night":"Overcast","code_night":"9","high":"26","low":"23","rainfall":"0.00","precip":"0.00","wind_direction":"NE","wind_direction_degree":"30","wind_speed":"13.46","wind_scale":"3","humidity":"71"}],"last_update":"2023-10-07T20:00:00+08:00"}]}
void anylasize_weather_json(String jsonStr)
{ 
  int index = jsonStr.indexOf('{');         //找到json的{
  jsonStr = jsonStr.substring(index);
    
  deserializeJson(doc, jsonStr);            //字符串解析成json格式 
  JsonObject root = doc.as<JsonObject>();   //doc转换成的JsonObject对象root  
  
  JsonArray results = root["results"];      //JsonObject对象root里有JsonArray数组results
  
  JsonObject location = results[0]["location"]; //results[0]中的子JsonObject对象location  
  const char *name = location["name"];          //JsonObject对象location中取出name(城市名)  Guangzhou
  Serial.println(name);
 
  JsonArray daily = results[0]["daily"];        //results[0]中的JsonArray数组daily
  const char *date = daily[0]["date"];          //JsonArray数组daily中[0]的“date”(日期)  2023-10-07
  Serial.println(date);
  const char *weather = daily[0]["text_day"];   //JsonArray数组daily中[0]的“text_day”(天气)  Overcast
  Serial.println(weather);
  const char *low = daily[0]["low"];            //JsonArray数组daily中[0]的最低和最高气温  temper is 20~26 deg
  const char *high = daily[0]["high"];
  Serial.println((String)"temper is "+low+"~"+high+" deg");  
}
 

参考:ESP32_HTTP请求获取天气,含json解析_esp32 心知天气_PWRJOY的博客-CSDN博客

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值