2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【千円以下】ArduinoでTwitterフォロワーカウンターを作ってモチベ維持【Wemos D1 miniでDIY】

Last updated at Posted at 2023-03-07

前書き

ツイッターの follower counter を作りたかったんだけど、海外のサイトに書いてあるものが古かったのでコピペだと動作しなかった。だから自分で作った 🎏

Screenshot 2023-03-08 at 23.08.39.png

ちなみに、これが 🍁 の twitter

必要なもの

  • Wemos D1 mini
  • arduino のソフト
  • 20x4 LCD
  • 100均とかで入れ物の箱
  • グルーガン(あれば)

設計

導線の設計などは、以下を参考にしました。

コード

twittersubscribecounter.ino
//////////////////////////////////////////////
//                                          //
//   20x4 Subscriber Counter for Twitter    //
//                                          //
/////////////////////////////////////////////

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecureBearSSL.h>

// #include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <ArduinoJson.h>

const char* ssid     = "XXX"; // SSID of local network
const char* password = "XXX"; // Password on network
String BEARER_TOKEN = "XXX";
String TWITTER_CHANNEL_ID = "XXX";   // Twitter id

long subscribers, subscribersBefore = 0;

LiquidCrystal_I2C lcd(0x27, 20, 4);  // Set the LCD I2C address

void setup()
{
  lcd.init();
  lcd.clear();
  lcd.backlight();
  Serial.begin(9600);
  int cursorPosition = 0;

  lcd.setCursor(0, 0);
  lcd.print("Connecting ....");

  createCustomChars();

  // wifi setting
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    lcd.setCursor(cursorPosition, 1);
    lcd.print(".");
    cursorPosition++;
  }

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Connected!");
  Serial.println("Connected!");
  delay(1000);
}

void loop()
{
  int length;
  int subscribers = getSubscribers();
  if (subscribers != subscribersBefore)
  {
    lcd.clear();
    String subscribersString = String(subscribers);
    length = subscribersString.length();
    printSubscribers(length, subscribersString);
    subscribersBefore = subscribers;
  }

  delay(60000);
}

byte LT[8] =
{
  B01111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111
};

byte UB[8] =
{
  B11111,
  B11111,
  B11111,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000
};
byte RT[8] =
{
  B11110,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111
};

byte LL[8] =
{
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B01111
};

byte LB[8] =
{
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B11111,
  B11111,
  B11111
};

byte LR[8] =
{
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11110
};

byte UMB[8] =
{
  B11111,
  B11111,
  B11111,
  B00000,
  B00000,
  B00000,
  B11111,
  B11111
};

byte LMB[8] =
{
  B11111,
  B00000,
  B00000,
  B00000,
  B00000,
  B11111,
  B11111,
  B11111
};

void printSubscribers(int length, String subscribersString)
{
  switch (length)
  {
    case 5: printDigits(subscribersString, 5); printDigits(subscribersString, 4); printDigits(subscribersString, 3); printDigits(subscribersString, 2); printDigits(subscribersString, 1); break;
    case 4: printDigits(subscribersString, 4); printDigits(subscribersString, 3); printDigits(subscribersString, 2); printDigits(subscribersString, 1); break;
    case 3: printDigits(subscribersString, 3); printDigits(subscribersString, 2); printDigits(subscribersString, 1); break;
    case 2: printDigits(subscribersString, 2); printDigits(subscribersString, 1); break;
    case 1: printDigits(subscribersString, 1); break;
    default: break;
  }
}

void printDigits(String subscribersString, int digit)
{
  int length = subscribersString.length();
  char digitToPrint = subscribersString.charAt(length - digit);
  Serial.println(digitToPrint);
  switch (digit)
  {
    case 1: printDigitToScreen(digitToPrint, 17); break;
    case 2: printDigitToScreen(digitToPrint, 13); break;
    case 3: printDigitToScreen(digitToPrint, 9); break;
    case 4: printDigitToScreen(digitToPrint, 5); break;
    case 5: printDigitToScreen(digitToPrint, 1); break;
  }
}

void printDigitToScreen(char digit, int position)
{
  int digitToPrint = digit - '0'; // Convert from char to int
  switch (digitToPrint)
  {
    case 1: digit1(position); break;
    case 2: digit2(position); break;
    case 3: digit3(position); break;
    case 4: digit4(position); break;
    case 5: digit5(position); break;
    case 6: digit6(position); break;
    case 7: digit7(position); break;
    case 8: digit8(position); break;
    case 9: digit9(position); break;
    case 0: digit0(position); break;
  }
}

