ESP8266 ESP-01製作B站粉絲計數器 | Arduino IDE開發ESP8266 | ESP8266儲存讀取使用者資料

蔡子CaiZi發表於2020-11-28

1.實物圖

2.元件清單

 

 

 

 

3.原理圖

 

4.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();
}

5.燒錄程式

 

將ESP8266與USB-TTL按照下面的接線圖進行連線。最好使用下面這種免冷啟動的(那種冷啟動的下載器可能下載不了程式)

 

 

 

 

esp8266-01板的arduino燒寫方式分享

  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

相關文章