基于ESP8266显示B站账号信息。
线路连接:
SDA-D6SCL-D5显示效果:

接口说明:

源码如下:
/*
Bilibili数据显示
基于esp8266+OLED
接线: SCL=D6, SDA=D5
*/
#include <Arduino.h>
#include <U8g2lib.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecureBearSSL.h>
#include <ArduinoJson.h>
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
// 保持你的OLED配置(软件I2C)
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ D6, /* data=*/ D5, /* reset=*/ U8X8_PIN_NONE);
// WiFi配置
const char* WIFI_SSID = "Xiaoyaozi";
const char* WIFI_PASSWORD = "zhanglu742206@@";
// Bilibili API
const char* API_URL = "https://api.bilibili.com/x/relation/stat?vmid=430579369";
// 数据更新间隔(60秒)
const unsigned long UPDATE_INTERVAL = 60000;
unsigned long lastUpdateTime = 0;
// 存储粉丝数
int followerCount = -1;
String statusMessage = "初始化中...";
// 连接WiFi
void connectWiFi() {
statusMessage = "连接WiFi...";
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
unsigned long start = millis();
while (WiFi.status() != WL_CONNECTED && millis() - start < 15000) {
delay(500);
}
if (WiFi.status() == WL_CONNECTED) {
statusMessage = "WiFi已连接";
} else {
statusMessage = "WiFi连接失败";
}
}
// 获取粉丝数
void fetchBilibiliData() {
if (WiFi.status() != WL_CONNECTED) {
statusMessage = "请检查WiFi";
return;
}
statusMessage = "获取数据中...";
// 创建SSL客户端
std::unique_ptr<BearSSL::WiFiClientSecure> client(new BearSSL::WiFiClientSecure());
client->setInsecure(); // 忽略证书验证(仅用于测试)
HTTPClient http;
if (!http.begin(*client, API_URL)) {
statusMessage = "HTTP初始化失败";
return;
}
int httpCode = http.GET();
if (httpCode != HTTP_CODE_OK) {
statusMessage = "请求失败: " + String(httpCode);
http.end();
return;
}
// 解析JSON响应
String payload = http.getString();
http.end();
StaticJsonDocument<512> doc;
DeserializationError error = deserializeJson(doc, payload);
if (error) {
statusMessage = "解析失败";
return;
}
// 提取粉丝数
followerCount = doc["data"]["follower"].as<int>();
if (followerCount > 0) {
statusMessage = "数据已更新";
} else {
statusMessage = "获取数据无效";
}
}
// 显示数据到OLED
void displayData() {
u8g2.clearBuffer();
// 设置中文字体(使用支持中文的字体)
u8g2.setFont(u8g2_font_wqy12_t_gb2312); // 使用更兼容的中文字体
// 显示标题 - 使用UTF8字符串
u8g2.setCursor(0, 15);
u8g2.print("逍遥子大表哥");
// 显示粉丝数
u8g2.setCursor(0, 35);
if (followerCount >= 0) {
u8g2.print("粉丝量:");
u8g2.print(followerCount);
} else {
u8g2.print("未获取到数据");
}
// 显示状态信息 - 使用较小的字体
u8g2.setFont(u8g2_font_5x7_tr); // 使用更小的英文字体
u8g2.setCursor(0, 55);
u8g2.print(statusMessage);
u8g2.sendBuffer();
}
void setup(void) {
Serial.begin(115200);
u8g2.begin();
u8g2.enableUTF8Print(); // 启用UTF8打印(支持中文)
// 初始显示
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_wqy12_t_gb2312);
u8g2.setCursor(20, 32);
u8g2.print("启动中...");
u8g2.sendBuffer();
// 连接WiFi
connectWiFi();
// 首次获取数据
fetchBilibiliData();
lastUpdateTime = millis();
}
void loop(void) {
// 定时更新数据
if (millis() - lastUpdateTime >= UPDATE_INTERVAL) {
fetchBilibiliData();
lastUpdateTime = millis();
}
// 刷新显示
displayData();
delay(1000);
}