YouTube Subscriber Counter With ESP8266

14,361

117

49

About: Making and sharing are my two biggest passions! In total I've published hundreds of tutorials about everything from microcontrollers to knitting. I'm a New York City motorcyclist and unrepentant dog mom. My ...

I was inspired by the Play Button awards YouTube sends out for subscriber milestones, and built this circuit to display my realtime subscriber count using an ESP8266 wifi board and seven segment display. I built this one to celebrate surpassing 10k subscribers, so this is an upgrade to my previous counter, which only supports counts up to 9999. Personalize the code to work with your channel! For tracking other social media stats, check out my multi social tracker project.

Before attempting this project, you should be generally familiar with uploading new programs to your Arduino board and installing code libraries, both of which you can learn for free in my Arduino Class, though you really don't have to understand any of the actual Arduino code to get this project running.

For a more in-depth introduction to the ESP8266 board (and its installation and setup), check out my free Internet of Things Class.

For this project, you will need the following materials:

and the following tools:

Required software libraries:

Unique data required:

As an alternative to the NodeMCU board, you can also use your favorite ESP8266 microcontroller board, some of which require a 3V FTDI programmer to upload new programs.

Before you dive into this project, you should first make sure you've got your Arduino software set up properly to program the board you are using, which in my case involves installing the SiLabs USB driver and installing ESP8266 board support (explained in more detail in my Internet of Things Class):

  • Go to Arduino-> Preferences...
  • Look for a text field labeled "Additional Boards Manager URLs:" and paste the following URL into the field (separate multiple URLs with commas if applicable):
    <a href="http://arduino.esp8266.com/stable/package_esp8266com_index.json">http://arduino.esp8266.com/stable/package_esp8266c...</a>
  • Click OK
  • Go to Tools->Board-> Boards Manager...
  • Search for ESP8266 and click the Install button in the box "esp8266 by ESP8266 Community" when it shows up

To ensure you have a proper programming connection with your board, first load up the blink sketch. You can find a sample blink sketch by navigating to File->Examples->ESP8266->Blink, or copy it from here:

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(500);
  digitalWrite(LED_BUILTIN, LOW);
  delay(500);
}

Plug in your USB cable to the board and configure your settings under the Tools menu as follows:

  • Board: NodeMCU 1.0
  • CPU Frequency: 80MHz
  • Flash Size: 4M (3M SPIFFS)
  • Upload Speed: 115200
  • Port: whichever one ends in SLAB_USBtoUART (Mac) or COMx (Windows)

Click the Upload button to send the program to your board. This will take several seconds (longer than you are used to with Arduino Uno). After complete, the onboard LED should start blinking.

While many boards auto-detect when they're being sent a new program, some other ESP8266 boards may require a sequence of button presses to get into bootloader mode.

Do not proceed until you've successfully uploaded a blink test program to your board. Seriously, because how can you expect the project code to upload if the test didn't? =D

Step 1: Prepare Displays & Prototype

Follow the assembly instructions for your seven-segment displays, and also solder headers onto your ESP8266 board if it didn't come with headers pre-soldered.

For your microcontroller to tell the two displays apart, you'll need to change the address on one of them. Do this by applying a blob of solder to bridge the labeled pads on the back of the board. The board as-is has an address of 0x70, and the one with A0 bridged has an address of 0x71. More info on i2c addresses in the official product guide. I put the plain display on the right (lower digits), but you can easily switch it in the code if you accidentally install them differently.

When working with electronics, I always like to create a solderless prototype first.

I'm using a NodeMCU board this time, but any ESP8266 board with the I2C pins exposed will work fine. In my case that's D1 and D2.

Connections:

NodeMCU D1 to displays C (clock)

NodeMCU D2 to displays D (data)

NodeMCU Vin to displays + (power)

NodeMCU GND to displays - (ground)

Step 2: Customize Code & Program Board

Remember, you need ESP8266 board support and the following Arduino libraries to compile and upload the code for this project. Easily search and install each one using the Library Manager by navigating to Sketch->Include Library->Manage Libraries... or download from Github and install the old fashioned way:

Download the code attached to this step and open the file "YouTubeSubscriberCounter_v2.ino" in the Arduino IDE. Customize the variables (shown highlighted in teal in the Arduino screenshot above):

Upload the customized code to your board.

If you prefer, I've also created a version that uses WiFiManager, which adds configurability without the need to reprogram the microcontroller. Download the file "YouTubeSubscriberCounter_v2_wifiManager.ino" attached to this step and open it with your Arduino software, and make sure you also have WiFiManger library installed as well. Use Brian Lough's awesome guide to get it all set up.

Step 3: Solder Final Circuit

I put together the final circuit using a perma-proto, but because my frame is only 5" by 7", a full size one wouldn't fit-- I should have gotten a bigger size. I managed to put everything on the half size board but I wouldn't recommend you follow this layout exactly, since I sorta hacked away some of the pins on the NodeMCU and cut some traces to others on the back of the board.

I made a second display for the rest of my social trackers, and positioned things a bit differently, which I think worked out a little better (last photo).

Step 4: Print Paper Template

Download the paper template attached to this step and print it out (designed for 8.5x11" paper, and my shadow box capacity is 5x7"). Cut along the lines to separate the two pieces. The graphic goes right behind the glass, and the other section helps with display placement/alignment.

Step 5: Put It All Together

Clean the inside of your glass to be sure its free of dust and other contaminates (ahem cat hair). Glass is sharp, so be careful handling it.

Place the graphic template face down against the glass, then stack the shadow box separator inside.

Cut away a notch in the backing board to accommodate for the USB cable, and slot the back in place. Plug in and enjoy! Of if you're like me, disassemble several more times to get the notch just right, the dust out of the glass (again), and install a small folded piece of cardboard inside to to help the seven-segment display press flush against the paper/glass (otherwise the numbers are blurry).

Step 6: Enjoy!

Display your custom Play Button with pride!

I'd be delighted to see your version of this project in the comments. Let me know if you have any questions as well. Thanks for reading!

If you like this project, you may be interested in some of my others:

To keep up with what I'm working on, follow me on YouTube, Instagram, Twitter, Pinterest, and Snapchat.

Share

Recommendations

  • Toys Contest

    Toys Contest
  • Cardboard Challenge

    Cardboard Challenge
  • Epilog X Contest

    Epilog X Contest

49 Discussions

0
None
ChrisH838

4 days ago

Hey, I am trying to build this. I have installed all the relevant libraries but I am getting the below errors:

