Справочник программиста Библиотеки Гид по TFT-дисплеям

15 января в 01:03

Гаджет показывающий число подписчиков и просмотров на Youtube

В этом уроке с помощью Ардуино мы соберем гаджет, который будет показывать текущее количество подписчиков и просмотров на 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).

Вот список библиотек, которые нам нужны для этого проекта:

Вы можете скачать их все с GitHub, ссылки выше. После скачивания распакуйте и переименуйте библиотеки, удалив из названия любые специальные символы и «master». Поместите папку в раздел библиотек вашего Arduino. Вам может понадобиться создать папку Libraries  (Библиотеки), если это ваша первая библиотека. Перезапустите среду Arduino IDE, чтобы она правильно загрузила файл KEYWORD, примеры и добавила библиотеку в меню библиотеки.

Уникальные идентификаторы:

Помимо библиотек вам также понадобится несколько уникальных идентификаторов для этого проекта.

Первый - это 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 и закомментируйте код, который устанавливает режимы выводов для этих выходов.

15.01.2019 | Уроки | Теги статьи |
Ардуино+