首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >ESP8266显示B站数据

ESP8266显示B站数据

作者头像
逍遥子大表哥
发布2025-09-03 18:57:56
发布2025-09-03 18:57:56
1530
举报
文章被收录于专栏:kali blogkali blog

基于ESP8266显示B站账号信息。

线路连接:

  • SDA-D6
  • SCL-D5

显示效果:

接口说明:

源码如下:

代码语言:javascript
复制
/*
  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);
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-09-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 kali笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档