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

Posted 张竞豪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于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:
}

以上是关于基于arduino的ESP32 学习笔记通过心知天气获取天气数据的主要内容,如果未能解决你的问题,请参考以下文章

基于arduino的ESP32 学习笔记 基于ESP32的智能花盆

基于arduino的ESP32 学习笔记 基于ESP32的智能花盆

基于arduino的ESP32 学习笔记 基于ESP32的智能花盆

基于arduino的ESP32 学习笔记 基于ESP32的智能花盆

基于arduino的ESP32 学习笔记SD卡使用

基于arduino的ESP32 学习笔记SD卡使用