void digit0(int position_x)
{
  lcd.setCursor(position_x, 1);
  lcd.write((byte)0);
  lcd.write(1);
  lcd.write(2);
  lcd.setCursor(position_x, 2);
  lcd.write(3);
  lcd.write(4);
  lcd.write(5);
}

void digit1(int position_x)
{
  lcd.setCursor(position_x, 1);
  lcd.write(1);
  lcd.write(2);
  lcd.setCursor(position_x + 1, 2);
  lcd.write(5);
}

void digit2(int position_x)
{
  lcd.setCursor(position_x, 1);
  lcd.write(6);
  lcd.write(6);
  lcd.write(2);
  lcd.setCursor(position_x, 2);
  lcd.write(3);
  lcd.write(7);
  lcd.write(7);
}

void digit3(int position_x)
{
  lcd.setCursor(position_x, 1);
  lcd.write(6);
  lcd.write(6);
  lcd.write(2);
  lcd.setCursor(position_x, 2);
  lcd.write(7);
  lcd.write(7);
  lcd.write(5);
}

void digit4(int position_x)
{
  lcd.setCursor(position_x, 1);
  lcd.write(3);
  lcd.write(4);
  lcd.write(2);
  lcd.setCursor(position_x + 2, 2);
  lcd.write(5);
}

void digit5(int position_x)
{
  lcd.setCursor(position_x, 1);
  lcd.write((byte)0);
  lcd.write(6);
  lcd.write(6);
  lcd.setCursor(position_x, 2);
  lcd.write(7);
  lcd.write(7);
  lcd.write(5);
}

void digit6(int position_x)
{
  lcd.setCursor(position_x, 1);
  lcd.write((byte)0);
  lcd.write(6);
  lcd.write(6);
  lcd.setCursor(position_x, 2);
  lcd.write(3);
  lcd.write(7);
  lcd.write(5);
}

void digit7(int position_x)
{
  lcd.setCursor(position_x, 1);
  lcd.write(1);
  lcd.write(1);
  lcd.write(2);
  lcd.setCursor(position_x + 1, 2);
  lcd.write((byte)0);
}

void digit8(int position_x)
{
  lcd.setCursor(position_x, 1);
  lcd.write((byte)0);
  lcd.write((byte)6);
  lcd.write(2);
  lcd.setCursor(position_x, 2);
  lcd.write(3);
  lcd.write(7);
  lcd.write(5);
}

void digit9(int position_x)
{
  lcd.setCursor(position_x, 1);
  lcd.write((byte)0);
  lcd.write((byte)6);
  lcd.write((byte)2);
  lcd.setCursor(position_x + 2, 2);
  lcd.write((byte)5);
}

int getSubscribers()
{
  int subscribers = 0;

  BearSSL::WiFiClientSecure client;
  client.setTimeout(500);
  client.setInsecure();  // If you wouldn't use certificate.

  String host = "api.twitter.com";
  String url = "/2/users/by/username/" + TWITTER_CHANNEL_ID;
  String argument = "user.fields=public_metrics";

  const int httpPort = 443;
  const char* host2 = host.c_str();
  if (!client.connect(host2, httpPort)) {
    Serial.println("connection failed");
    return false;
  }
  client.print(String("GET ") + url + "?" + argument + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Authorization: Bearer " + BEARER_TOKEN + "\r\n" +
               "User-Agent: ESP8266/1.0\r\n" +
               "Accept: text/plain\r\n" +
               "Connection: close\r\n\r\n" +
               "\r\n" +
               "\0");
  client.flush();

  unsigned long timeout = micros();
  while (client.available() == 0) {
    if ( micros() - timeout  > 5000000) {
      Serial.println(">>> Client Timeout !");
      client.stop();
      return false;
    }
  }

  String resultJson = "";
  while (client.available()) {
    resultJson = client.readStringUntil('\r');
  }

  Serial.println("resultJson: " + resultJson);

  DynamicJsonDocument doc(1024);
  DeserializationError err = deserializeJson(doc, resultJson);
  if ( err != DeserializationError::Ok )
  {
    Serial.printf("Deserialization Error:%s\n", err.c_str());
    return false;
  }
  JsonObject obj = doc.as<JsonObject>();

  subscribers = obj["data"]["public_metrics"]["followers_count"];
  Serial.println("subscribers: " + (String)subscribers);

  return subscribers;
}

void createCustomChars()
{
  lcd.createChar(0, LT);
  lcd.createChar(1, UB);
  lcd.createChar(2, RT);
  lcd.createChar(3, LL);
  lcd.createChar(4, LB);
  lcd.createChar(5, LR);
  lcd.createChar(6, UMB);
  lcd.createChar(7, LMB);
}

お疲れ、お兄ちゃん🦄

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?