说明
ESP32 支持 2.4G 网络,那我们可以通过发送 HTTP 请求来获取实时天气数据。一般来说,天气数据是由一些公共 API 接口提供的,这些接口需要向它们发送 HTTP 请求以获取数据。
程序设计
想要发送 HTTP 请求,我们就需要用到 HTTPClient 库。
HTTPClient
库是一个用于 Arduino 的 HTTP 客户端库,它提供了一组函数来轻松地发送 HTTP 请求并处理服务器响应。HTTPClient
库基于 ESP-IDF 的 HTTP 客户端实现,并在Arduino框架下进行了封装,使其易于使用。
以下是 HTTPClient
库的一些常用功能和函数:
HTTPClient http;
:创建 HTTPClient 对象。http.begin(url)
:指定要发送请求的 URL。http.addHeader(name, value)
:添加 HTTP 头部。http.setAuthorization(username, password)
:设置 HTTP 基本身份验证的用户名和密码。http.setTimeout(timeout)
:设置请求超时时间(以毫秒为单位)。http.GET()
:发送 GET 请求,并返回一个 HTTP 状态码。http.POST(payload)
:发送 POST 请求,并将 payload 作为请求正文。http.responseStatusCode()
:获取响应的状态码。http.responseHeaders()
:获取响应的头部。http.responseBody()
:获取响应的正文。http.getString()
:获取响应正文作为字符串。http.getStream()
:获取响应正文作为流对象。http.end()
:关闭连接并释放资源。
我们从 Web 服务获取的是 JSON 数据,要想解析 JSON 数据,可以使用 Arduino 的 ArduinoJSON
库。ArduinoJSON
库使您能够解析和生成 JSON 数据,以及在 Arduino 上处理 JSON 格式的数据。
bilibili 粉丝数的api接口:https://api.bilibili.com/x/relation/stat?vmid=你自己的vmid&web_location=333.1387
#include <Arduino.h>
#include <U8g2lib.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
// 构造对象
U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/18, /* data=*/13,
/* cs=*/4, /* dc=*/2, /* reset=*/15);
// 定义 Wi-Fi 名与密码
const char *ssid = "Xiaomi_2644";
const char *password = "ccl76102121";
// b站粉丝数api
String url = "https://api.bilibili.com/x/relation/stat?vmid=3546569687173354";
void setup(void)
{
Serial.begin(9600);
// 初始化 oled 对象
u8g2.begin();
// 开启中文字符集支持
u8g2.enableUTF8Print();
// 设置字体
u8g2.setFont(u8g2_font_unifont_t_chinese3);
// 设置字体方向
u8g2.setFontDirection(0);
// 连接 WiFi
WiFi.begin(ssid, password);
// 检测是否连接成功
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
u8g2.clearBuffer();
u8g2.setCursor(0, 15);
u8g2.print("WIFI CONNECTED!");
u8g2.setCursor(0, 30);
u8g2.print(WiFi.localIP());
u8g2.sendBuffer();
delay(1000);
u8g2.clearBuffer();
u8g2.setCursor(0, 15);
u8g2.print("请求数据中");
u8g2.setCursor(0, 30);
u8g2.print("...");
u8g2.sendBuffer();
// 创建 HTTPClient 对象
HTTPClient http;
// 发送GET请求
http.begin(url);
int httpCode = http.GET();
// 获取响应正文
String response = http.getString();
Serial.println("响应数据");
Serial.println(response);
http.end();
u8g2.clearBuffer();
u8g2.setCursor(0, 15);
u8g2.print("解析数据中");
u8g2.setCursor(0, 30);
u8g2.print("...");
u8g2.sendBuffer();
// 创建 DynamicJsonDocument 对象
DynamicJsonDocument doc(1024);
// 解析 JSON 数据
deserializeJson(doc, response);
// 从解析后的 JSON 文档中获取值
String fens = doc["data"]["follower"].as<String>();
u8g2.clearBuffer();
u8g2.setCursor(0, 15);
u8g2.print("b站 fens: ");
u8g2.setCursor(0, 30);
u8g2.print(fens + "人");
u8g2.setCursor(0, 45);
u8g2.print("Come on!!!");
u8g2.sendBuffer();
}
void loop(void)
{
}