Beetle ESP32 C3 wifi联网获取实时天气信息-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 479|回复: 0

Beetle ESP32 C3 wifi联网获取实时天气信息

[复制链接]
发表于 2022-9-28 20:35 | 显示全部楼层 |阅读模式
本帖最后由 xinmeng_wit 于 2022-9-28 20:37 编辑

前言


话不多说,直接开始正题。
本次要实现的功能是通过wifi获取某个城市的实时天气信息,主要包括:温度,湿度,天气,风力和风向。

JSON库安装

JSON库是用来解析JSON格式数据,提取需要的信息的一个库,使用起来非常简单方便。
通过 Arduino IDE 【工具】 -> 【库管理】 中输入 Arduino_JSON 并安装该库

1.jpg

注册YY天气获取key


YY天气是和心知天气类似的提供天气信息服务的一个网站,使用之前需要先注册账号,获取到一个key,后面进行天气请求的时候都需要用到这个key。
YY天气网址:http://www.yytianqi.com/home
注册完成后就会分配key,免费版的会员每小时调用api的次数是有限制的,是30次/小时。

2.jpg


对于实时天气的json数据格式是这样的:
{
    “code”: 1,
    “msg”: “Sucess”,
    “counts”: 2362,  //访问的剩余次数。
    “data”: {
        “cityId”: “CH010100”,  //城市id
        “cityName”: “北京”,  //城市名称
        “lastUpdate”: “2016-03-09 17:10:00”,  //实况更新时间
        “tq”: “多云”,  //天气现象
        “numtq”: “01”,  //天气现象编码
        “qw”: “5.0”,  //当前气温
        “fl”: “微风”,  //当前风力
        “numfl”: “0”,  //当前风力编码
        “fx”: “无持续风向”,  //当前风向
        “numfx”: “0”,  //当前风向编码
        “sd”: “10.0”  //相对湿度,直接在此数值后添加%即可
    }
}
根据这个格式,就可以使用Arduino_JSON库进行提取天气信息。

代码编写

  1.     /@@*
  2.     使用wifi联网获取实时天气信息
  3.     */
  4.     #include <WiFi.h>
  5.     #include <HTTPClient.h>
  6.     #include <Arduino_JSON.h>
  7.     //修改WIFI名称以及密码
  8.     const char* ssid = "CMCC-5hr7";//WIFI名称
  9.     const char* password = "mt2fdn9z";//WIFI密码
  10.     //填入你获得的API Key
  11.     String YYWeatherApiKey = "oav5nwfpajat3ocm";
  12.     // 填写你的城市代码
  13.     String cityCode = "CH020100";//上海
  14.     unsigned long lastTime = 0;
  15.     //设置每120秒获得一次天气数据
  16.     unsigned long timerDelay = 120000;
  17.     String jsonBuffer;
  18.     void setup() {
  19.       Serial.begin(115200);
  20.       WiFi.begin(ssid, password);
  21.       Serial.println("Connecting");
  22.       //判断WIFI是否连接
  23.       while(WiFi.status() != WL_CONNECTED) {
  24.         delay(500);
  25.         Serial.print(".");
  26.       }
  27.       Serial.println("");
  28.       Serial.print("Connected to WiFi network with IP Address: ");
  29.       Serial.println(WiFi.localIP());
  30.     }
  31.     void loop() {
  32.       //发送HTTP获取请求
  33.       if ((millis() - lastTime) > timerDelay) {
  34.         //检测WIFI是否已经连接
  35.         if(WiFi.status()== WL_CONNECTED){
  36.           String serverPath = "http://api.yytianqi.com/observe?city=" + cityCode + "&key=" + YYWeatherApiKey;
  37.           //将组合好的URL放入httpGETRequest函数中通过HTTP获取请求以获得文本
  38.           jsonBuffer = httpGETRequest(serverPath.c_str());
  39.           //Serial.println(jsonBuffer);
  40.           //将解析的Json对象值储存在Jsonu缓冲区中
  41.           JSONVar myObject = JSON.parse(jsonBuffer);
  42.           //判断解析是否成功
  43.           if (JSON.typeof(myObject) == "undefined") {
  44.             Serial.println("Parsing input failed!");
  45.             return;
  46.           }
  47.           Serial.print("JSON object = ");
  48.           Serial.println(myObject);
  49.           //城市
  50.           Serial.print("City: ");
  51.           Serial.println((const char*)myObject["data"]["cityName"]);
  52.           //温度
  53.           Serial.print("Temperature: ");
  54.           Serial.print((const char*)myObject["data"]["qw"]);
  55.           Serial.println(" C");
  56.            //湿度
  57.           Serial.print("Humidity: ");
  58.           Serial.print((const char*)myObject["data"]["sd"]);  
  59.           Serial.println(" %");   
  60.           //天气
  61.           Serial.print("Weather: ");
  62.           Serial.println((const char*)myObject["data"]["tq"]);
  63.           //风力
  64.           Serial.print("Wind: ");
  65.           Serial.println((const char*)myObject["data"]["fl"]);   
  66.           //风向
  67.           Serial.print("Wind Direction: ");
  68.           Serial.println((const char*)myObject["data"]["fx"]);
  69.           Serial.println("");
  70.         }
  71.         else {
  72.           Serial.println("WiFi Disconnected");
  73.         }
  74.         lastTime = millis();
  75.       }
  76.     }
  77.     String httpGETRequest(const char* serverName) {
  78.       WiFiClient client;
  79.       HTTPClient http;
  80.       //连接网址
  81.       http.begin(client, serverName);
  82.       //发送HTTP站点请求
  83.       int httpResponseCode = http.GET();
  84.       //该数组用于储存获得的数据
  85.       String payload = "{}";
  86.       //将获得的数据放入数组
  87.       if (httpResponseCode>0) {
  88.         Serial.print("HTTP Response code: ");
  89.         Serial.println(httpResponseCode);
  90.         payload = http.getString();
  91.       }
  92.       else {
  93.         Serial.print("Error code: ");
  94.         Serial.println(httpResponseCode);
  95.       }
  96.       //释放资源
  97.       http.end();
  98.       //返回获得的数据用于Json处理
  99.       return payload;
  100.     }
复制代码




效果演示

最终通过uart打印出来解析后的天气信息,每2分钟打印一次:

3.jpg



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-1 05:37 , Processed in 0.074489 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表