在程序中修改本身的B站UID和本身家的WiFi名稱及密碼便可。html
/*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(); }
能夠參考筆者的這篇博客:http://www.javashuo.com/article/p-tlfkfuhc-nw.htmljson
將ESP8266與USB-TTL按照下面的接線圖進行鏈接。最好使用下面這種免冷啓動的(那種冷啓動的下載器可能下載不了程序)。api
UTXD—–RXD數組
URXD—–TXD函數
CH_PD—-3.3voop
VCC——-3.3V字體
GND——GNDui
GPIO0—–GNDurl
將鏈接好ESP8266的USB-TTL插在電腦上,對IDE進行以下設置:spa
你能夠上傳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