|
本帖最后由 xinmeng_wit 于 2022-9-28 20:37 编辑
前言
话不多说,直接开始正题。
本次要实现的功能是通过wifi获取某个城市的实时天气信息,主要包括:温度,湿度,天气,风力和风向。
JSON库安装
JSON库是用来解析JSON格式数据,提取需要的信息的一个库,使用起来非常简单方便。
通过 Arduino IDE 【工具】 -> 【库管理】 中输入 Arduino_JSON 并安装该库
注册YY天气获取key
YY天气是和心知天气类似的提供天气信息服务的一个网站,使用之前需要先注册账号,获取到一个key,后面进行天气请求的时候都需要用到这个key。
YY天气网址:http://www.yytianqi.com/home
注册完成后就会分配key,免费版的会员每小时调用api的次数是有限制的,是30次/小时。
对于实时天气的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库进行提取天气信息。
代码编写
- /@@*
- 使用wifi联网获取实时天气信息
- */
- #include <WiFi.h>
- #include <HTTPClient.h>
- #include <Arduino_JSON.h>
- //修改WIFI名称以及密码
- const char* ssid = "CMCC-5hr7";//WIFI名称
- const char* password = "mt2fdn9z";//WIFI密码
- //填入你获得的API Key
- String YYWeatherApiKey = "oav5nwfpajat3ocm";
- // 填写你的城市代码
- String cityCode = "CH020100";//上海
- unsigned long lastTime = 0;
- //设置每120秒获得一次天气数据
- unsigned long timerDelay = 120000;
- String jsonBuffer;
- void setup() {
- Serial.begin(115200);
- WiFi.begin(ssid, password);
- Serial.println("Connecting");
- //判断WIFI是否连接
- while(WiFi.status() != WL_CONNECTED) {
- delay(500);
- Serial.print(".");
- }
- Serial.println("");
- Serial.print("Connected to WiFi network with IP Address: ");
- Serial.println(WiFi.localIP());
- }
- void loop() {
- //发送HTTP获取请求
- if ((millis() - lastTime) > timerDelay) {
- //检测WIFI是否已经连接
- if(WiFi.status()== WL_CONNECTED){
- String serverPath = "http://api.yytianqi.com/observe?city=" + cityCode + "&key=" + YYWeatherApiKey;
- //将组合好的URL放入httpGETRequest函数中通过HTTP获取请求以获得文本
- jsonBuffer = httpGETRequest(serverPath.c_str());
- //Serial.println(jsonBuffer);
- //将解析的Json对象值储存在Jsonu缓冲区中
- JSONVar myObject = JSON.parse(jsonBuffer);
- //判断解析是否成功
- if (JSON.typeof(myObject) == "undefined") {
- Serial.println("Parsing input failed!");
- return;
- }
- Serial.print("JSON object = ");
- Serial.println(myObject);
- //城市
- Serial.print("City: ");
- Serial.println((const char*)myObject["data"]["cityName"]);
- //温度
- Serial.print("Temperature: ");
- Serial.print((const char*)myObject["data"]["qw"]);
- Serial.println(" C");
- //湿度
- Serial.print("Humidity: ");
- Serial.print((const char*)myObject["data"]["sd"]);
- Serial.println(" %");
- //天气
- Serial.print("Weather: ");
- Serial.println((const char*)myObject["data"]["tq"]);
- //风力
- Serial.print("Wind: ");
- Serial.println((const char*)myObject["data"]["fl"]);
- //风向
- Serial.print("Wind Direction: ");
- Serial.println((const char*)myObject["data"]["fx"]);
- Serial.println("");
- }
- else {
- Serial.println("WiFi Disconnected");
- }
- lastTime = millis();
- }
- }
- String httpGETRequest(const char* serverName) {
- WiFiClient client;
- HTTPClient http;
- //连接网址
- http.begin(client, serverName);
- //发送HTTP站点请求
- int httpResponseCode = http.GET();
- //该数组用于储存获得的数据
- String payload = "{}";
- //将获得的数据放入数组
- if (httpResponseCode>0) {
- Serial.print("HTTP Response code: ");
- Serial.println(httpResponseCode);
- payload = http.getString();
- }
- else {
- Serial.print("Error code: ");
- Serial.println(httpResponseCode);
- }
- //释放资源
- http.end();
- //返回获得的数据用于Json处理
- return payload;
- }
复制代码
效果演示
最终通过uart打印出来解析后的天气信息,每2分钟打印一次:
|
|