基于arduino的ESP32 学习笔记(三)通过心知天气获取天气数据

前言

本文的目的是为了给将要制作的ESP32手环做技术储备

记录通过心知天气API获取天气数据

硬件准备

  • ESP-WROOM-32E开发板

软件准备

  • VSCODE+PlatformIO

相关链接

https://blog.csdn.net/weixin_42487906/article/details/113767644

在我之前的文章里,实现了用art-pi rtt的websocket软件包调用心知天气的API获取到天气信息

在进行本文内容前,需要根据上文,先注册一个心知天气的账户,申请免费的产品,调用免费的API


上图是通过调用这个API,获得的天气信息,是Json格式的,所以在ESP32上,采用ArduinoJson来处理Json格式的信息

代码编写

代码比较简单,很容易看懂,重要的是要把下面的privatekey换成你自己注册的心知天气的私钥,然后ssid和password换成你自己wifi的wifi名和密码

#include <Arduino.h>
#include <ArduinoJson.h>
#include <WiFi.h>

const char *ssid = "XXXXX";
const char *password = "XXXXXXX";

const char *host = "api.seniverse.com";
const char *privateKey = "XXXXXXXXXX";
const char *city = "wuhan";
const char *language = "en";

struct WetherData
{
    char city[32];
    char weather[64];
    char high[32];
    char low[32];
    char humi[32];
};

void setup()
{
    // put your setup code here, to run once:
    Serial.begin(115200);

    Serial.print("Connecting to ");
    Serial.println(ssid);

    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED)
    {
        delay(500);
        Serial.print(".");
    }

    Serial.println("");
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());

    Serial.println("");
    Serial.println("WiFi Conected!");

    WiFiClient client;

    if (!client.connect(host, 80))
    {
        Serial.println("Connect host failed!");
        return;
    }
    Serial.println("host Conected!");

    String getUrl = "/v3/weather/daily.json?key=";
    getUrl += privateKey;
    getUrl += "&location=";
    getUrl += city;
    getUrl += "&language=";
    getUrl += language;
    client.print(String("GET ") + getUrl + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n");
    Serial.println("Get send");

    char endOfHeaders[] = "\r\n\r\n";
    bool ok = client.find(endOfHeaders);
    if (!ok)
    {
        Serial.println("No response or invalid response!");
    }
    Serial.println("Skip headers");

    String line="";

    line += client.readStringUntil('\n'); 
 
    Serial.println(line);

    DynamicJsonDocument doc(1400);

    DeserializationError error = deserializeJson(doc, line);
    if (error)
    {
        Serial.println("deserialize json failed");
        return;
    }
    Serial.println("deserialize json success");

    struct WetherData weatherdata = {0};

    strcpy(weatherdata.city, doc["results"][0]["location"]["name"].as<const char*>());
    strcpy(weatherdata.weather, doc["results"][0]["daily"][0]["text_day"].as<const char*>());
    strcpy(weatherdata.high, doc["results"][0]["daily"][0]["high"].as<const char*>());
    strcpy(weatherdata.low, doc["results"][0]["daily"][0]["low"].as<const char*>());
    strcpy(weatherdata.humi, doc["results"][0]["daily"][0]["humidity"].as<const char*>());

    Serial.println("City");
    Serial.println(weatherdata.city);
    Serial.println("textDay");
    Serial.println(weatherdata.weather);
    Serial.println("temp high");
    Serial.println(weatherdata.high);
    Serial.println("temp low");
    Serial.println(weatherdata.low);
    Serial.println("humi");
    Serial.println(weatherdata.humi);

    Serial.println("read json success");
    Serial.println();
    Serial.println("closing connection");
    client.stop();
}

void loop()
{
    // put your main code here, to run repeatedly:
}
  • 9
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要使用ArduinoJson库解析从心知天气API获取的JSON数据,你需要先在Arduino IDE中安装ArduinoJson库。你可以通过以下步骤进行安装: 1. 打开Arduino IDE。 2. 在菜单栏中选择“工具”->“管理库”。 3. 在“库管理器”中搜索“ArduinoJson”。 4. 找到ArduinoJson库并点击“安装”。 安装完成后,你可以使用以下代码示例来解析心知天气API返回的JSON数据: ```cpp #include <ArduinoJson.h> void parseWeatherData) { const size_t capacity = JSON_OBJECT_SIZE(3) + JSON_ARRAY_SIZE1) + 3*JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(4) + JSON_OBJECT_SIZE(5) + 390; DynamicJsonDocument doc(capacity); DeserializationError error = deserializeJson(doc, jsonData); if (error) { Serial.print("JSON parsing failed. Error: "); Serial.println(error.c_str()); return; } JsonObject results = doc["results"][0]; String location = results["location"]["name"]; String weather = results["now"]["text"]; String temperature = results["now"]["temperature"]; Serial.print("Location: "); Serial.println(location); Serial.print("Weather: "); Serial.println(weather); Serial.print("Temperature: "); Serial.println(temperature); } void setup() { Serial.begin(115200); // 假设你已经通过HTTP请求获取到了心知天气API返回的JSON数据 String jsonData = "{\"results\":[{\"location\":{\"name\":\"Beijing\"},\"now\":{\"text\":\"Cloudy\",\"temperature\":\"25\"}}]}"; parseWeatherData(jsonData); } void loop() { // 主循环 } ``` 在上面的示例代码中,`parseWeatherData()`函数会解析传入的JSON数据,并提取出位置、天气和温度信息。你可以根据心知天气API返回的JSON数据结构来修改代码中的解析逻辑。 请注意,示例代码中使用了DynamicJsonDocument来动态分配内存以容纳JSON数据。你可以根据实际情况调整`capacity`的大小。 通过以上代码,你可以使用ArduinoJson库轻松解析从心知天气API获取的JSON数据,并提取出所需的天气信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值