文章目錄
利用ESP8266製作一個B站粉絲顯示器(牛刀小試)
對於一個剛進入物聯網的小白來說。esp8266無非是很好地入門工具。
本篇博文就是利用ESP8266製作一個B站粉絲顯示器。效果如下:
這裏你不需要跟我一樣用這種開發板,就那種10幾塊錢的小板子加上0.96寸的OLED就可以了。
所需材料:一塊ESP8266開發板+0.96寸OLED+一根USB線+一臺電腦
1.Arduino開發環境搭建
這裏說一下我爲啥用Arduino,因爲esp8266支持SDK開發和AT指令開發。單這兩種開發前者難度較大,後者需要額外的單片機,正好我疫情在家沒有材料,只好買了這個集成了OLED和DHT11的開發板。
Arduino開發環境搭建請參考我上一篇文章:物聯網開發(一)-Arduino開發環境搭建
2.安裝所需庫文件
1.打開文件–>首選項。在附加開發板管理器中添加:http://arduino.esp8266.com/stable/package_esp8266com_index.json
3.打開項目–>加載庫–>管理庫
3.添加esp8266庫
搜索之後安裝,但是在這裏很能安裝不成功,因爲服務器在國之外但是我們可以採用離線下載的方式。
4.下載ESP8266離線安裝包
點擊下載 下載完成之後(這是一個.exe可執行文件)直接點之記安裝即可。安裝完成之後就會出現ESP8266的庫了,選在對應型號的開發板,我們這裏選擇NodeMCU 1.0
。
5.添加OLED顯示相關的庫文件
鏈接:https://pan.baidu.com/s/1NJ0ckIc7lVUnGBFNtScyLw 提取碼:37qq
將文件下載完成之後,將這三個文件解壓之後直接放到下面這個路徑的libraries
文件中。
6.將如下代碼直接複製到你的工程中
/*************************************************************
ESP8266 with 0.96inch OLED 引腳
VCC <---> VCC
GND <---> GND
SDA <---> SDA(2)
SCL <---> SCL(14)
*************************************************************/
#if defined(ESP32) //ESP32
#include <WiFi.h>
#include <HTTPClient.h>
#include <WebServer.h>
#include <ESPmDNS.h>
#elif defined(ESP8266) //ESP8266
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#else
#error "Please check your mode setting,it must be esp8266 or esp32."
#endif
#include <ArduinoJson.h>
#include <U8g2lib.h>
#include <Wire.h>
#include <Ticker.h>
// 定時器
Ticker timer;
int count = 0;
boolean flag = true;
// JSON
DynamicJsonBuffer jsonBuffer(256); // ArduinoJson V5
// 顯示屏 如果引腳不同需要在這裏修改
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ 14, /* data=*/ 2);
// WiFi 名稱與密碼
const char *ssid = "xxxxxxxx"; //這裏填你家中的wifi名
const char *password = "xxxxxxxxxxxx";//這裏填你家中的wifi密碼
//24*24小電視的點陣圖
const unsigned char bilibilitv_24u[] U8X8_PROGMEM = {0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0x30, 0x00, 0x01, 0xe0, 0x80, 0x01,
0x80, 0xc3, 0x00, 0x00, 0xef, 0x00, 0xff, 0xff, 0xff, 0x03, 0x00, 0xc0, 0xf9, 0xff, 0xdf, 0x09, 0x00, 0xd0, 0x09, 0x00, 0xd0, 0x89, 0xc1,
0xd1, 0xe9, 0x81, 0xd3, 0x69, 0x00, 0xd6, 0x09, 0x91, 0xd0, 0x09, 0xdb, 0xd0, 0x09, 0x7e, 0xd0, 0x0d, 0x00, 0xd0, 0x4d, 0x89, 0xdb, 0xfb,
0xff, 0xdf, 0x03, 0x00, 0xc0, 0xff, 0xff, 0xff, 0x78, 0x00, 0x1e, 0x30, 0x00, 0x0c
};
// B 站 API 網址: follower, view, likes
String NAME = "xxxxxxxxxx"; //改成自己的名字
String UID = "xxxxxxxxxxx"; //改成自己的UID
String followerUrl = "http://api.bilibili.com/x/relation/stat?vmid=" + UID; // 粉絲數
String viewAndLikesUrl = "http://api.bilibili.com/x/space/upstat?mid=" + UID; // 播放數、點贊數
long follower = 0; // 粉絲數
long view = 0; // 播放數
long likes = 0; // 獲贊數
void setup()
{
// OLED 初始化
u8g2.begin();
u8g2.enableUTF8Print();
u8g2.clearDisplay();
u8g2.setFont(u8g2_font_wqy12_t_gb2312a);
u8g2.drawXBMP( 16 , 9 , 24 , 24 , bilibilitv_24u );
u8g2.setCursor(45, 19);
u8g2.print("Powered by");
u8g2.setCursor(45, 31);
u8g2.print("@小師弟");
u8g2.setFont(u8g2_font_wqy12_t_gb2312a);
u8g2.setCursor(10, 50);
u8g2.print("www.liuyao-blog.cn");
u8g2.sendBuffer();
delay(5000);
u8g2.setFont(u8g2_font_wqy12_t_gb2312b);
u8g2.setFontPosTop();
u8g2.clearDisplay();
Serial.begin(115200);
// WiFi 連接
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
timer.attach(60, timerCallback); // 每隔1min
// 第一次調用獲取數據函數,方便開機即可顯示
getFollower(followerUrl);
getViewAndLikes(viewAndLikesUrl);
}
void loop()
{
while (flag)
{
if (count == 0)
{
// display data
Serial.println("count = 0, display data");
u8g2.firstPage();
do
{
display(follower, likes, view);
} while (u8g2.nextPage());
flag = false;
} else if (count == 1) {
// get follower
Serial.println("count = 1, get follower");
getFollower(followerUrl);
flag = false;
} else if (count == 2) {
// get view and likes
Serial.println("count = 2, get view and likes");
getViewAndLikes(viewAndLikesUrl);
flag = false;
}
}
}
// 定時器回調函數
void timerCallback()
{
count++;
if (count == 3)
{
count = 0;
}
flag = true;
}
// 獲取 B 站粉絲數
void getFollower(String url)
{
HTTPClient http;
http.begin(url);
int httpCode = http.GET();
Serial.printf("[HTTP] GET... code: %d\n", httpCode);
if (httpCode == 200)
{
Serial.println("Get OK");
String resBuff = http.getString();
// ---------- ArduinoJson V5 ----------
JsonObject &root = jsonBuffer.parseObject(resBuff);
if (!root.success())
{
Serial.println("parseObject() failed");
return;
}
follower = root["data"]["follower"];
Serial.print("Fans: ");
Serial.println(follower);
}
else
{
Serial.printf("[HTTP] GET... failed, error: %d\n", httpCode);
}
http.end();
}
// 獲取 B 站播放數與獲贊數
void getViewAndLikes(String url)
{
HTTPClient http;
http.begin(url);
int httpCode = http.GET();
Serial.printf("[HTTP] GET... code: %d\n", httpCode);
if (httpCode == 200)
{
Serial.println("Get OK");
String resBuff = http.getString();
// ---------- ArduinoJson V5 ----------
JsonObject &root = jsonBuffer.parseObject(resBuff);
if (!root.success())
{
Serial.println("parseObject() failed");
return;
}
likes = root["data"]["likes"];
view = root["data"]["archive"]["view"];
Serial.print("Likes: ");
Serial.println(likes);
Serial.print("View: ");
Serial.println(view);
}
else
{
Serial.printf("[HTTP] GET... failed, error: %d\n", httpCode);
}
http.end();
}
// OLED 顯示數據
void display(long follower, long likes, long view)
{
u8g2.clearDisplay();
u8g2.setCursor(5, 25);
u8g2.print("粉絲數:" + String(follower));
u8g2.setCursor(5, 39);
u8g2.print("獲贊數:" + String(likes));
u8g2.setCursor(5, 52);
u8g2.print("播放數:" + String(view));
u8g2.setCursor(5, 7);
u8g2.print("bilibili@" + String(NAME)); //改成自己的名字
}
需要修改的地方都在程序中註釋了
7.修改完成之後點之記編譯上傳
至此大功告成!!!!!