C:\Users\chris\Documents\Arduino\libraries\YoutubeApi\src\YoutubeApi.cpp: In member function 'bool YoutubeApi::getChannelStatistics(String)':
C:\Users\chris\Documents\Arduino\libraries\YoutubeApi\src\YoutubeApi.cpp:95:2: error: 'DynamicJsonBuffer' was not declared in this scope
DynamicJsonBuffer jsonBuffer;
^
C:\Users\chris\Documents\Arduino\libraries\YoutubeApi\src\YoutubeApi.cpp:95:20: error: expected ';' before 'jsonBuffer'
DynamicJsonBuffer jsonBuffer;
^
C:\Users\chris\Documents\Arduino\libraries\YoutubeApi\src\YoutubeApi.cpp:96:21: error: 'jsonBuffer' was not declared in this scope
JsonObject& root = jsonBuffer.parseObject(response);
^
C:\Users\chris\Documents\Arduino\libraries\YoutubeApi\src\YoutubeApi.cpp:97:10: error: 'ArduinoJson::JsonObject' has no member named 'success'
if(root.success()) {
^
exit status 1
Error compiling for board NodeMCU 1.0 (ESP-12E Module).

0
None
VictorN69

Question 17 days ago

YouTube Counter v2. I am having issues with nothing happening on the LED. I am sure the coding is correct along with the wires but nothing is happening. How do I check to make sure things are correct? Could it just be my youtube API?

// YouTube Subscriber Counter v2
// by Becky Stern 2018
// Displays your current subscriber count on a seven-segment display
// This version uses two four digit displays to support more than 10k subs
// based on library sample code by:
// Giacarlo Bacchio (Gianbacchio on github)
// Brian Lough (witnessmenow on github)
// Adafruit (adafruit on github)
// requires the following libraries, search in Library Manager or download from github:
#include <Wire.h> // installed by default
#include <Adafruit_GFX.h> // https://github.com/adafruit/Adafruit-GFX-Library
#include <Adafruit_LEDBackpack.h> // https://github.com/adafruit/Adafruit_LED_Backpack
#include <YoutubeApi.h> // https://github.com/witnessmenow/arduino-youtube-api
#include <ArduinoJson.h> // https://github.com/bblanchon/ArduinoJson
// these libraries are included with ESP8266 support
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h> // https://github.com/tzapu/WiFiManager
char ssid[] = "ATTaz55Gs2"; // your network SSID (name)
char password[] = "mywifipassword"; // your network key
//------- enter your API key and channel ID here! ------
#define API_KEY "youtube google API key" // your google apps API Token
#define CHANNEL_ID "UCNhmy9YYBNdCVe3tcM8qsHQ" // makes up the url of channel
// label the displays with their i2c addresses
struct {
uint8_t addr; // I2C address
Adafruit_7segment seg7; // 7segment object
} disp[] = {
{ 0x71, Adafruit_7segment() }, // High digits
{ 0x70, Adafruit_7segment() } // Low digits
};
int subscriberCount; // create a variable to store the subscriber count
WiFiClientSecure client;
YoutubeApi api(API_KEY, client);
unsigned long api_mtbs = 1000; //mean time between api requests
unsigned long api_lasttime; //last time api request has been done
void setup() {
Serial.begin(115200);
for(uint8_t i=0; i<2; i++) { // Initialize displays
disp[i].seg7.begin(disp[i].addr);
disp[i].seg7.clear();
disp[i].seg7.writeDisplay();
}
WiFiManager wifiManager;
wifiManager.autoConnect ("Blackjack");
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
IPAddress ip = WiFi.localIP();
Serial.println(ip);
}
void loop() {
if (millis() > api_lasttime + api_mtbs) {
if(api.getChannelStatistics(CHANNEL_ID))
{
Serial.println("---------Stats---------");
Serial.print("Subscriber Count: ");
Serial.println(api.channelStats.subscriberCount);
Serial.print("View Count: ");
Serial.println(api.channelStats.viewCount);
Serial.print("Comment Count: ");
Serial.println(api.channelStats.commentCount);
Serial.print("Video Count: ");
Serial.println(api.channelStats.videoCount);
// Probably not needed :)
//Serial.print("hiddenSubscriberCount: ");
//Serial.println(api.channelStats.hiddenSubscriberCount);
Serial.println("------------------------");
subscriberCount = api.channelStats.subscriberCount;
uint16_t hi = subscriberCount / 10000, // Value on left (high digits) display
lo = subscriberCount % 10000; // Value on right (low digits) display
disp[0].seg7.print(hi, DEC); // Write values to each display...
disp[1].seg7.print(lo, DEC);
// print() does not zero-pad the displays; this may produce a gap
// between the high and low sections. Here we add zeros where needed...
if(hi) {
if(lo < 1000) {
disp[1].seg7.writeDigitNum(0, 0);
if(lo < 100) {
disp[1].seg7.writeDigitNum(1, 0);
if(lo < 10) {
disp[1].seg7.writeDigitNum(3, 0);
}
}
}
} else {
disp[0].seg7.clear(); // Clear 'hi' display
}
disp[0].seg7.writeDisplay(); // Push data to displays
disp[1].seg7.writeDisplay();
}
api_lasttime = millis();
}
}

0
None
Fubar1342

Question 25 days ago

I have been working on recreating your counter for youtube only. I've run into several issues that I have figured out doing research. However, I am now stuck with 3 errors that seem to be connected and cannot find any answers. Please see the errors below. This is your code with WifiManager.
"""
src\main.cpp: In function 'void setup()':
src\main.cpp:68:14: error: 'loadConfig' was not declared in this scope
loadConfig();
^
src\main.cpp:86:16: error: 'saveConfig' was not declared in this scope
saveConfig();
^
src\main.cpp:96:21: error: 'forceConfigMode' was not declared in this scope
forceConfigMode();
^
"""

I am unable to find these methods used in the library files. I'm at a loss. Any and all help is welcome.

ps. Love the content here and on YouTube. Keep it up.

3 answers
0
None
Fubar1342 bekathwia

Reply 22 days ago

I've double checked and it is installed and included in the script. In the Arduino IDE, it compiles and I get the errors through the serial monitor. In Vscode, it errors out before it's compiled. Could this be a version issue? I'm using the latest version of the WiFiManager library. I'll keep digging in the mean time. Still have yet to find the callouts for the mentioned methods. Thank you.

0
None
Fubar1342 Fubar1342

Reply 19 days ago

These are the 3 errors. I haven't messed with any of the code other than what was required.

YouTubeSub.PNG
0
None
RomanE11

Question 5 weeks ago

Does your InstagramStats work at the moment? Whatever i try my Follower Response is everytime 0.

2 answers
0
None
bekathwiaRomanE11

Answer 5 weeks ago

I didn't see the service go down yesterday, when your comment was posted, but occasionally it does. It's never down for more than a couple hours-- looks good to me now so keep trying!

0
None
RomanE11bekathwia

Reply 4 weeks ago

Still have troubles :-D I have tried several Codes incl. them of you other Tutorial, and one of Sinan how have done the same in between i only trying with the Insta Library because it is the easiest one of this Social-Media Library of witnessmenow.

I have tried several ESP
Different Codes incl. the Examples
Different Internet Connections
Different Instagram- Accounts
No errors durring Compiling and Upload...
The 7-Segment Display are working everything else is working..

Everytime i get the Answer in the Serial Monitor 0 Followers

Any Ideas what i could do next?

Do you know which versions of library you have used?


0
None
JeffW166

Question 7 weeks ago on Introduction

I'm having trouble compiling code given. I get several error messages that appear to be referring to files that are part of the esp8266 tools:

c:\users\jeff\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\bits\unique_ptr.h:457:27: error: macro "swap" requires 2 arguments, but only 1 given

swap(unique_ptr& __u) noexcept

Any ideas what could be going on?

2 answers
0
None
bekathwiaJeffW166

Answer 7 weeks ago

Hm, do you have the correct board selected under the Tools menu? What's the version of your Arduino IDE and ESP8266 boards package? Compiles for me on Arduino 1.8.5 and ESP8266 tools 2.4.0, but those aren't the latest versions so something could potentially have changed.

0
None
JeffW166bekathwia

Reply 7 weeks ago

Thanks for responding. I do have an older Arduino IDE so maybe that's the issue. It's strange but the code with the WiFi manager compiles and uploads ok.

0
None
A83878226

3 months ago

Hello, I come from China. Your works have been sold in China, not you, but others. Do you agree to sell? The price is very expensive

1 reply
0
None
JamesP282

5 months ago

Hi all, please can someone help me I'm getting the display repeated on both LEDS. I am unsure which section of the code to amend. I have bridged one of the LEDS as instructed. Thank you very much.

0
None
DJTMGaming

Question 10 months ago

Is it possible to have multiple wifi networks that the board can connect to?
I'm here from V1

hopefully you can help me :p

1 answer
0
None
bekathwiaDJTMGaming

Answer 10 months ago

I have provided a version of the sketch with configurable wifi with the WiFiManager library, check it out in the code step! It lets you set up and change the wifi network by logging onto the device itself.

0
None
blubflubify

11 months ago

I am super lost on how to get the API to work, Is there anyone who can help?

1 reply