Arduino ESP8266获取心知天气平台的实时天气数据

Posted perseverance52

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Arduino ESP8266获取心知天气平台的实时天气数据相关的知识,希望对你有一定的参考价值。

Arduino ESP8266获取心知天气平台的实时天气数据

  • 所选择的开发板:Nodemcu1.0
  • 支持库版本:2.7.4
  • ArduinoJson版本: V6
  • 所使用到的库:
#include <ESP8266WiFi.h>
#include <ArduinoJson.h>                 //使用v6版的库

本实例程序只对核心数据进行提取,不夹杂其他功能的实现,方便项目的移植。

  • 心知天气的key需要自行去官网注册即可申请。

实例代码

#include <ESP8266WiFi.h>
#include <ArduinoJson.h>                 //使用v6版的库

const char* AP_SSID     = "自家WiFi账号";         //使用时请修改为当前你的 wifi ssid
const char* AP_PSK = "自家WiFi密码";        // 使用时请修改为当前你的 wifi 密码

WiFiClient client;    //创建一个网络对象

void wifi_start_connect()              //连接WIFI
{
  WiFi.mode(WIFI_STA);                 //设置esp8266 工作模式
  Serial.println("Connecting to "); 
  Serial.println(AP_SSID);
  WiFi.begin(AP_SSID, AP_PSK);         //连接wifi
  WiFi.setAutoConnect(true);
  while (WiFi.status() != WL_CONNECTED) //这个函数是wifi连接状态,返回wifi链接状态
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println("WiFi connected IP is");
  Serial.println(WiFi.localIP());
}

void parseUserData(String content)  // Json数据解析并串口打印
{

  DynamicJsonDocument doc(512);
  DeserializationError error = deserializeJson(doc, content);

  if (error) {
    Serial.print(F("deserializeJson() failed: "));
    Serial.println(error.f_str());
    return;
  }
  JsonObject results_0 = doc["results"][0];

  JsonObject results_0_location = results_0["location"];
  const char* results_0_location_name = results_0_location["name"]; // "Zhuzhou"城市信息

  JsonObject results_0_now = results_0["now"];
  const char* results_0_now_text = results_0_now["text"]; // "Cloudy"天气状况
  const char* results_0_now_code = results_0_now["code"]; // "4"风力大小
  const char* results_0_now_temperature = results_0_now["temperature"]; // "31"温度

  Serial.println(results_0_location_name);//通过串口打印出需要的信息
  Serial.println(results_0_now_text);
  Serial.println(results_0_now_code);
  Serial.println(results_0_now_temperature);
  Serial.print("\\r\\n");
}

void setup()
{
  Serial.begin(115200);
  wifi_start_connect();
  client.setTimeout(5000);//设置服务器连接超时时间
}

void loop()
{
  if (client.connect("api.seniverse.com", 80) == 1)           //连接服务器并判断是否连接成功,若成功就发送GET 请求数据下发
  { //换成你自己在心知天气申请的私钥//改成你所在城市的拼音
    client.print("GET /v3/weather/now.json?key=S4hKw5y47tk2ExyTZ&location=zhuzhou&language=zh-Hans&unit=c HTTP/1.1\\r\\n"); //心知天气的URL格式
    client.print("Host:api.seniverse.com\\r\\n");
    client.print("Accept-Language:zh-cn\\r\\n");
    client.print("Connection:close\\r\\n\\r\\n"); //向心知天气的服务器发送请求。

    String status_code = client.readStringUntil('\\r');        //读取GET数据,服务器返回的状态码,若成功则返回状态码200
    Serial.println(status_code);

    if (client.find("\\r\\n\\r\\n") == 1)                         //跳过返回的数据头,直接读取后面的JSON数据,
    {
      String json_from_server = client.readStringUntil('\\n'); //读取返回的JSON数据
      Serial.println(json_from_server);
      parseUserData(json_from_server);                      //将读取的JSON数据,传送到JSON解析函数中进行显示。
    }
  }
  else
  {
    Serial.println("connection failed this time");
    delay(5000);  //请求失败等5秒
  }

  client.stop(); //关闭HTTP客户端
  delay(5000);
}
  • 编译信息
