上一期使用了ESP32点亮TFT屏幕以及获取时间之后,这期我们使用ESP32获取天气情况。

首先搜索心知天气,进入官网并且注册后,我们可以申请免费版(20次/分钟的申请频率)

我们申请的免费版后在下方会有密钥,这个密钥就是我们要用的

我们按照这样子的方式把我们的私钥填入api.seniverse.com/v3/weather/now.json?key=Your_private_key&location=beijing&language=zh-Hans&unit=c,可以直接将这个复制入浏览器上方的搜索栏观察是否有效。

这样子就成功申请到啦,我们的准备工作也就结束了。

做好上述准备工作之后我们来编写我们的代码

首先我们需要新安装HTTPClient和ArduinoJson库用以进行HTTP连接以及对接收端 Json字符串进行解析。

因为我们的HTTP请求回来时是一段Json字符串需要解析后方可以使用


接着设置我们的网站地址就是上面那个

为了更方便地存储天气信息,我们定义一个结构体来存放我们的数据


// 定义结构体来存储天气数据
struct WeatherData {
  int City;//城市代码
  int description;//天气代码
  double temperature;//温度
};

接着我们编写获取天气的函数,主要为发送HTTP请求,如果响应成功则解析收到的内容。


void getWeatherData() {
  HTTPClient http;//创建连接结构体
  http.begin(weatherApiUrl);//尝试连接
  int httpCode = http.GET();
  if (httpCode == HTTP_CODE_OK) {
    String weatherData = http.getString();//获取HTTP响应
    
    DynamicJsonDocument doc(1024);
    deserializeJson(doc, weatherData);//解析HTTP
    weather.City = doc["results"][0]["location"]["name"].as<int>;//城市
    weather.description = doc["results"][0]["now"]["text"].as<int>>;;//天气
    weather.temperature = doc["results"][0]["now"]["temperature"].as<double>();//
  } else {
    Serial.println("Failed to fetch weather data");
  }
  http.end();
}

我们将城市代码,天气情况以及温度存入我们的结构体中。之后打印我们的时间,天气等信息。



void displayWeather() {
  tft.setCursor(10, 50);
  timeClient.update();
  tft.println(timeClient.getFormattedTime());
  tft.print("City: ");
  tft.println(weather.City);
  tft.print("Description: ");
  tft.println(weather.description);
  tft.print("Temperature: ");
  tft.print(weather.temperature);
  tft.println(" °C");
}



嘉立创PCB

还没有评论,抢个沙发!