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获取心知天气平台的实时天气数据的主要内容,如果未能解决你的问题,请参考以下文章
基于arduino的ESP32 学习笔记通过心知天气获取天气数据
基于arduino的ESP32 学习笔记通过心知天气获取天气数据