ESP32学习之JSON,和接入心知天气
注意:手机热点或者网络不能开5.0GHz频段和WIFI6,不然ESP32连不上
心知天气账号(免费版即可),网站:心知天气 - 高精度气象数据 - 天气数据API接口 - 行业气象解决方案 (seniverse.com)
V3的用户手册-天气实况:天气实况 (yuque.com)
返回的json数据:
怎么接入?
怎么构建请求?
比如这个:
根据官方提供的API,然后自己填入相关参数进行构建
看官方提供的手册
然后再看他提供的API接口。
这是接口地址,看参数说明,然后自己按要求填写
代码一(24小时的,没有预测):
#include <Arduino.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <string.h>
#include <WiFiMulti.h>
#include <ArduinoJson.h>void TandW();
void httpRequest(String reqRes,int stat);
void connectWiFi();
void parseInfo_now(WiFiClient client,int i);
void parseInfo_fut(WiFiClient client,int i);unsigned int localPort = 8888; // 用于侦听UDP数据包的本地端口
WiFiClient clientNULL;//网络校时的相关配置
static const char ntpServerName[] = "ntp1.aliyun.com"; //NTP服务器,使用阿里云
int timeZone = 8; //时区设置,采用东8区//保存断网前的最新数据
int results_0_now_temperature_int_old;
String results_0_now_text_str_old;
int results_0_daily_1_high_int_old;
int results_0_daily_1_low_int_old;
String results_0_daily_1_text_day_str_old;//----------WIFI连接配置----------
const char* ssid = "your ssid"; // 连接WiFi名(此处使用XXX为示例)
const char* password = "your password"; // 连接WiFi密码(此处使用12345678为示例)// 请将您需要连接的WiFi密码填入引号中
//----------天气API配置----------
const char* host = "api.seniverse.com"; // 将要连接的服务器地址
const int httpPort = 80; // 将要连接的服务器端口 // 心知天气HTTP请求所需信息
String reqUserKey = "your secret key"; // 私钥
String reqLocation = "jiujiang"; // 城市
String reqUnit = "c";
WiFiMulti wifiMulti;
WiFiClient client;void setup() {Serial.begin(115200); connectWiFi();}void loop() {TandW();delay(5000);}void TandW(){String reqRes = "/v3/weather/now.json?key=" + reqUserKey ++ "&location=" + reqLocation + "&language=en&unit=" +reqUnit;// 向心知天气服务器服务器请求信息并对信息进行解析httpRequest(reqRes,0);//延迟,需要低于20次/分钟delay(5000);
}
// 向心知天气服务器服务器请求信息并对信息进行解析
void httpRequest(String reqRes,int stat){WiFiClient client;// 建立http请求信息String httpRequest = String("GET ") + reqRes + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n";Serial.println(""); Serial.print("Connecting to "); Serial.print(host);// 尝试连接服务器if (client.connect(host, 80)){Serial.println(" Success!");// 向服务器发送http请求信息client.print(httpRequest);Serial.println("Sending request: ");Serial.println(httpRequest); // 获取并显示服务器响应状态行 String status_response = client.readStringUntil('\n');Serial.print("status_response: ");Serial.println(status_response);// 使用find跳过HTTP响应头if (client.find("\r\n\r\n")) {Serial.println("Found Header End. Start Parsing.");}if (stat == 0){// 利用ArduinoJson库解析心知天气响应信息(实时数据)parseInfo_now(client,1); }else if(stat == 1){parseInfo_fut(client,1);}}else {Serial.println(" connection failed!");if (stat == 0){// 利用ArduinoJson库解析心知天气响应信息(实时数据)parseInfo_now(clientNULL,0); }else if(stat == 1){parseInfo_fut(clientNULL,0);}}//断开客户端与服务器连接工作client.stop();
}
// 连接WiFi
void connectWiFi(){WiFi.begin(ssid, password); // 启动网络连接Serial.print("Connecting to "); // 串口监视器输出网络连接信息Serial.print(ssid); Serial.println(" ..."); // 告知用户NodeMCU正在尝试WiFi连接int i = 0; // 这一段程序语句用于检查WiFi是否连接成功while (WiFi.status() != WL_CONNECTED) { // WiFi.status()函数的返回值是由NodeMCU的WiFi连接状态所决定的。 delay(1000); // 如果WiFi连接成功则返回值为WL_CONNECTED Serial.print(i++); Serial.print(' '); // 此处通过While循环让NodeMCU每隔一秒钟检查一次WiFi.status()函数返回值} // 同时NodeMCU将通过串口监视器输出连接时长读秒。// 这个读秒是通过变量i每隔一秒自加1来实现的。 Serial.println(""); // WiFi连接成功后Serial.println("Connection established!"); // NodeMCU将通过串口监视器输出"连接成功"信息。Serial.print("IP address: "); // 同时还将输出NodeMCU的IP地址。这一功能是通过调用Serial.println(WiFi.localIP()); // WiFi.localIP()函数来实现的。该函数的返回值即NodeMCU的IP地址。
}
// 利用ArduinoJson库解析心知天气响应信息(实时)
void parseInfo_now(WiFiClient client,int i){if(i==1){const size_t capacity = JSON_ARRAY_SIZE(1) + JSON_OBJECT_SIZE(1) + 2*JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(6) + 230;DynamicJsonDocument doc(capacity);deserializeJson(doc, client);JsonObject results_0 = doc["results"][0];JsonObject results_0_now = results_0["now"];const char* results_0_now_text = results_0_now["text"]; // "Sunny"const char* results_0_now_code = results_0_now["code"]; // "0"const char* results_0_now_temperature = results_0_now["temperature"]; // "32"const char* results_0_last_update = results_0["last_update"]; // "2020-06-02T14:40:00+08:00" // 通过串口监视器显示以上信息String results_0_now_text_str = results_0_now["text"].as<String>(); int results_0_now_code_int = results_0_now["code"].as<int>(); int results_0_now_temperature_int = results_0_now["temperature"].as<int>(); String results_0_last_update_str = results_0["last_update"].as<String>(); Serial.println(F("======Weahter Now======="));Serial.print(F("Weather Now: "));Serial.print(results_0_now_text_str);Serial.print(F(" "));Serial.println(results_0_now_code_int);Serial.print(F("Temperature: "));Serial.println(results_0_now_temperature_int);Serial.print(F("Last Update: "));Serial.println(results_0_last_update_str);Serial.println(F("========================"));//display_0(results_0_now_temperature_int,results_0_now_text_str);results_0_now_text_str_old = results_0_now_text_str;results_0_now_temperature_int_old = results_0_now_temperature_int;}else{//display_0(results_0_now_temperature_int_old,results_0_now_text_str_old);}}
// 利用ArduinoJson库解析心知天气响应信息(预测)
void parseInfo_fut(WiFiClient client,int i){if(i==1){const size_t capacity = JSON_ARRAY_SIZE(1) + JSON_ARRAY_SIZE(3) + JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(6) + 3*JSON_OBJECT_SIZE(14) + 860;DynamicJsonDocument doc(capacity);deserializeJson(doc, client);JsonObject results_0 = doc["results"][0];JsonArray results_0_daily = results_0["daily"];JsonObject results_0_daily_0 = results_0_daily[0];const char* results_0_daily_0_date = results_0_daily_0["date"]; const char* results_0_daily_0_text_day = results_0_daily_0["text_day"]; const char* results_0_daily_0_code_day = results_0_daily_0["code_day"];const char* results_0_daily_0_text_night = results_0_daily_0["text_night"]; const char* results_0_daily_0_code_night = results_0_daily_0["code_night"]; const char* results_0_daily_0_high = results_0_daily_0["high"];const char* results_0_daily_0_low = results_0_daily_0["low"]; const char* results_0_daily_0_rainfall = results_0_daily_0["rainfall"];const char* results_0_daily_0_precip = results_0_daily_0["precip"]; const char* results_0_daily_0_wind_direction = results_0_daily_0["wind_direction"]; const char* results_0_daily_0_wind_direction_degree = results_0_daily_0["wind_direction_degree"];const char* results_0_daily_0_wind_speed = results_0_daily_0["wind_speed"];const char* results_0_daily_0_wind_scale = results_0_daily_0["wind_scale"];const char* results_0_daily_0_humidity = results_0_daily_0["humidity"];JsonObject results_0_daily_1 = results_0_daily[1];const char* results_0_daily_1_date = results_0_daily_1["date"];const char* results_0_daily_1_text_day = results_0_daily_1["text_day"];const char* results_0_daily_1_code_day = results_0_daily_1["code_day"];const char* results_0_daily_1_text_night = results_0_daily_1["text_night"]; const char* results_0_daily_1_code_night = results_0_daily_1["code_night"]; const char* results_0_daily_1_high = results_0_daily_1["high"];const char* results_0_daily_1_low = results_0_daily_1["low"]; const char* results_0_daily_1_rainfall = results_0_daily_1["rainfall"]; const char* results_0_daily_1_precip = results_0_daily_1["precip"]; const char* results_0_daily_1_wind_direction = results_0_daily_1["wind_direction"];const char* results_0_daily_1_wind_direction_degree = results_0_daily_1["wind_direction_degree"]; const char* results_0_daily_1_wind_speed = results_0_daily_1["wind_speed"];const char* results_0_daily_1_wind_scale = results_0_daily_1["wind_scale"];const char* results_0_daily_1_humidity = results_0_daily_1["humidity"]; JsonObject results_0_daily_2 = results_0_daily[2];const char* results_0_daily_2_date = results_0_daily_2["date"];const char* results_0_daily_2_text_day = results_0_daily_2["text_day"];const char* results_0_daily_2_code_day = results_0_daily_2["code_day"];const char* results_0_daily_2_text_night = results_0_daily_2["text_night"];const char* results_0_daily_2_code_night = results_0_daily_2["code_night"];const char* results_0_daily_2_high = results_0_daily_2["high"]; const char* results_0_daily_2_low = results_0_daily_2["low"]; const char* results_0_daily_2_rainfall = results_0_daily_2["rainfall"];const char* results_0_daily_2_precip = results_0_daily_2["precip"]; const char* results_0_daily_2_wind_direction = results_0_daily_2["wind_direction"]; const char* results_0_daily_2_wind_direction_degree = results_0_daily_2["wind_direction_degree"]; const char* results_0_daily_2_wind_speed = results_0_daily_2["wind_speed"];const char* results_0_daily_2_wind_scale = results_0_daily_2["wind_scale"]; const char* results_0_daily_2_humidity = results_0_daily_2["humidity"]; const char* results_0_last_update = results_0["last_update"]; // 从以上信息中摘选几个通过串口监视器显示String results_0_daily_0_date_str = results_0_daily_0["date"].as<String>();String results_0_daily_0_text_day_str = results_0_daily_0["text_day"].as<String>(); int results_0_daily_0_code_day_int = results_0_daily_0["code_day"].as<int>(); String results_0_daily_0_text_night_str = results_0_daily_0["text_night"].as<String>(); int results_0_daily_0_code_night_int = results_0_daily_0["code_night"].as<int>(); int results_0_daily_0_high_int = results_0_daily_0["high"].as<int>();int results_0_daily_0_low_int = results_0_daily_0["low"].as<int>();String results_0_last_update_str = results_0["last_update"].as<String>();int results_0_daily_1_high_int = results_0_daily_1["high"].as<int>();int results_0_daily_1_low_int = results_0_daily_1["low"].as<int>();String results_0_daily_1_text_day_str = results_0_daily_1["text_day"].as<String>();Serial.println(F("======Today Weahter ======="));Serial.print(F("DATE: "));Serial.println(results_0_daily_0_date_str);Serial.print(F("Day Weather: "));Serial.print(results_0_daily_0_text_day_str);Serial.print(F(" "));Serial.println(results_0_daily_0_code_day_int);Serial.print(F("Night Weather: "));Serial.print(results_0_daily_0_text_night_str);Serial.print(F(" "));Serial.println(results_0_daily_0_code_night_int);Serial.print(F("High: "));Serial.println(results_0_daily_0_high_int);Serial.print(F("LOW: "));Serial.println(results_0_daily_0_low_int);Serial.print(F("Last Update: "));Serial.println(results_0_last_update_str);Serial.println(F("=============================="));// display_1(results_0_daily_1_high_int,results_0_daily_1_low_int,results_0_daily_1_text_day_str);results_0_daily_1_high_int_old=results_0_daily_1_high_int;results_0_daily_1_low_int_old=results_0_daily_1_low_int;results_0_daily_1_text_day_str_old=results_0_daily_1_text_day_str;
}else{// display_1(results_0_daily_1_high_int_old,results_0_daily_1_low_int_old,results_0_daily_1_text_day_str_old);
}}
结果:
代码二(有预测):
#include <Arduino.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <string.h>
#include <WiFiMulti.h>
#include <ArduinoJson.h>void TandW();
void httpRequest(String reqRes,int stat);
void connectWiFi();
void parseInfo_now(WiFiClient client,int i);
void parseInfo_fut(WiFiClient client,int i);unsigned int localPort = 8888; // 用于侦听UDP数据包的本地端口
WiFiClient clientNULL;//网络校时的相关配置
static const char ntpServerName[] = "ntp1.aliyun.com"; //NTP服务器,使用阿里云
int timeZone = 8; //时区设置,采用东8区//保存断网前的最新数据
int results_0_now_temperature_int_old;
String results_0_now_text_str_old;
int results_0_daily_1_high_int_old;
int results_0_daily_1_low_int_old;
String results_0_daily_1_text_day_str_old;//----------WIFI连接配置----------
const char* ssid = "your ssid"; // 连接WiFi名(此处使用XXX为示例)
const char* password = "your password"; // 连接WiFi密码(此处使用12345678为示例)// 请将您需要连接的WiFi密码填入引号中
//----------天气API配置----------
const char* host = "api.seniverse.com"; // 将要连接的服务器地址
const int httpPort = 80; // 将要连接的服务器端口 // 心知天气HTTP请求所需信息
String reqUserKey = "your secret key"; // 私钥
String reqLocation = "jiujiang"; // 城市
String reqUnit = "c";
WiFiMulti wifiMulti;
WiFiClient client;void setup() {Serial.begin(115200); connectWiFi();}void loop() {TandW();delay(5000);}void TandW(){String reqRes = "/v3/weather/daily.json?key=" + reqUserKey ++ "&location=" + reqLocation + "&language=en&unit=" +reqUnit+"&start=0&days=3";// 向心知天气服务器服务器请求信息并对信息进行解析httpRequest(reqRes,1);//延迟,需要低于20次/分钟delay(5000);
}
// 向心知天气服务器服务器请求信息并对信息进行解析
void httpRequest(String reqRes,int stat){WiFiClient client;// 建立http请求信息String httpRequest = String("GET ") + reqRes + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n";Serial.println(""); Serial.print("Connecting to "); Serial.print(host);// 尝试连接服务器if (client.connect(host, 80)){Serial.println(" Success!");// 向服务器发送http请求信息client.print(httpRequest);Serial.println("Sending request: ");Serial.println(httpRequest); // 获取并显示服务器响应状态行 String status_response = client.readStringUntil('\n');Serial.print("status_response: ");Serial.println(status_response);// 使用find跳过HTTP响应头if (client.find("\r\n\r\n")) {Serial.println("Found Header End. Start Parsing.");}if (stat == 0){// 利用ArduinoJson库解析心知天气响应信息(实时数据)parseInfo_now(client,1); }else if(stat == 1){parseInfo_fut(client,1);}}else {Serial.println(" connection failed!");if (stat == 0){// 利用ArduinoJson库解析心知天气响应信息(实时数据)parseInfo_now(clientNULL,0); }else if(stat == 1){parseInfo_fut(clientNULL,0);}}//断开客户端与服务器连接工作client.stop();
}
// 连接WiFi
void connectWiFi(){WiFi.begin(ssid, password); // 启动网络连接Serial.print("Connecting to "); // 串口监视器输出网络连接信息Serial.print(ssid); Serial.println(" ..."); // 告知用户NodeMCU正在尝试WiFi连接int i = 0; // 这一段程序语句用于检查WiFi是否连接成功while (WiFi.status() != WL_CONNECTED) { // WiFi.status()函数的返回值是由NodeMCU的WiFi连接状态所决定的。 delay(1000); // 如果WiFi连接成功则返回值为WL_CONNECTED Serial.print(i++); Serial.print(' '); // 此处通过While循环让NodeMCU每隔一秒钟检查一次WiFi.status()函数返回值} // 同时NodeMCU将通过串口监视器输出连接时长读秒。// 这个读秒是通过变量i每隔一秒自加1来实现的。 Serial.println(""); // WiFi连接成功后Serial.println("Connection established!"); // NodeMCU将通过串口监视器输出"连接成功"信息。Serial.print("IP address: "); // 同时还将输出NodeMCU的IP地址。这一功能是通过调用Serial.println(WiFi.localIP()); // WiFi.localIP()函数来实现的。该函数的返回值即NodeMCU的IP地址。
}
// 利用ArduinoJson库解析心知天气响应信息(实时)
void parseInfo_now(WiFiClient client,int i){if(i==1){const size_t capacity = JSON_ARRAY_SIZE(1) + JSON_OBJECT_SIZE(1) + 2*JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(6) + 230;DynamicJsonDocument doc(capacity);deserializeJson(doc, client);JsonObject results_0 = doc["results"][0];JsonObject results_0_now = results_0["now"];const char* results_0_now_text = results_0_now["text"]; // "Sunny"const char* results_0_now_code = results_0_now["code"]; // "0"const char* results_0_now_temperature = results_0_now["temperature"]; // "32"const char* results_0_last_update = results_0["last_update"]; // "2020-06-02T14:40:00+08:00" // 通过串口监视器显示以上信息String results_0_now_text_str = results_0_now["text"].as<String>(); int results_0_now_code_int = results_0_now["code"].as<int>(); int results_0_now_temperature_int = results_0_now["temperature"].as<int>(); String results_0_last_update_str = results_0["last_update"].as<String>(); Serial.println(F("======Weahter Now======="));Serial.print(F("Weather Now: "));Serial.print(results_0_now_text_str);Serial.print(F(" "));Serial.println(results_0_now_code_int);Serial.print(F("Temperature: "));Serial.println(results_0_now_temperature_int);Serial.print(F("Last Update: "));Serial.println(results_0_last_update_str);Serial.println(F("========================"));//display_0(results_0_now_temperature_int,results_0_now_text_str);results_0_now_text_str_old = results_0_now_text_str;results_0_now_temperature_int_old = results_0_now_temperature_int;}else{//display_0(results_0_now_temperature_int_old,results_0_now_text_str_old);}}
// 利用ArduinoJson库解析心知天气响应信息(预测)
void parseInfo_fut(WiFiClient client,int i){if(i==1){const size_t capacity = JSON_ARRAY_SIZE(1) + JSON_ARRAY_SIZE(3) + JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(6) + 3*JSON_OBJECT_SIZE(14) + 860;DynamicJsonDocument doc(capacity);deserializeJson(doc, client);JsonObject results_0 = doc["results"][0];JsonArray results_0_daily = results_0["daily"];JsonObject results_0_daily_0 = results_0_daily[0];const char* results_0_daily_0_date = results_0_daily_0["date"]; const char* results_0_daily_0_text_day = results_0_daily_0["text_day"]; const char* results_0_daily_0_code_day = results_0_daily_0["code_day"];const char* results_0_daily_0_text_night = results_0_daily_0["text_night"]; const char* results_0_daily_0_code_night = results_0_daily_0["code_night"]; const char* results_0_daily_0_high = results_0_daily_0["high"];const char* results_0_daily_0_low = results_0_daily_0["low"]; const char* results_0_daily_0_rainfall = results_0_daily_0["rainfall"];const char* results_0_daily_0_precip = results_0_daily_0["precip"]; const char* results_0_daily_0_wind_direction = results_0_daily_0["wind_direction"]; const char* results_0_daily_0_wind_direction_degree = results_0_daily_0["wind_direction_degree"];const char* results_0_daily_0_wind_speed = results_0_daily_0["wind_speed"];const char* results_0_daily_0_wind_scale = results_0_daily_0["wind_scale"];const char* results_0_daily_0_humidity = results_0_daily_0["humidity"];JsonObject results_0_daily_1 = results_0_daily[1];const char* results_0_daily_1_date = results_0_daily_1["date"];const char* results_0_daily_1_text_day = results_0_daily_1["text_day"];const char* results_0_daily_1_code_day = results_0_daily_1["code_day"];const char* results_0_daily_1_text_night = results_0_daily_1["text_night"]; const char* results_0_daily_1_code_night = results_0_daily_1["code_night"]; const char* results_0_daily_1_high = results_0_daily_1["high"];const char* results_0_daily_1_low = results_0_daily_1["low"]; const char* results_0_daily_1_rainfall = results_0_daily_1["rainfall"]; const char* results_0_daily_1_precip = results_0_daily_1["precip"]; const char* results_0_daily_1_wind_direction = results_0_daily_1["wind_direction"];const char* results_0_daily_1_wind_direction_degree = results_0_daily_1["wind_direction_degree"]; const char* results_0_daily_1_wind_speed = results_0_daily_1["wind_speed"];const char* results_0_daily_1_wind_scale = results_0_daily_1["wind_scale"];const char* results_0_daily_1_humidity = results_0_daily_1["humidity"]; JsonObject results_0_daily_2 = results_0_daily[2];const char* results_0_daily_2_date = results_0_daily_2["date"];const char* results_0_daily_2_text_day = results_0_daily_2["text_day"];const char* results_0_daily_2_code_day = results_0_daily_2["code_day"];const char* results_0_daily_2_text_night = results_0_daily_2["text_night"];const char* results_0_daily_2_code_night = results_0_daily_2["code_night"];const char* results_0_daily_2_high = results_0_daily_2["high"]; const char* results_0_daily_2_low = results_0_daily_2["low"]; const char* results_0_daily_2_rainfall = results_0_daily_2["rainfall"];const char* results_0_daily_2_precip = results_0_daily_2["precip"]; const char* results_0_daily_2_wind_direction = results_0_daily_2["wind_direction"]; const char* results_0_daily_2_wind_direction_degree = results_0_daily_2["wind_direction_degree"]; const char* results_0_daily_2_wind_speed = results_0_daily_2["wind_speed"];const char* results_0_daily_2_wind_scale = results_0_daily_2["wind_scale"]; const char* results_0_daily_2_humidity = results_0_daily_2["humidity"]; const char* results_0_last_update = results_0["last_update"]; // 从以上信息中摘选几个通过串口监视器显示String results_0_daily_0_date_str = results_0_daily_0["date"].as<String>();String results_0_daily_0_text_day_str = results_0_daily_0["text_day"].as<String>(); int results_0_daily_0_code_day_int = results_0_daily_0["code_day"].as<int>(); String results_0_daily_0_text_night_str = results_0_daily_0["text_night"].as<String>(); int results_0_daily_0_code_night_int = results_0_daily_0["code_night"].as<int>(); int results_0_daily_0_high_int = results_0_daily_0["high"].as<int>();int results_0_daily_0_low_int = results_0_daily_0["low"].as<int>();String results_0_last_update_str = results_0["last_update"].as<String>();int results_0_daily_1_high_int = results_0_daily_1["high"].as<int>();int results_0_daily_1_low_int = results_0_daily_1["low"].as<int>();String results_0_daily_1_text_day_str = results_0_daily_1["text_day"].as<String>();Serial.println(F("======Today Weahter ======="));Serial.print(F("DATE: "));Serial.println(results_0_daily_0_date_str);Serial.print(F("Day Weather: "));Serial.print(results_0_daily_0_text_day_str);Serial.print(F(" "));Serial.println(results_0_daily_0_code_day_int);Serial.print(F("Night Weather: "));Serial.print(results_0_daily_0_text_night_str);Serial.print(F(" "));Serial.println(results_0_daily_0_code_night_int);Serial.print(F("High: "));Serial.println(results_0_daily_0_high_int);Serial.print(F("LOW: "));Serial.println(results_0_daily_0_low_int);Serial.print(F("Last Update: "));Serial.println(results_0_last_update_str);Serial.println(F("=============================="));// display_1(results_0_daily_1_high_int,results_0_daily_1_low_int,results_0_daily_1_text_day_str);results_0_daily_1_high_int_old=results_0_daily_1_high_int;results_0_daily_1_low_int_old=results_0_daily_1_low_int;results_0_daily_1_text_day_str_old=results_0_daily_1_text_day_str;
}else{// display_1(results_0_daily_1_high_int_old,results_0_daily_1_low_int_old,results_0_daily_1_text_day_str_old);
}}
结果:
代码三(自己写的-有预测):
#include <Arduino.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <string.h>
#include <WiFiMulti.h>
#include <ArduinoJson.h>void TandW();
void httpRequest(String reqRes,int stat);
void connectWiFi();//----------WIFI连接配置----------
const char* ssid = "your ssid"; // 连接WiFi名(此处使用XXX为示例)
const char* password = "your password"; // 连接WiFi密码(此处使用12345678为示例)// 请将您需要连接的WiFi密码填入引号中
//----------天气API配置----------
const char* host = "api.seniverse.com"; // 将要连接的服务器地址
const int httpPort = 80; // 将要连接的服务器端口 // 心知天气HTTP请求所需信息
String reqUserKey = "your secret key"; // 私钥
String reqLocation = "jiujiang"; // 城市
String reqUnit = "c"; WiFiClient client;void setup() {Serial.begin(115200); connectWiFi();}void loop() {TandW();delay(5000);}void TandW(){String reqRes = "/v3/weather/daily.json?key=" + reqUserKey ++ "&location=" + reqLocation + "&language=en&unit=" +reqUnit+"&start=0&days=3";// 向心知天气服务器服务器请求信息并对信息进行解析httpRequest(reqRes,0);//延迟,需要低于20次/分钟delay(5000);
}
// 向心知天气服务器服务器请求信息并对信息进行解析
void httpRequest(String reqRes,int stat){WiFiClient client;// 建立http请求信息String httpRequest = String("GET ") + reqRes + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n";Serial.println(""); Serial.print("Connecting to "); Serial.print(host);// 尝试连接服务器if (client.connect(host, 80)){Serial.println(" Success!");// 向服务器发送http请求信息client.print(httpRequest);Serial.println("Sending request: ");Serial.println(httpRequest); // 获取并显示服务器响应状态行 String status_response = client.readStringUntil('\n');Serial.print("status_response: ");Serial.println(status_response);// 使用find跳过HTTP响应头if (client.find("\r\n\r\n")) {Serial.println("Found Header End. Start Parsing.");}const size_t capacity = JSON_ARRAY_SIZE(1) + JSON_ARRAY_SIZE(3) + JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(6) + 3*JSON_OBJECT_SIZE(14) + 860;DynamicJsonDocument doc(capacity);deserializeJson(doc, client);JsonObject results_0 = doc["results"][0];JsonArray results_0_now = results_0["daily"];JsonObject results_0_now_1 = results_0_now[1];//0为当天的日期,1为明天的日期const char* results_0_now_text = results_0_now_1["date"]; Serial.println(results_0_now_text);}else {Serial.println(" connection failed!");}//断开客户端与服务器连接工作client.stop();
}
// 连接WiFi
void connectWiFi(){WiFi.begin(ssid, password); // 启动网络连接Serial.print("Connecting to "); // 串口监视器输出网络连接信息Serial.print(ssid); Serial.println(" ..."); // 告知用户NodeMCU正在尝试WiFi连接int i = 0; // 这一段程序语句用于检查WiFi是否连接成功while (WiFi.status() != WL_CONNECTED) { // WiFi.status()函数的返回值是由NodeMCU的WiFi连接状态所决定的。 delay(1000); // 如果WiFi连接成功则返回值为WL_CONNECTED Serial.print(i++); Serial.print(' '); // 此处通过While循环让NodeMCU每隔一秒钟检查一次WiFi.status()函数返回值} // 同时NodeMCU将通过串口监视器输出连接时长读秒。// 这个读秒是通过变量i每隔一秒自加1来实现的。 Serial.println(""); // WiFi连接成功后Serial.println("Connection established!"); // NodeMCU将通过串口监视器输出"连接成功"信息。Serial.print("IP address: "); // 同时还将输出NodeMCU的IP地址。这一功能是通过调用Serial.println(WiFi.localIP()); // WiFi.localIP()函数来实现的。该函数的返回值即NodeMCU的IP地址。
}
四.扩展知识
JSON数据解析:
博客:使用ESP8266配合ArduinoJson库来解析JSON信息_json_array_size_20161201的博客-CSDN博客
arduino JSON数据信息解析_一入极客深似海的博客-CSDN博客
json就是用[]一层套一层
JsonObject results_0 = doc["results"][0];JsonArray results_0_daily = results_0["daily"];JsonObject results_0_daily_0 = results_0_daily[0];const char* results_0_daily_0_date = results_0_daily_0["date"]; const char* results_0_daily_0_text_day = results_0_daily_0["text_day"]; const char* results_0_daily_0_code_day = results_0_daily_0["code_day"];const char* results_0_daily_0_text_night = results_0_daily_0["text_night"]; const char* results_0_daily_0_code_night = results_0_daily_0["code_night"]; const char* results_0_daily_0_high = results_0_daily_0["high"];const char* results_0_daily_0_low = results_0_daily_0["low"]; const char* results_0_daily_0_rainfall = results_0_daily_0["rainfall"];const char* results_0_daily_0_precip = results_0_daily_0["precip"]; const char* results_0_daily_0_wind_direction = results_0_daily_0["wind_direction"]; const char* results_0_daily_0_wind_direction_degree = results_0_daily_0["wind_direction_degree"];const char* results_0_daily_0_wind_speed = results_0_daily_0["wind_speed"];const char* results_0_daily_0_wind_scale = results_0_daily_0["wind_scale"];const char* results_0_daily_0_humidity = results_0_daily_0["humidity"];JsonObject results_0_daily_1 = results_0_daily[1];const char* results_0_daily_1_date = results_0_daily_1["date"];const char* results_0_daily_1_text_day = results_0_daily_1["text_day"];const char* results_0_daily_1_code_day = results_0_daily_1["code_day"];const char* results_0_daily_1_text_night = results_0_daily_1["text_night"]; const char* results_0_daily_1_code_night = results_0_daily_1["code_night"]; const char* results_0_daily_1_high = results_0_daily_1["high"];const char* results_0_daily_1_low = results_0_daily_1["low"]; const char* results_0_daily_1_rainfall = results_0_daily_1["rainfall"]; const char* results_0_daily_1_precip = results_0_daily_1["precip"]; const char* results_0_daily_1_wind_direction = results_0_daily_1["wind_direction"];const char* results_0_daily_1_wind_direction_degree = results_0_daily_1["wind_direction_degree"]; const char* results_0_daily_1_wind_speed = results_0_daily_1["wind_speed"];const char* results_0_daily_1_wind_scale = results_0_daily_1["wind_scale"];const char* results_0_daily_1_humidity = results_0_daily_1["humidity"]; JsonObject results_0_daily_2 = results_0_daily[2];const char* results_0_daily_2_date = results_0_daily_2["date"];const char* results_0_daily_2_text_day = results_0_daily_2["text_day"];const char* results_0_daily_2_code_day = results_0_daily_2["code_day"];const char* results_0_daily_2_text_night = results_0_daily_2["text_night"];const char* results_0_daily_2_code_night = results_0_daily_2["code_night"];const char* results_0_daily_2_high = results_0_daily_2["high"]; const char* results_0_daily_2_low = results_0_daily_2["low"]; const char* results_0_daily_2_rainfall = results_0_daily_2["rainfall"];const char* results_0_daily_2_precip = results_0_daily_2["precip"]; const char* results_0_daily_2_wind_direction = results_0_daily_2["wind_direction"]; const char* results_0_daily_2_wind_direction_degree = results_0_daily_2["wind_direction_degree"]; const char* results_0_daily_2_wind_speed = results_0_daily_2["wind_speed"];const char* results_0_daily_2_wind_scale = results_0_daily_2["wind_scale"]; const char* results_0_daily_2_humidity = results_0_daily_2["humidity"]; const char* results_0_last_update = results_0["last_update"];
看上面的博客,上面的这段代码结合图片也就懂了。
参考博客:利用ESP8266+OLED(I2C)打造智能时钟(网络校时+实时天气+天气预报)_esp8266oled制作天气时钟_下雪还是下雨的博客-CSDN博客
ESP32学习之JSON,和接入心知天气相关推荐
- Esp8266 --深入分析官方json解析源码及如何使用json接口解析心知天气
什么是json? 懵逼回答:[参考菜鸟教程] a.JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) b.JSON 是轻量级的文本数据交 ...
- 心知天气API如何调用与json数据如何显示
心知天气官网:https://www.seniverse.com/doc 首先需要注册获得密钥和ID. 因为我不是会员,这里就简单介绍下,怎么调用并显示. Json数据如下图所示: { results ...
- stm32+esp8266 GET请求心知天气的简单方法
文章目录 前言 一.ESP8266调试 二.代码部分 1.esp8266部分 2.单片机代码部分 总结 前言 因为之前学习stm32+esp8266请求心知天气时看的不是很懂,然后在成功调试出来之后发 ...
- ESP8266+oled连接心知天气显示时间和实时天气
因为时间比较仓促,目前存在许多问题没有解决. 首先进行aduino环境配置,具体方法可参考以下链接,若选错开发板型号编译会报错配置esp8266开发板的Arduino开发环境_交通运输怪味张的博客-C ...
- esp8266获取天气信息:心知天气get及url讲解说明
本人最近在使用esp8266获取天气预报,在网上搜寻了一番,使用了心知天气的api(不是打广告),本人对网络方面不是很懂,经过几天的查找资料与学习,然后在博客记录下,方便以后的学习可广大学友. url ...
- 使用 Fiddler 调试 心知天气,stm32 esp8266获取天气api
心知天气 - 免费用户的功能: 国内 370 个主要城市 天气实况,包括天气现象文字.代码和气温 3 项数据 未来 3 天天气预报,包括白天天气现象文字及代码.晚间天气现象文字及代码.当天最高温度和最 ...
- 利用Arduino Esp8266 心知天气API 获取天气预报信息(修改后可以DIY一个小型的桌面气象台)
前期准备: 注册心知天气,获取API密钥 https://www.seniverse.com 生成API请求地址,北京今天和未来4天的预报请求地址如下: https://api.seniverse. ...
- esp8266点灯LCD12864心知天气+农历+空气质量ArduinoJson6
接上篇 esp8266 mixly blynk远程控制 + NTP+天气预报及一体 智能钟 时钟原理图见上篇文章 心知天气.农历API用的是ArduinoJson6解析.且采用的char* 变量 .上 ...
- Android中基于心知天气API获取天气信息
Android中基于心知天气获取天气信息 JSON JSON简介 JSON对象 JSON数组 JSON解析 Android中获取天气 获取天气的流程 获取心知天气的API key 获取心知天气的API ...
最新文章
- 清华大学梁宸计算机系,应用数学专业论文
- Linux安全基础:grep命令的使用
- ubuntu下搭建android开发环境(转载)
- React v16版本 源码解读
- C语言之原码、反码和补码
- 和孩子们一起学Python编程
- PHP报错:Cannot use a scalar value as an array
- 2010-2019年中国城市统计年鉴分享
- 机器人机电液控制一体化联合仿真
- 一个正经的前端学习 开源 仓库(每日更新)-698道知识点
- 2022 DSCTF首届数字空间安全攻防大赛 部分题解
- Vue 在同一元素上实现单击、双击事件 (将其自定义指令)
- 电子类研究生的STM32小白入门 一个定时器 四个channel复用映射 实现超声波四路测距
- 甲骨文公司老板埃里森在耶如大学的…
- 高通平台的耳机检测(msm8909)
- 如何防止U盘病毒入侵方法
- 【51单片机】 ULN2003模块 驱动步进电机(5线)正反转 代码以及接线图(简单教学,一看就会)
- Pytorch 分布式训练中DP和DDP的原理和用法
- ubuntu16.04环境Kdevelop安装和汉化
- window脚本介绍
热门文章
- stata工具变量笔记代码
- python时间格式转换为美式日期,Python中time日期、时间格式转换
- crmeb从创建数据表到实现最基础增删改查的实现全过程【带附件】
- 东软睿道杯计算机大赛,关于开展东北大学秦皇岛分校第九届“东软睿道杯”大学生创业大赛的通知...
- proteus VSM常见问题
- PAT 团体程序设计天梯赛-练习集 题解(凑零钱,堆栈,社交集群)
- 怎么开源你的项目:不要仅仅是开放仓库
- 删除文件恢复软件?只需2个步骤
- iOS仿QQ侧滑菜单、登录按钮动画、仿斗鱼直播APP、城市选择器、自动布局等源码...
- 非洲“手机之王”——传音即将登陆科创板