说明

ESP32 支持 2.4G 网络,那我们可以通过发送 HTTP 请求来获取实时天气数据。一般来说,天气数据是由一些公共 API 接口提供的,这些接口需要向它们发送 HTTP 请求以获取数据。

程序设计

想要发送 HTTP 请求,我们就需要用到 HTTPClient 库。

HTTPClient 库是一个用于 Arduino 的 HTTP 客户端库,它提供了一组函数来轻松地发送 HTTP 请求并处理服务器响应。HTTPClient 库基于 ESP-IDF 的 HTTP 客户端实现,并在Arduino框架下进行了封装,使其易于使用。

以下是 HTTPClient 库的一些常用功能和函数:

  1. HTTPClient http;:创建 HTTPClient 对象。
  2. http.begin(url):指定要发送请求的 URL。
  3. http.addHeader(name, value):添加 HTTP 头部。
  4. http.setAuthorization(username, password):设置 HTTP 基本身份验证的用户名和密码。
  5. http.setTimeout(timeout):设置请求超时时间(以毫秒为单位)。
  6. http.GET():发送 GET 请求,并返回一个 HTTP 状态码。
  7. http.POST(payload):发送 POST 请求,并将 payload 作为请求正文。
  8. http.responseStatusCode():获取响应的状态码。
  9. http.responseHeaders():获取响应的头部。
  10. http.responseBody():获取响应的正文。
  11. http.getString():获取响应正文作为字符串。
  12. http.getStream():获取响应正文作为流对象。
  13. 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)
{
}

参考

发表评论