零、前言
在这里我们先要认识json:
JOSN是一种轻量级的数据交换格式,遵循以下规则:
1.并列的数据之间用逗号(,)分隔
2.映射用冒号(:)表示
3.并列数据的集合(数组)用方括号([])表示
4.映射的集合(对象)用大括号({})表示
一、连接WiFi
由于要使用WiFi和连接到互联网,我们要在头文件中首先引入WiFi和HTTPClient这两个库,然后通过begin函数来连接上WiFi
在这里WiFi.begin("WiFi名称",?"WiFi密码");
输入相对应的WiFi名称和密码就可以连接上WiFi了,
while (WiFi.status() != WL_CONNECTED)
{ //这里是阻塞程序,直到连接成功
delay(300);
Serial.print(".");
}
然后使用阻塞程序,意思就是当你的WiFi没有连接上去时会一直重新连接,如果一直连不上(串口显示Connecting...),因该是WiFi名称或者密码连接错误。
接着在set up函数中打印IP地址用来证明WiFi连接成功。
void setup()
{
Serial.begin(115200); // open the serial port at 115200 bps;
delay(100);
Serial.print("Connecting.. ");
WiFi_Connect();
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
二、爬取信息
下面定义一个长整型变量wenDu用来显示一会要打印出来的温度。然后定义一个字符串存放天气的url,这里我用的是和风天气来爬取温度,
long int wenDu = 0;
String weatherUrl = "https://devapi.qweather.com/v7/weather/now?location=113.62701403693164,34.747358802645046&key=b408a1df55fa4c22b270be9a6a27f561&gzip=n&en";
DynamicJsonDocument doc(1024);
然后就是使用begin函数http.begin(weatherUrl)来进入这样的一个网址,定义一个httpCode来存放这个网址所返回的代码,如果能够正常进入的话这个返回的http.GET()应该返回的值为200。
然后当收到正确的内容后,我们定义一个字符串用于存放爬取网站的json信息
Serial.printf("HTTP Get Code: %d\r\n", httpCode);
if (httpCode == HTTP_CODE_OK) // 收到正确的内容
{
String resBuff = http.getString();
//输出示例{"code":"200","updateTime":"2021-10-03T11:32+08:00","fxLink":"http://hfx.link/1tsq1","now":{"obsTime":"2021-10-03T11:23+08:00","temp":"28","feelsLike":"31","icon":"104","text":"阴","wind360":"180","windDir":"南风","windScale":"2","windSpeed":"7","humidity":"73","precip":"0.0","pressure":"993","vis":"11","cloud":"100","dew":"21"},"refer":{"sources":["QWeather","NMC","ECMWF"],"license":["no commercial use"]}}
Serial.println(resBuff);
deserializeJson(doc, resBuff);
wenDu = doc["now"]["temp"];
Serial.printf("温度: %ld \r\n", wenDu);
}
三、开始使用json解析
?然后通过在线解析工具我们可以看到json想要传递给我们的一些讯息,在这里我要用到的信息温度就是now这一对象的一个属性temp(温度),就可以使用doc[][]来进行解析,第一个参数是对象名称,第二个参数是这个对象中的一个属性的名称,这样子就能得到我们想要的数据,最后打印出来就可以了。
Serial.printf("HTTP Get Error: %s\n", http.errorToString(httpCode).c_str());
成品示例:
最后附上整个代码段
#include <Arduino.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include "../lib/ArduinoJson/ArduinoJson.h"
// JOSN是一种轻量级的数据交换格式,遵循以下规则:
// 1.并列的数据之间用逗号(,)分隔
// 2.映射用冒号(:)表示
// 3.并列数据的集合(数组)用方括号([])表示
// 4.映射的集合(对象)用大括号({})表示
// WiFi的初始化和连接
void WiFi_Connect()
{
WiFi.begin("CMCC-CVe2", "ardxy3eq");
while (WiFi.status() != WL_CONNECTED)
{ //这里是阻塞程序,直到连接成功
delay(300);
Serial.print(".");
}
}
void setup()
{
Serial.begin(115200); // open the serial port at 115200 bps;
delay(100);
Serial.print("Connecting.. ");
WiFi_Connect();
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
long int wenDu = 0;
String weatherUrl = "https://devapi.qweather.com/v7/weather/now?location=113.62701403693164,34.747358802645046&key=b408a1df55fa4c22b270be9a6a27f561&gzip=n&en";
DynamicJsonDocument doc(1024);
void getWeather()
{
HTTPClient http;
http.begin(weatherUrl);
int httpCode = http.GET();
if (httpCode > 0)
{
// httpCode will be negative on error
Serial.printf("HTTP Get Code: %d\r\n", httpCode);
if (httpCode == HTTP_CODE_OK) // 收到正确的内容
{
String resBuff = http.getString();
//输出示例{"code":"200","updateTime":"2021-10-03T11:32+08:00","fxLink":"http://hfx.link/1tsq1","now":{"obsTime":"2021-10-03T11:23+08:00","temp":"28","feelsLike":"31","icon":"104","text":"阴","wind360":"180","windDir":"南风","windScale":"2","windSpeed":"7","humidity":"73","precip":"0.0","pressure":"993","vis":"11","cloud":"100","dew":"21"},"refer":{"sources":["QWeather","NMC","ECMWF"],"license":["no commercial use"]}}
Serial.println(resBuff);
deserializeJson(doc, resBuff);
wenDu = doc["now"]["temp"];
Serial.printf("温度: %ld \r\n", wenDu);
}
}
else
{
Serial.printf("HTTP Get Error: %s\n", http.errorToString(httpCode).c_str());
}
http.end();
}
void loop()
{
getWeather();
delay(5000);
delay(5000);
}
本篇文章参考:
ESP32超详细教程-使用VSCode(基于Arduino框架)_哔哩哔哩_bilibili
和风天气开发平台:和风天气开发平台 ~ 高效强大的天气API,天气SDK和天气插件 (qweather.com)
本人也是单片机小白,本篇文章仅用于学习分享的目的,文章中有错误的地方欢迎指出,希望大家友好交流谢谢你的观看。
|