1.實物圖
2.原理圖
3.Arduino程式
在程式中修改自己的B站UID和自己家的WiFi名稱及密碼即可。
/*B站粉絲計數器*/ /************************************************************* ESP8266 with 0.96寸 OLED 引腳 VCC <---> VCC GND <---> GND SDA <---> SDA(D4 2) SCL <---> SCL(D5 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> #include <EEPROM.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); //NODEMCU U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ 2, /* data=*/ 0); //ESP-01 // WiFi 名稱與密碼 const char *ssid = "xxxxxx"; //這裡填你家中的wifi名稱 const char *password = "xxxxxx";//這裡填你家中的wifi密碼 // B 站 API 網址 String NAME = "CaiZi"; //改成自己的名字 String UID = "349576976"; //改成自己的UID String followerUrl = "http://api.bilibili.com/x/relation/stat?vmid=" + UID; // 粉絲數 String viewAndLikesUrl = "http://api.bilibili.com/x/space/upstat?mid=" + UID; // 播放數、點贊數 int follower = 0; // 粉絲數 int view = 0; // 播放數 int likes = 0; // 獲贊數 union long_value //聯合體 { int follower; byte fans[2]; }; long_value followerE;//宣告聯合體 byte fan1; byte fan2; void setup() { // OLED初始化 u8g2.begin(); u8g2.enableUTF8Print(); u8g2.clearDisplay(); // EEPROM初始化 EEPROM.begin(512);//開闢512位元組的空間 fan1 = EEPROM.read(0); fan2 = EEPROM.read(1); followerE.fans[0] = fan1;//賦值給陣列 followerE.fans[1] = fan2; follower = followerE.follower; // 顯示上次開機的粉絲數 u8g2.setFontPosTop(); u8g2.firstPage(); do { displayNum(); } while (u8g2.nextPage()); 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(600, timerCallback); // 每隔10min } void loop() { while (flag) { u8g2.firstPage(); do { displayNum(); } while (u8g2.nextPage()); // 獲取粉絲數 getFollower(followerUrl); // 獲取播放數和點贊數 getViewAndLikes(viewAndLikesUrl); flag = false; } } // OLED 顯示資料 void displayNum() { // u8g2.clearDisplay(); u8g2.setFont(u8g2_font_osb41_tn);//設定41*41字型 u8g2.setCursor(0, 8); u8g2.print(String(follower)); // u8g2.setFont(u8g2_font_wqy12_t_gb2312b);//設定12*12字型 // u8g2.setCursor(0, 0); // u8g2.print(" Bilibili " + String(NAME)); //改成自己的名字 // u8g2.setCursor(0, 38); // u8g2.print("獲贊數:" + String(likes)); // u8g2.setCursor(0, 52); // u8g2.print("播放數:" + String(view)); } // 定時器回撥函式 void timerCallback() { 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("獲取粉絲數成功!"); String resBuff = http.getString(); // Serial.println(resBuff); // ---------- ArduinoJson V5 ---------- JsonObject &root = jsonBuffer.parseObject(resBuff); if (!root.success()) { Serial.println("parseObject() failed"); return; } follower = root["data"]["follower"]; followerE.follower = follower; EEPROM.write(0, followerE.fans[0]); //EEPROM.write(位置,資料) EEPROM.write(1, followerE.fans[1]); //分成兩位元組儲存 EEPROM.commit(); //commit Serial.print("粉絲數: "); 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("獲取播放數、點贊數成功!"); String resBuff = http.getString(); // Serial.println(resBuff); JsonObject &root = jsonBuffer.parseObject(resBuff); if (!root.success()) { Serial.println("parseObject() failed"); return; } view = root["data"]["archive"]["view"]; likes = root["data"]["likes"]; Serial.print("點贊數: "); Serial.println(likes); Serial.print("播放數: "); Serial.println(view); } else { Serial.printf("[HTTP] GET... failed, error: %d\n", httpCode); } http.end(); }
4.燒錄程式
可以參考筆者的這篇部落格:https://www.cnblogs.com/cai-zi/p/13942615.html
將ESP8266與USB-TTL按照下面的接線圖進行連線。最好使用下面這種免冷啟動的(那種冷啟動的下載器可能下載不了程式)。
UTXD—–RXD
URXD—–TXD
CH_PD—-3.3v
VCC——-3.3V
GND——GND
GPIO0—–GND
將連線好ESP8266的USB-TTL插在電腦上,對IDE進行如下設定:
你可以上傳ESP8266WIFI的相關程式了。
注意事項
1.esp8266-01板對電壓的要求很高,燒寫時電源一定要採用3.3V左右。
2.如果程式碼無法上傳,並顯示警告,請檢查USB-TTL是否良好(某些USB-TTL燒寫時無法開啟串列埠,導致上傳失敗)。
3.ESP8266與USB-TTL需要RX,TX交叉連線。
4.CH_PD這個引腳無論是燒程式也好,燒完程式應用也好,都要接3.3V。
5.GPIO0這個引腳在燒程式的時候必須接GND(接低電平),燒完程式後想要進行應用的話,必須將這個引腳拉高或者懸空。
參考:https://zhuanlan.zhihu.com/p/136243798