Executable segment sizes:
IROM   : 247024          - code in flash         (default or ICACHE_FLASH_ATTR) 
IRAM   : 26892   / 32768 - code in IRAM          (ICACHE_RAM_ATTR, ISRs...) 
DATA   : 1260  )         - initialized variables (global, static) in RAM/HEAP 
RODATA : 1072  ) / 81920 - constants             (global, static) in RAM/HEAP 
BSS    : 25000 )         - zeroed variables      (global, static) in RAM/HEAP 
使用 1.0  版本的库 ESP8266WiFi 在文件夹: C:\\Users\\Administrator\\AppData\\Local\\Arduino15\\packages\\esp8266\\hardware\\esp8266\\2.7.4\\libraries\\ESP8266WiFi 
使用 6.18.3  版本的库 ArduinoJson 在文件夹: C:\\Users\\Administrator\\Documents\\Arduino\\libraries\\ArduinoJson 
"C:\\\\Users\\\\Administrator\\\\AppData\\\\Local\\\\Arduino15\\\\packages\\\\esp8266\\\\tools\\\\xtensa-lx106-elf-gcc\\\\2.5.0-4-b40a506/bin/xtensa-lx106-elf-size" -A "d:\\\\arduino\\\\MyHexDir/jsonxinzhi.ino.elf"
项目使用了 276248 字节,占用了 (26%) 程序存储空间。最大为 1044464 字节。
全局变量使用了27332字节,(33%)的动态内存,余留54588字节局部变量。最大为81920字节。
  • 串口打印信息

程序代码讲解

  • 如果个人移植,到其他项目当中去,只需要修改key和城市,如果想获取英文数据就改一下语言。具体操作如下:

client.print("GET /v3/weather/now.json?key=S4hKw5y47tk2ExyTZ&location=zhuzhou&language=zh-Hans&unit=c HTTP/1.1\\r\\n");

  • 四处修改的地方:
    –心知密钥: S4hKw5y47tk2ExyTZ换成你自己的
    –城市:zhuzhou,换成你自己的城市,注意是拼音,具体可以去心知官网查询到,下文会有直链,查询。
    –语言类别:zh-Hans,这是中文的,想显示英文的就en
    – 温度参数:c,摄氏度,另一种就是: f

可以参考官方文档说明:

心知天气支持的全球城市城市列表下载
多语言支持说明:心知天气 API 支持 13 种语言,分别为:中文(简体、繁体),英语,日语,德语,法语,俄语,西班牙语,葡萄牙语,泰语,阿拉伯语,印尼语,印地语。

天气数据单位说明

  • JSON原始数据
{"results":[{"location":{"id":"WSBQQ66C8040","name":"Zhuzhou","country":"CN","path":"Zhuzhou,Zhuzhou,Hunan,China","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},"now":{"text":"Cloudy","code":"4","temperature":"31"},"last_update":"2021-08-21T20:24:35+08:00"}]}
  • 序列化的数据

   {
 "results": [{
    "location": {
      "id": "WSBQQ66C8040",
      "name": "Zhuzhou",
      "country": "CN",
      "path": "Zhuzhou,Zhuzhou,Hunan,China",
      "timezone": "Asia/Shanghai",
      "timezone_offset": "+08:00"
    },
    "now": {
      "text": "Cloudy",
      "code": "4",
      "temperature": "31"
    },
    "last_update": "2021-08-21T20:24:35+08:00"
  }]
}

以上是关于Arduino ESP8266获取心知天气平台的实时天气数据的主要内容,如果未能解决你的问题,请参考以下文章

基于STM32的ESP8266获取心知天气数据

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

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

利用封装库获取心知天气数据

基于Arduino和ESP8266的JSON数据获取与解压之和风天气

STM32天气数据获取