В этом уроке с помощью Ардуино мы соберем гаджет, который будет показывать текущее количество подписчиков и просмотров на Youtube канале.
Стоимость такого гаджета или устройства составит небольшую сумму, примерно, в 10 долларов США. Кроме того, что устройство показывает число подписчиков и просмотров, оно еще оповещает владельца о новых подписчиках, звуком и светом.
Шаг 1. Детали и комплектующие
Для этого проекта нам нужен набор комплектующих, которые мы условно разделим на два блока - электронные компоненты и инструменты для деревообработки.
Электронные компоненты включают в себя:
- Печатная плата
- NodeMCU
- Модуль понижающего напряжения 220 В переменного тока до 5 В постоянного тока
- Шилд зуммера или зуммер и резистор 100 Ом
- SPDT переключатель
- 4 x TM1637 4-битных цифровых 7-сегментных дисплея
- Пара цветных светодиодов и резисторов 220 Ом
- Несколько соединительных кабелей
- USB-кабель для загрузки кода
- паяльное оборудование
Для рабочего с деревом нам понадобятся:
- Доска или дерево от палетт
- Карандаш
- Линейка
- Ручная пила
- Молоток
- Гвозди
- Шлифовальный инструмент
- и средства индивидуальной защиты
Корпус можно делать из дерева для поддонов или паллет, но также можно сделать корпус из картона или пластикового контейнера, а потом покрасить ее, чтобы она выглядела классно.
Шаг 2. План проекта
План состоит в том, чтобы сделать корпус размером 24 х 10 см, чтобы в неё поместить схемы и детали.
Когда устройство включено, оно сначала подключится к указанной сети Wi-Fi, используя пару SSID и пароль, указанную в коде. После установления соединения в коде используется комбинация «ключа API Google» (коснемся этого на следующем шаге) и вашего «идентификатора каналов YouTube» для получения данных с сервера YouTube. Затем устройство отображает просмотры и количество подписчиков, используя 7-сегментный дисплей.
После отображения информации он ждет 5 минут, прежде чем получить следующий набор информации с сервера YouTube. Переменная используется для хранения текущего количества подписчиков. Если количество новых подписчиков больше старого, включается зуммер, а синие и белые светодиоды попеременно мигают (светятся).
Шаг 3. Схема соединения
Схема соединения очень простая.
Начнем с подключения 7-сегментных дисплеев к микроконтроллеру. Каждый из этих дисплеев имеет 4 контакта, 2 для питания и один для часов, а другой для данных. Подключите контакты данных и синхронизации к NodeMCU в соответствии с рисунком выше.
Дисплей #1
D3 -> CLK
D2 -> DIO
Дисплей #2
D1 -> CLL
D0 -> DIO
Дисплей #3
D5 -> CLK
D4 -> DIO
Дисплей #4
D6 -> CLK
D7 -> DIO
Buzzer (зуммер) -> D8
Blue LED (синий светодиод) -> D9
White LED (белый светодиод) -> D10
Затем мы подключим все выводы VCC дисплеев к выводу 3,3 В NodeMCU. Затем подключим шилд зуммера (или зуммер с резистором 100 Ом) к контакту D8. После этого подключим синий и белый светодиоды к контактам D9 и D10 с резистором ограничения тока 220 Ом соответственно.
Далее соединим все контакты заземления с выводом GND NodeMCU. Как только все контакты подключены, подключите коммутатор к VIN NodeMCU и GND к GND понижающего преобразователя.
Шаг 4. Используемые библиотеки
Пользователь канала и идентификаторы канала ID перечислены в разделе "Информация об аккаунте" (Account information).
Войдите в свой аккаунт YouTube. В правом верхнем углу нажмите значок вашей учетной записи > "Настройки" (Settings). На левой панели нажмите «Расширенные настройки» (Advanced settings).
Вот список библиотек, которые нам нужны для этого проекта:
- TM1637 LED Driver: https://github.com/avishorp/TM1637
- ESP8266WiFi: https://github.com/esp8266/Arduino/tree/master/li...
- Arduino Json: https://github.com/bblanchon/ArduinoJson
- Arduino YouTube API: https://github.com/witnessmenow/arduino-youtube-a...
Вы можете скачать их все с GitHub, ссылки выше. После скачивания распакуйте и переименуйте библиотеки, удалив из названия любые специальные символы и «master». Поместите папку в раздел библиотек вашего Arduino. Вам может понадобиться создать папку Libraries (Библиотеки), если это ваша первая библиотека. Перезапустите среду Arduino IDE, чтобы она правильно загрузила файл KEYWORD, примеры и добавила библиотеку в меню библиотеки.
Уникальные идентификаторы:
- WiFi SSID/password (пароль)
- ID канала YouTube: https://support.google.com/youtube/answer/3250431...
- Google API Key: https://cloud.google.com/docs/authentication/api-...
Помимо библиотек вам также понадобится несколько уникальных идентификаторов для этого проекта.
Первый - это SSID и пароль вашей беспроводной сети. Затем вам нужен уникальный идентификатор ID канала YouTube. Чтобы получить его нужно сделать следующее:
- Войдите в свой аккаунт YouTube.
- В правом верхнем углу нажмите значок вашей учетной записи> Настройки.
- На левой панели нажмите «Расширенные настройки».
- Пользователь канала и идентификаторы канала перечислены в разделе «Информация об аккаунте».
И, наконец, вам нужно сгенерировать «Ключ API Google» для своего канала. Чтобы сгенерировать ключ:
- Наберите в Google «Использование API-ключей» или откройте ссылку, приведенную выше.
- Прокрутите вниз и нажмите «API & Services → Credentials»
- Если вы заходите на эту страницу впервые, вам нужно будет создать новый проект, нажав кнопку «Создать».
- Примите условия и дайте вашему проекту имя, а затем нажмите кнопку «Создать», чтобы создать проект.
- После того, как проект создан, вам просто нужно нажать на раскрывающийся список «Создать учетные данные» и выбрать «Ключ API» оттуда
- Система потратит время на генерацию ключа. После создания он покажет вам ключ во всплывающем диалоге.
- Скопируйте и сохраните его в своей электронной почте.
- Теперь нажмите на кнопку «Библиотека» на левой панели
- Прокрутите вниз и включите «API данных YouTube v3» и «API отчетности YouTube», нажав на них и нажав кнопку «Включить»
- Подождите 5-10 минут, после чего вы сможете использовать API-ключ, который вы только что сгенерировали, в своем кода.
Шаг 5. Делаем корпус
Продолжаем проект со сборки деревянного корпуса. Как обсуждалось ранее, нужно отрезать:
- боковые панели "2 x 24x10 см" и "2 x 10x6 см"
- одна задняя панель 24 x 10 cm.
После резки всех деревянных блоков нужно соединить и отшлифовать их, чтобы придать корпусу Youtube устройства красивый и гладкий вид. В задней части гаджета мы собираемся просверлить 2 отверстия, одно из которых предназначено для шнура питания, а другое - для переключателя вкл/выкл.
Шаг 6. Собираем схему
Как только корпус готов, нужно спаять все компоненты электроники и установить их в корпус.
Начинаем с пайки NodeMCU. Затем припаиваем резистор 100 Ом к выводу D8 NodeMCU. После этого припаиваем зуммер к плате и связываем его с NodeMCU. Далее припаяем коммутатор и устанавливаем его в задней части коробки. Согласно схеме один контакт коммутатора будет подключаться к VIN NodeMCU, а другой - к клемме + ve понижающего преобразователя. Конец -ve преобразователя подключится к выводу GND NodeMCU. Теперь паяем 7 сегментов согласно схеме.
Далее паяем синие и белые светодиоды на контакты D9 и D10 NodeMCU. После делаем быстрый тест перед установкой лицевой панели. Все работает так, как должно. Хорошо, устанавливаем лицевую панель и переходим к коду.
Шаг 7. Код проекта
Ниже вы можете скачать или скопировать код проекта для Arduino Youtube устройства:
#include <YoutubeApi.h> // Оболочка для API YouTube для Arduino (работает на ESP8266) #include <ESP8266WiFi.h> // Wi-Fi библиотека для ESP8266 #include <WiFiClientSecure.h> // Вариант WiFiClient с поддержкой TLS #include <TM1637Display.h> // Эта библиотека предназначена для управления дисплеем TM1637 #include <ArduinoJson.h> // ------- Замените на свои! ------ // char ssid[] = "XXXXXX"; // SSID (имя) char password[] = "XXXXXXXX"; // ключ сети #define API_KEY "AIzaSyBNabchapXXXXXXXXXXXXXXXXXXXXXmNbY" // google apps API Token #define CHANNEL_ID "UCR0wao7J3htf9DjuVJ2uzUw" // url канала // ------------------------------------- // WiFiClientSecure client; YoutubeApi api(API_KEY, client); unsigned long api_mtbs = 120000; // Среднее время между запросами API - измените на 5 минут unsigned long counter = 0; // Счетчик, который увеличивается каждые 10 миллисекунд // Контакты для подключения модуля (цифровые контакты) #define CLK1 D3 #define DIO1 D2 #define CLK2 D1 #define DIO2 D0 #define CLK3 D5 #define DIO3 D4 #define CLK4 D6 #define DIO4 D7 TM1637Display display1(CLK1, DIO1); TM1637Display display2(CLK2, DIO2); TM1637Display display3(CLK3, DIO3); TM1637Display display4(CLK4, DIO4); long viewsLeft = 0; long viewsRight = 0; long subLeft = 0; long subRight = 0; long OLDsub = 0; // Настройка зуммера int frequency = 1000; // Specified in Hz int buzzPin = D8; int timeOn = 500; // Specified in milliseconds int timeOff = 500; // Specified in milliseconds // Настройка светодиодов int BlueLED = D9; int WhiteLED = D10; int LEDblinker = 0; void setup() { Serial.begin(115200); // Установите светодиоды //pinMode(D9, OUTPUT); //pinMode(D10, OUTPUT); //digitalWrite(D9, HIGH); // Очистить дисплей display1.setBrightness(0x0f); display1.showNumberDec(0, false, 4, 0); display2.setBrightness(0x0f); display2.clear(); display3.setBrightness(0x0f); display3.showNumberDec(0, false, 4, 0); display4.setBrightness(0x0f); display4.clear(); // Установите WiFi в режим станции и отключитесь от точки доступа, если она была ранее подключена WiFi.mode(WIFI_STA); WiFi.disconnect(); delay(100); // Попытаться подключиться к сети Wi-Fi: Serial.print("Connecting Wifi: "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(500); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); IPAddress ip = WiFi.localIP(); Serial.println(ip); } void loop() { counter = counter + 10; if (counter > 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("Video Count: "); Serial.println(api.channelStats.videoCount); Serial.println("------------------------"); // Display the view count viewsRight = api.channelStats.viewCount % 10000; // Value on the right viewsLeft = (api.channelStats.viewCount - viewsRight) / 10000; // Value on the left display1.showNumberDec(viewsRight, false, 4, 0); display2.showNumberDec(viewsLeft, false, 4, 0);viewsRight= 114; if(viewsLeft > 0) { // Zero-padding to avoid a gap between the Left and Right displays if(viewsRight < 10) display1.showNumberDec(000, false, 3, 0); else if(viewsRight < 100) display1.showNumberDec(00, false, 2, 0); else if(viewsRight < 1000) display1.showNumberDec(0, false, 1, 0); } // Display the subscribers count subRight = api.channelStats.subscriberCount % 10000; // Value on the right subLeft = (api.channelStats.subscriberCount - subRight) / 10000; // Value on the left display3.showNumberDec(subRight, false, 4, 0); display4.showNumberDec(subLeft, false, 4, 0); if(subLeft > 0) { // Zero-padding to avoid a gap between the Left and Right displays if(subRight < 10) display3.showNumberDec(000, false, 3, 0); else if(subRight < 100) display3.showNumberDec(00, false, 2, 0); else if(subRight < 1000) display3.showNumberDec(0, false, 1, 0); } // Включить зуммер, если добавился новый подписчик if ( api.channelStats.subscriberCount > OLDsub ) { // Добавился новый подписчик tone(buzzPin, frequency); delay(timeOn); noTone(buzzPin); delay(timeOff); OLDsub = api.channelStats.subscriberCount; LEDblinker = 1; } } counter = 0; // Сброс счетчика после отображения данных } // Мигаем светодиодами if ( LEDblinker == 1 ) { if( counter == 10 || counter == 400 || counter == 800 || counter == 1200 || counter == 1600 || counter == 2000 ){ digitalWrite(BlueLED, LOW); // Turn off the Blue LED digitalWrite(WhiteLED, HIGH); // Turn on the White LED } else if ( counter == 200 || counter == 600 || counter == 1000 || counter == 1400 || counter == 1800 ){ digitalWrite(BlueLED, HIGH); // Turn on the Blue LED digitalWrite(WhiteLED, LOW); // Turn off the White LED } else if ( counter == 2200 ) { LEDblinker = 0; // Reset the blinker counter } } else { digitalWrite(BlueLED, HIGH); // Turn on the Blue LED digitalWrite(WhiteLED, LOW); // Turn off the White LED } delay(10); }
Список библиотек, которые нам нужны для этого проекта, мы перечислил выше. Если вы используете ту же схему, что и мы, вам не нужно ничего менять в коде. Вам просто нужно добавить SSID и пароль вашей сети WiFI, а также ключ API Google и ID идентификатор канала. Остальное вы можете оставить как есть и загрузить код в NodeMCU.
Api_mtbs - это среднее время между запросами API, сделанными микропроцессором. Мы инициализируем дисплеи, устанавливая часы и выводы данных. После этого настраиваем зуммер и 2 светодиода.
В setup() настраиваем режимы выводов светодиодов и включаем синий светодиод при запуске. Затем очищаем все 7 сегментов и отображаем 0 на дисплеях 1 и 3. После этого устройство подключится к сети WiFI с использованием предоставленных учетных данных.
В loop(), когда значение счетчика превысило значение api_mtbs или, попросту говоря, когда приходит время сделать следующий запрос к серверу YouTube, выполняется вызов API с идентификатором канала, и результат отображается на серийном мониторе и на 7-сегментных дисплеях.
Вам необходимо рассчитать MOD полученного числа, чтобы отобразить последние 4 цифры, а затем вычесть значение MOD из исходного значения, чтобы получить первые 4 цифры. Одна вещь, которую мы заметили, заключается в том, что если в MOD, скажем, 24, то на дисплее отображается только 24, а не 0024. Поэтому придется добавить недостающие нули на дисплей. Немного кода добавляет недостающие нули.
И наконец, часть кода предназначена для включения зуммера и светодиодных индикаторов, когда количество новых подписчиков становится больше, чем количество старых подписчиков.
Примечание. Контакты D9 и D10 являются контактами RX и TX NodeMCU. Таким образом, если вы подключите светодиоды к этим контактам, вы не сможете получить ничего на последовательном мониторе. Поэтому в процессе тестирования ничего не подключайте к выводам D9 и D10 и закомментируйте код, который устанавливает режимы выводов для этих выходов.