Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Уведомление о дате выхода нового эпизода сериала / аниме

Компоненты и расходные материалы

Специальная плата JLCPCB
× 1
Arduino Nano 33 IoT
× 1
Raspberry Pi 3, модель B
Raspberry Pi 3 или Raspberry Pi 4
× 1
Raspberry Pi 4, модель B
Raspberry Pi 3 или Raspberry Pi 4
× 1
Экран SparkFun Nokia 5110
× 1
Последовательный MP3-плеер от OPEN-SMART
× 1
Общий анод, рассеянный RGB
× 1
Карта флэш-памяти, SD-карта
× 2
Резистор 220 Ом
× 12
Кнопочный переключатель 6x6x5
× 4
ГНЕЗДО ПИТАНИЯ ПОСТОЯННОГО ТОКА TaydaElectronics 2.1 ММ УСТАНОВКА ДЛЯ ПЕЧАТНОЙ ПЛАТЫ БАРРЕЛЬНОГО ТИПА 2,1 ММ
× 1

Необходимые инструменты и машины

Паяльник (общий)
Пистолет для горячего клея (общий)

Приложения и онлайн-сервисы

IDE Arduino
KiCad
NotePad ++

Об этом проекте

Описание

Хотя существует множество веб-приложений и мобильных приложений для отслеживания дат выпуска любимых шоу, я хотел создать устройство, которое уведомляет меня, когда новый эпизод сериала или аниме в моем списке выпускается с нуля - аппаратно и программно - с различные функции.

Прежде всего, я создал веб-приложение - TV Series / Anime Release Date Tracker - на PHP, чтобы создать список сериалов / аниме и собрать информацию об их датах выпуска. В связи с этим я использовал TVMAZE REST API, который позволяет приложению получать информацию об эпизоде ​​точно по дате выпуска, хотя и без дополнительных и сложных шагов кодирования. Затем я настроил сервер LAMP (с MariaDB) на Raspberry Pi для запуска приложения. Но для тех, у кого нет Raspberry Pi и кто не хочет использовать его в качестве хоста, я опубликовал бесплатную версию приложения с удобным интерфейсом на своем веб-сайте. Кроме того, вы можете найти исходный код приложения ниже.

После выполнения передачи информации с помощью веб-приложения, если в выпуске появится новый эпизод, я решил использовать Arduino Nano 33 IoT в качестве платы разработки для сопоставления данных, созданных приложением. Ниже вы можете найти дополнительную информацию о том, как я отсортировал ответ, передаваемый приложением, с помощью разделителя. А для управления функциями и режимами, реализованными в Nano 33 IoT, я разработал пользовательский интерфейс (меню) с экраном Nokia 5110 и кнопками.

Наконец, чтобы узнать, когда в моем списке появится новый эпизод шоу с его вступительной песней, я использовал модуль последовательного MP3-плеера (OPEN-SMART) из-за его простого в использовании списка команд UART. Кроме того, он позволил мне добавить режим MP3-плеера для воспроизведения всех вступительных песен, что превратило устройство в интригующий аксессуар для моей комнаты :)

Завершив свой дизайн на макетной плате и протестировав код, я разработал печатную плату (средство уведомления о дате выхода сериалов / аниме) с уникальной формой телефона в стиле ретро, ​​чтобы создать совершенно новое на вид и простое в использовании устройство.

Огромное спасибо JLCPCB за спонсирование этого проекта.

Шаг 1. Проектирование и пайка печатной платы уведомления о дате выхода сериалов / аниме

Я разработал печатную плату уведомления о дате выхода сериалов / аниме с помощью KiCad. Я прикрепил файл Gerber печатной платы ниже, поэтому, если хотите, вы можете заказать эту печатную плату в JLCPCB, чтобы воспроизвести этот проект, чтобы получать уведомления, когда в выпуске появятся новые эпизоды ваших любимых шоу :)

Прежде всего, с помощью паяльника я прикрепил разъемы, кнопки, резисторы 220 Ом, разъем питания, 5-миллиметровый анодный RGB-светодиод.

Список компонентов на печатной плате:

A1 (заголовки для Arduino Nano 33 IoT)

J1 (заголовки для последовательного MP3-плеера)

J2 (заголовки для DS3231 - не требуется)

J3 (заголовки для экрана Nokia 5110)

J4 (разъем питания)

D1 (5-миллиметровый анодный RGB-светодиод)

K1, K2, K3, K4 (кнопки)

R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12 (резисторы 220 Ом)

Шаг 2. Настройка веб-сервера LAMP с MariaDB на Raspberry Pi

Если вы новичок в программировании с помощью Raspberry Pi, вы можете ознакомиться с хорошо объясненными инструкциями и руководствами на официальном веб-сайте Raspberry Pi.

Чтобы перейти к официальному руководству по настройке Raspberry Pi, щелкните здесь.

  • Откройте окно терминала, выбрав в меню «Стандартные»> «Терминал».
  • Установите пакет apache2, введя в терминал следующую команду и нажав Enter:

sudo apt-get install apache2 -y

  • Чтобы протестировать сервер, откройте Chromium, выбрав в меню Интернет> Веб-браузер Chromium и введите http:// localhost.
  • При желании вы также можете использовать IP-адрес своего Raspberry Pi.

имя хоста -I

  • Установите пакет PHP с помощью следующей команды:
  • Не забудьте обновить Pi.

sudo apt-get update

sudo apt-get install php -y

  • Установите сервер MySQL (MariaDB) и пакеты PHP-MySQL, введя следующую команду в окно терминала:

sudo apt-get install mariadb-server php-mysql -y

  • Чтобы создать нового пользователя, запустите команду безопасной установки MySQL в окне терминала.

sudo mysql_secure_installation

  • Вам будет предложено Введите текущий пароль для root (введите, если нет): - нажмите Enter.
  • Введите Y и нажмите Enter, чтобы установить пароль root . .
  • Введите бот в Новый пароль: и нажмите Enter.
  • Введите Y, чтобы удалить анонимных пользователей . .
  • Введите Y, чтобы запретить удаленный вход в систему с правами root . .
  • Введите Y, чтобы удалить тестовую базу данных и получить к ней доступ . .
  • Введите Y, чтобы перезагрузить таблицы привилегий сейчас . .
  • По завершении вы увидите это сообщение - Готово! и спасибо за использование MariaDB!

  • Чтобы создать базу данных (tvseries) для сохранения переменных, сгенерированных TVMAZE REST API, запустите эту команду MySQL в окне терминала:

судо mysql -uroot -p

  • Введите пароль root - бот
  • Вас встретит сообщение Добро пожаловать в монитор MariaDB . .
  • Следуйте строкам ниже после MariaDB [(none)]> :запрос на создание сериалов база данных в MariaDB:

создать базу данных сериалов;

ПРЕДОСТАВЛЯЙТЕ ВСЕ ПРИВИЛЕГИИ НА tvseries. * ДЛЯ 'root' @ 'localhost', ИДЕНТИФИЦИРОВАННОГО 'bot';

ПРИВИЛЕГИИ СМЫВАНИЯ;

  • Выйдите из командной строки MariaDB, нажав Ctrl + D.

  • Чтобы получить данные из TVMAZE REST API, просто используя file_get_contents () функции в PHP, установите пакет php-curl:

sudo apt-get install php-curl

  • Затем перезапустите сервер apache, чтобы иметь возможность использовать установленные пакеты на локальном хосте:

перезапуск службы sudo apache2

Шаг 3. Получение информации из TVMAZE REST API о вашем любимом сериале / аниме

TVMAZE предоставляет бесплатный и простой в использовании REST API, который позволяет пользователям искать шоу по имени, дате, номеру эпизода и т. Д. Вы можете проверить доступные конечные точки и запросы:

Перейдите в TVMAZE REST API.

Я использовал Эпизод по дате возможность получить все серии данного шоу, вышедшие в эфир в определенный день.

Чтобы получить информацию по датам выпуска, вам необходимо выполнить поиск ваших любимых шоу на TVMAZE и использовать идентификатор ТВ, указанный в их ссылках.

  • URL:/ shows /:id / episodesbydate? date =:date
  • Дата:формат ISO 8601
  • Пример:http://api.tvmaze.com/shows/1/episodesbydate?date=2013-07-01

Если в указанную дату выходит серия, API возвращает массив полной информации о серии.

В противном случае API возвращает HTTP 404.

Ниже вы можете просмотреть список моих любимых сериалов / аниме, который я создал, чтобы узнать, есть ли в моем проекте новый выпуск одного из них.

Я добавил The Late Late Show, чтобы проверить свой код, поскольку это ежедневное шоу.

1) One Piece

Идентификатор ТВ: 1505

https://www.tvmaze.com/shows/1505/one-piece

2) Моя геройская академия

Идентификатор ТВ: 13615

https://www.tvmaze.com/shows/13615/boku-no-hero-academia

3) Мир Дикого Запада

Идентификатор ТВ: 1371

https://www.tvmaze.com/shows/1371/westworld

4) Симпсоны

Идентификатор ТВ: 83

https://www.tvmaze.com/shows/83/the-simpsons

5) Позднее шоу с Джеймсом Корденом

Идентификатор телевизора: 2831

https://www.tvmaze.com/shows/2831/the-late-late-show-with-james-corden

Шаг 4:Разработка приложения для отслеживания даты выпуска сериалов / аниме, работающего на Raspberry Pi на PHP, и создание таблицы серий для вставки данных

Я разработал средство отслеживания даты выпуска сериалов / аниме на PHP и объяснил исходный код приложения в разделе «Объяснение кода» ниже для тех, кому интересно.

Однако, если вы не увлекаетесь веб-разработкой с помощью PHP, вы можете загрузить приложение в разделе Загрузки под названием TV-Series-Anime-Episode-Tracker.zip и загрузить его в Raspberry Pi, не углубляясь в кодирование PHP.

Загрузить :

Выполните следующие действия, чтобы установить трекер даты выпуска сериалов / аниме на локальном хосте:

  • Загрузите приложение TV-Series-Anime-Episode-Tracker.zip, включая файлы index.php и query.php.

  • Распакуйте TV-Series-Anime-Episode-Tracker.zip.

  • Переместите папку приложения (TV-Series-Anime-Episode-Tracker) из раздела "Загрузки" на сервер (/ var / www / html) с помощью терминала, поскольку сервер apache является защищенным местом.

sudo mv / home / pi / Downloads / TV-Series-Anime-Episode-Tracker / / var / www / html /

  • Перейти к счетчику даты выхода сериалов / аниме:

http:// localhost / TV-Series-Anime-Episode-Tracker /

Возможности :

1) После установки откройте приложение для создания таблицы с именем series в базе данных (tvseries). Когда вы впервые открываете файл index.php, приложение автоматически создает таблицу с именем series и сообщает пользователю: Таблица базы данных создана!

2) Если таблица (серия) базы данных успешно создана в базе данных, приложение информирует пользователя: Найдена таблица базы данных!

3) После создания таблицы (серии) базы данных, чтобы вставить переменные, необходимые для TVMAZE REST API для каждого шоу в вашем списке, выполните следующие действия:

  • Запустите эту команду MySQL в окне терминала:

судо mysql -uroot -p

  • Введите пароль root - бот
  • Выберите серию база данных:

ИСПОЛЬЗУЙТЕ сериалы;

  • Вставьте необходимые переменные - название сериала, TV ID, статус - в таблицу для каждого шоу. Переменная статуса используется приложением, чтобы уведомить пользователя без повторения о выходе нового выпуска в заданную дату.

INSERT INTO `series` (` series_name`, `tv_id`,` status`) VALUES ('One Piece', '1505', 'Pending');

5) В query.php приложение делает запросы к TVMAZE REST API, чтобы определить, находятся ли новые выпуски шоу в базе данных. Если TVMAZE REST API возвращает массив полной информации о выпуске выпущенного выпуска, приложение печатает информацию, которую Arduino Nano 33 IoT может упорядочить, один раз, чтобы предотвратить повторение.

http://localhost/TV-Series-Anime-Episode-Tracker/query.php

% Series_Name% Season% Episode_Number% Episode_Name%

% The Late Late Show% 2020% 91% Джейсон Шварцман, Алисия Ки%

6) В противном случае приложение напечатает Запись не найдена!

Пояснение к коду :

1) index.php

  • Определите параметры подключения к базе данных - "localhost", "root", "bot", "tvseries".
  • В checkDatabase () функция, определить, есть ли таблица базы данных в заданном имени - series.
  • В createTable () функция, создайте таблицу серий, если она не найдена в базе данных, и проинформируйте пользователя.

2) query.php

  • В запросе класс, определите путь к TVMAZE API для выполнения запросов.
  • В define_user () функция, получить настройки подключения и имя таблицы.
  • В check_ep_release_date () функция, используя file_get_contents () функция, определяет, выходит ли новый выпуск для данного идентификатора ТВ в текущую дату. Измените переменную статуса в базе данных с "Ожидает" на "Выпущена", если выпуск новой серии находится в стадии выпуска, чтобы предотвратить повторение.
  • В track_db_entries () функцию, выполните check_ep_release_date () для каждого шоу, зарегистрированного в базе данных, таблица - серия.

Шаг 4.1:Запуск веб-приложения без Raspberry Pi

Для подписчиков моего веб-сайта (TheAmplituhedron) я разработал бесплатную версию трекера даты выхода сериалов / аниме для тех, у кого нет Raspberry Pi и кто не хочет использовать его в качестве хоста для этого проекта.

Он предоставляет удобный интерфейс для управления базой данных. Если вы хотите использовать этот интерфейс в своем проекте вместо использования терминала на Raspberry Pi для вставки данных, свяжитесь со мной.

Заходим в приложение:

https://www.theamplituhedron.com/dashboard/TV-Series-Anime-Episode-Tracker/

Шаг 5. Настройка Arduino Nano 33 IoT

Если вы новичок в программировании с Arduino Nano 33 IoT:не волнуйтесь, его просто использовать с Arduino IDE. Просто скачайте необходимые драйверы - Arduino SAMD Core - как описано здесь.

Чтобы иметь возможность подключиться к Wi-Fi через Arduino Nano 33 IoT, загрузите библиотеку WiFiNINA отсюда.

Для печати текста и рисования графики на экране Nokia 5110 загрузите библиотеку LCD5110_Basic отсюда.

Я использовал второй последовательный порт (Serial1) на Arduino Nano 33 IoT для связи с последовательным MP3-плеером.

Последовательные порты на Arduino Nano 33 IoT :

«USB-разъем платы напрямую подключен к USB-выводам хоста SAMD21. Эта маршрутизация позволяет использовать Arduino NANO 33 IoT в качестве клиентского периферийного USB-устройства (действующего как мышь или клавиатура, подключенная к компьютеру. ) или в качестве хост-устройства USB, чтобы такие устройства, как мышь, клавиатура или телефон Android, могли быть подключены к Arduino NANO 33 IoT. Этот порт также можно использовать в качестве виртуального последовательного порта с помощью объекта Serial на языке программирования Arduino. . Контакты RX0 и TX1 - это второй последовательный порт, доступный как Serial1 ".

Затем Arduino Nano 33 IoT готов выполнить код проекта :)

Шаг 6. Отправка команд на последовательный MP3-плеер (OPEN-SMART)

Я создал плейлист, состоящий из начальных песен моего любимого списка сериалов / аниме в этом проекте:

1) One Piece - Открытие | Слушай

2) Моя геройская академия - Открытие | Слушай

3) Westworld - Открытие | Слушай

4) Симпсоны - Открытие | Слушай

5) Поздно позднее шоу - Открытие | Слушай

Если хотите, можете скачать мой плейлист в заархивированной папке - Opening_songs.zip.

Использование последовательного MP3-плеера с Arduino Nano 33 IoT несложно, если вы знаете команды UART, необходимые для запуска правильных функций. Я использовал модуль последовательного MP3-плеера с динамиком от OPEN-SMART. Таким образом, если у вас есть MP3-плеер с последовательным интерфейсом под другой торговой маркой, эти команды, показанные ниже, вам не подойдут.

Следуйте инструкциям из руководства:

«Модуль представляет собой своего рода простое устройство MP3-плеера, основанное на высококачественном аудиочипе MP3. Он может поддерживать форматы файлов MP3 и WAV с частотой дискретизации 8 кГц ~ 48 кГц. На борту имеется гнездо для карты TF. , поэтому вы можете подключить карту micro SD, на которой хранятся аудиофайлы. MCU может управлять состоянием воспроизведения MP3, отправляя команды на модуль через порт UART, такие как переключение песен, изменение громкости и режима воспроизведения и т. д. Вы также можете отладить модуль через USB в модуль UART. Он совместим с Arduino / AVR / ARM / PIC. "

«Убедитесь, что ваша карта micro SD отформатирована как FAT16 или FAT32 и на ней есть песни. Вы должны создать папки« 01 »и« 02 »и поместить несколько песен с именем 001xxx.mp3 / 002xxx.mp3 / 003xxx.mp3 в них. "

Другими словами, чтобы иметь возможность точно выполнять команды, сохраните свои песни в папке с именем '01' и добавьте порядковые номера к названиям песен - 001One Piece-Opening.mp3, 002My Hero Academia-Opening.mp3 и т. Д.

Чтобы отправлять команды UART на последовательный MP3-плеер с Arduino Nano 33 IoT, я создал функцию с именем send_command_to_MP3_player . Он передает каждый байт запрошенной команды в последовательный MP3-плеер через второй последовательный порт на выводах RX0 и TX1 - Serial1 - в зависимости от длины запрошенной команды - 4, 5 или 6.

Как показано ниже, разделите команду, которую вы хотите отправить в последовательный MP3-плеер, байтами - 0x7e. Все команды начинаются с «7E» и заканчиваются «EF». Второй байт - это количество байтов между - «02», «03», «04». Ниже загрузите руководство для последовательного MP3-плеера от OPEN-SMART, чтобы проверить все команды и получить более подробные инструкции.

  // Определяем необходимые команды MP3-плеера. 
// Вы можете проверить все заданные команды на странице проекта:
// Выберите запоминающее устройство для TF-карты
static int8_t select_SD_card [] ={0x7e, 0x03, 0X35, 0x01, 0xef}; // 7E 03 35 01 EF
// Воспроизвести песню в каталоге:/01/001xxx.mp3
static int8_t play_song_1 [] ={0x7e, 0x04, 0x41, 0x00, 0x01, 0xef}; // 7E 04 41 00 01 EF
// Воспроизвести песню в каталоге:/01/002xxx.mp3
static int8_t play_song_2 [] ={0x7e, 0x04, 0x41, 0x00, 0x02, 0xef}; // 7E 04 41 00 02 EF
// Воспроизвести песню в каталоге:/01/003xxx.mp3
static int8_t play_song_3 [] ={0x7e, 0x04, 0x41, 0x00, 0x03, 0xef}; // 7E 04 41 00 03 EF
// Воспроизвести песню в каталоге:/01/004xxx.mp3
static int8_t play_song_4 [] ={0x7e, 0x04, 0x41, 0x00, 0x04, 0xef}; // 7E 04 41 00 04 EF
// Воспроизвести песню в каталоге:/01/005xxx.mp3
static int8_t play_song_5 [] ={0x7e, 0x04, 0x41, 0x00, 0x05, 0xef}; // 7E 04 41 00 05 EF
// Воспроизведение песни.
static int8_t play [] ={0x7e, 0x02, 0x01, 0xef}; // 7E 02 01 EF
// Приостановить песню.
static int8_t pause [] ={0x7e, 0x02, 0x02, 0xef}; // 7E 02 02 EF
// Следующая песня.
static int8_t next_song [] ={0x7e, 0x02, 0x03, 0xef}; // 7E 02 03 EF
// Предыдущая песня.
static int8_t previous_song [] ={0x7e, 0x02, 0x04, 0xef}; // 7E 02 04 EF

Шаг 7. Программирование Arduino Nano 33 IoT

  • Включите необходимые библиотеки.
  • Определите настройки Wi-Fi - SSID и пароль.
  • Введите IP-адрес вашего Raspberry Pi.
  • Определите путь приложения (query.php) в Raspberry Pi.
  • Инициализировать клиентскую библиотеку Ethernet.
  • Определите настройки экрана Nokia 5110.
  • Определите графику для связанных режимов экрана - телевидения и музыки.
  • Чтобы создать другую графику (монохромные изображения), перейдите в Monochrome Image Converter.
  • Определите необходимые команды для MP3-плеера.
  • Определяйте параметры и режимы меню с помощью изменчивых логических значений.
  • Определите кнопки управления и контакты светодиодов RGB.
  • Инициируйте последовательную связь для последовательного модуля MP3-плеера через второй последовательный порт - Serial1 .
  • Подключитесь к сети Wi-Fi.
  • Проверьте соединение на мониторе последовательного порта и на экране Nokia 5110.
  • В read_buttons () функции, получайте данные с помощью кнопок управления - «Вправо», «ОК», «Влево» и «Выход».
  • В change_menu_options () , увеличьте или уменьшите номер параметра с помощью кнопок «Вправо» и «Влево».
  • В interface () функция, распечатайте интерфейс (меню).
  • Если Init Tracker выбран режим, подключитесь к веб-приложению TV Series / Anime Release Date Tracker.
  • Если доступны входящие байты, получите ответ от веб-приложения.
  • Использование ndsWith () функция, определяет, есть ли в ответе символ процента (разделитель) или нет.
  • Если есть, разделите строку ответа предопределенным разделителем простым способом. '%' (процент) определяется как разделитель в этом проекте.
  • Собирайте информацию в виде подстрок - Series_Name, Season, Episode, Episode_Name.
  • Распечатайте информацию и проиграйте начальную песню выпущенного сериала / аниме, пока не прекратите воспроизведение.
  • Подождите, пока не будет нажата кнопка "Выход".
  • Если ответ пустой, выведите Выпущенный выпуск не обнаружен :(
  • Нарисуйте значок телевизора, считая до нового запроса.
  • Дождитесь следующего запроса.
  • Если режим MP3-плеера выбрано, нарисуйте значок музыкального проигрывателя. Управляйте MP3-плеером с помощью кнопок управления - «Вправо», «Влево», «ОК».
  • Если спящий режим выбрано, активируйте спящий режим через 10 секунд и распечатайте оставшиеся секунды.

Подключения и корректировки

// Connections
// Arduino Nano 33 IoT:
// Nokia 5110 Screen
// D2 -------------------------- SCK (Clk)
// D3 -------------------------- MOSI (Din)
// D4 -------------------------- DC
// D5 -------------------------- RST
// D6 -------------------------- CS (CE)
// RGB
// D9 -------------------------- R
// D10 -------------------------- G
// D11 -------------------------- B
// LEFT_BUTTON
// A0 --------------------------- S
// OK_BUTTON
// A1 --------------------------- S
// RIGHT_BUTTON
// A2 --------------------------- S
// EXIT_BUTTON
// A3 --------------------------- S
// DS3231 (Optional for Nano and Not Required for Nano 33 IoT)
// A4 --------------------------- SDA
// A5 --------------------------- SCL

After finishing and uploading the code to the Arduino Nano 33 IoT, I attached all required components to the board via headers.

I also provided a connection slot for a DS3231 RTC Module for those who want to change the Arduino Nano 33 IoT with the Arduino Nano. But, you need to enter release dates manually for each show to the Arduino Nano without being able to obtain data from the web application to create a countdown timer with the RTC.

Note:You can connect either a speaker or headphones to the Serial MP3 Player to listen to soundtracks in the playlist. I connected the speaker delivered in addition to the Serial MP3 Player (OPEN-SMART).

Modes and Features

1) While the device tries to connect to the WiFi network, it displays Waiting... Attempting to connect to WiFi .

2) After establishing a successful connection, the device informs the user with this message - Connected to WiFi!!!

3) Then, the device prints the interface (menu) presenting available modes - A.Init Tracker, B.MP3 Player , and C.Sleep . To switch among modes, use the Right and Left buttons. Subsequently, press the OK button to select a mode.

A.Init Tracker

A.1) After selecting the A.Init Tracker mode, the device attempts to connect to the localhost hosted by the Raspberry Pi. If successful, it informs the user with this message - Connected to the server!!! Conversely, the device displays this message - Connection Error!!!

A.2) If the application (TV Series / Anime Release Date Tracker) sends a data string that of a released episode of a registered series/anime in the database, then the device:

  • Prints the episode information - Series Name, Season, Episode Number, and Episode Name:

One Piece, 10x54, Luffy's Determination

  • Plays the opening song of the released series/anime,
  • And, turns the RGB to the color assigned to the released series/anime.

For instance, I assigned these colors below for each show in my list:

  • One Piece -> Red
  • My Hero Academia -> Green
  • Westworld -> Blue
  • The Simpsons -> Yellow
  • The Late Late Show -> Purple

Unless the Exit button is pressed, the device keeps displaying the episode information and showing the assigned color.

The device notifies the user for once for each released episode to prevent any recurrence.

A.3) After the Exit button is pressed, the device draws the television icon while waiting for the next request to the application.

A.4) If there is no released episode of a registered series/anime in the database, the device displays this message - No Released Episode Detected :( - and then; draws the television icon until the next request to the application.

A.5) The device returns to the interface (menu) if the Exit button is pressed while displaying the television icon.

B. MP3 Player

I implemented this feature as a subsidiary and fun one to turn this device into an intriguing accessory for my room.

B.1) After selecting the B.MP3 Player mode, the device draws the music note icon and lets the user play all opening songs by using the control buttons:

  • Right - Next Song
  • Left - Previous Song
  • OK - Pause

B.2) The device returns to the interface (menu) if the Exit button is pressed.

C.Sleep

C.1) After selecting the C.Sleep mode, the device enables the sleep mode in 10 seconds and prints the remaining seconds on the screen.

C.2) While maintaining the sleep mode, the device applies a given color pattern to the RGB as a nightlight.

C.3) The device returns to the interface (menu) if the Exit button is pressed.

Videos and Conclusion

After completing all steps above, I decided to fasten the device to my bookcase by using a hot glue gun. It works stupendously :)

Код

  • Series_Release_Date_Notifier.ino
  • index.php
  • query.php
Series_Release_Date_Notifier.inoArduino
 //////////////////////////////////////////////////// // TV Series / Anime New Episode // // Release Date Notifier // // ------------------------- // // Arduino Nano 33 IoT // // by Kutluhan Aktar // // // ////////////////////////////////////////////////////// Get informed when new episodes of your favorite shows are on release with their opening songs via Nano 33 IoT and Raspberry Pi. //// I developed a corroborating web application in PHP for this project, named TV Series / Anime Release Date Tracker. // You can either use a Raspberry Pi as the server, explained in the project tutorial, or TheAmplituhedron with the real-time database interface if you are a member. //// For more information:// https://www.theamplituhedron.com/projects/TV-Series-Anime-New-Episode-Release-Date-Notifier/// // You can use the mentioned web application in free version on TheAmplituhedron as the host server if you are a subscriber:// https://www.theamplituhedron.com/dashboard/TV-Series-Anime-Episode-Tracker///// Connections// Arduino Nano 33 IoT:// Nokia 5110 Screen// D2 --------------------------- SCK (Clk)// D3 --------------------------- MOSI (Din) // D4 --------------------------- DC // D5 --------------------------- RST// D6 --------------------------- CS (CE)// RGB// D9 --------------------------- R// D10 --------------------------- G// D11 --------------------------- B// LEFT_BUTTON// A0 --------------------------- S// OK_BUTTON// A1 --------------------------- S// RIGHT_BUTTON// A2 --------------------------- S// EXIT_BUTTON// A3 --------------------------- S// DS3231 (Optional for Nano and Not Required for Nano 33 IoT)// A4 --------------------------- SDA // A5 --------------------------- SCL// Include required libraries:#include #include #include char ssid[] ="[_SSID_]"; // your network SSID (name)char pass[] ="[_PASSWORD_]"; // your network password (use for WPA, or use as key for WEP)int keyIndex =0; // your network key Index number (needed only for WEP)int status =WL_IDLE_STATUS;// Note:Uncomment equivalent connection settings provided under related lines for using the web application hosted on TheAmplituhedron if you are a subscriber.// Enter the IPAddress of your Raspberry Pi.IPAddress server(192, 168, 1, 22);/* // name address for TheAmplituhedron. Change it with your server if you are using a different host server than TheAmplituhedron.char server[] ="www.theamplituhedron.com";*/// Define the pathway of the application in Raspberry Pi.String application ="/TV-Series-Anime-Episode-Tracker/query.php";/*// Define your hedron if you are using TheAmplituhedron as the host server for this project:String HEDRON ="[_HEDRON_]";// Define the pathway of the web application. If you are using TheAmplituhedron as the host server for this project as I did, just enter your hedron. Otherwise, enter the pathway on your server.String application ="/dashboard/TV-Series-Anime-Episode-Tracker/" + HEDRON;*/// Initialize the Ethernet client libraryWiFiClient client;/* WiFiSSLClient client; */// Define screen settings.LCD5110 myGLCD(2,3,4,5,6);extern uint8_t SmallFont[];extern uint8_t MediumNumbers[];// Define the graphics for related screen modes.extern uint8_t tv[];extern uint8_t music[];// Define the required MP3 Player Commands.// You can inspect all given commands from the project page:// Select storage device to TF cardstatic int8_t select_SD_card[] ={0x7e, 0x03, 0X35, 0x01, 0xef}; // 7E 03 35 01 EF// Play the song with the directory:/01/001xxx.mp3static int8_t play_song_1[] ={0x7e, 0x04, 0x41, 0x00, 0x01, 0xef}; // 7E 04 41 00 01 EF// Play the song with the directory:/01/002xxx.mp3static int8_t play_song_2[] ={0x7e, 0x04, 0x41, 0x00, 0x02, 0xef}; // 7E 04 41 00 02 EF// Play the song with the directory:/01/003xxx.mp3static int8_t play_song_3[] ={0x7e, 0x04, 0x41, 0x00, 0x03, 0xef}; // 7E 04 41 00 03 EF// Play the song with the directory:/01/004xxx.mp3static int8_t play_song_4[] ={0x7e, 0x04, 0x41, 0x00, 0x04, 0xef}; // 7E 04 41 00 04 EF// Play the song with the directory:/01/005xxx.mp3static int8_t play_song_5[] ={0x7e, 0x04, 0x41, 0x00, 0x05, 0xef}; // 7E 04 41 00 05 EF// Play the song.static int8_t play[] ={0x7e, 0x02, 0x01, 0xef}; // 7E 02 01 EF// Pause the song.static int8_t pause[] ={0x7e, 0x02, 0x02, 0xef}; // 7E 02 02 EF// Next song.static int8_t next_song[] ={0x7e, 0x02, 0x03, 0xef}; // 7E 02 03 EF// Previous song.static int8_t previous_song[] ={0x7e, 0x02, 0x04, 0xef}; // 7E 02 04 EF// Define menu options and modes using volatile booleans.volatile boolean TV =false;volatile boolean Music =false;volatile boolean Sleep =false;volatile boolean Activated =false;// Define the control buttons.#define B_Exit A3#define B_Right A2#define B_OK A1#define B_Left A0// Define RGB LED pins.#define redPin 9#define greenPin 10#define bluePin 11// Define data holders:int Right, OK, Left, Exit;int selected =0;void setup() { // Buttons:pinMode(B_Exit, INPUT); pinMode(B_Right, INPUT); pinMode(B_OK, INPUT); pinMode(B_Left, INPUT); // RGB:pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, OUTPUT); adjustColor(0, 0, 0); // Black // Initiate screen. myGLCD.InitLCD(); myGLCD.setFont(SmallFont); Serial.begin (9600); // Initiate serial communication for the Serial MP3 Player Module. Serial1.begin(9600); // Select the SD Card. send_command_to_MP3_player(select_SD_card, 5); // check for the WiFi module:if (WiFi.status() ==WL_NO_MODULE) { Serial.println("Communication with WiFi module failed!"); myGLCD.print("Connection Failed!", 0, 8); while (true); } // attempt to connect to Wifi network:while (status !=WL_CONNECTED) { Serial.print("Attempting to connect to SSID:"); Serial.println (ssid); myGLCD.print("Waiting...", 0, 8); myGLCD.print("Attempting to", 0, 16); myGLCD.print("connect to", 0, 24); myGLCD.print("WiFi !!!", 0, 32); // Connect to WPA/WPA2 network. Change this line if using open or WEP network:status =WiFi.begin(ssid, pass); // ждем 10 секунд подключения:delay (10000); } // Verify connection on both the serial monitor and Nokia 5110 Screen. Serial.println("Connected to wifi"); myGLCD.clrScr(); myGLCD.print("Connected to", 0, 8); myGLCD.print("WiFi!!!", 0, 16); задержка (2000); myGLCD.clrScr();}void loop() { read_buttons(); change_menu_options(); interface(); if(TV ==true){ do{ myGLCD.invertText(true); myGLCD.print("A.Init Tracker", 0, 16); myGLCD.invertText(false); задержка (100); if(OK ==HIGH){ myGLCD.clrScr(); Activated =true; while(Activated ==true){ // Connect to the web application named TV Series / Anime Release Date Tracker. Change '80' with '443' if you are using TheAmplituhedron as the host. if (client.connect(server, 80)) { Serial.println("connected to server"); // if you get a connection, report back via serial:myGLCD.print("Connected to", 0, 8); myGLCD.print("the server!!!", 0, 16); // Make an HTTP request:client.println("GET " + application + " HTTP/1.1"); //client.println("Host:www.theamplituhedron.com"); client.println("Host:192.168.1.22"); client.println("Connection:close"); client.println(); }else{ myGLCD.print("Connection", 0, 8); myGLCD.print("Error!!!", 0, 16); } delay(2000); // Wait 2 seconds after connection... // If there are incoming bytes available, get the response from the web application. String response =""; while (client.available()) { char c =client.read(); response +=c; } if(response !="" &&response.endsWith("%")){ // Split the response string by a pre-defined delimiter in a simple way. '%'(percentage) is defined as the delimiter in this project. int delimiter, delimiter_1, delimiter_2, delimiter_3, delimiter_4; delimiter =response.indexOf("%"); delimiter_1 =response.indexOf("%", delimiter + 1); delimiter_2 =response.indexOf("%", delimiter_1 +1); delimiter_3 =response.indexOf("%", delimiter_2 +1); delimiter_4 =response.indexOf("%", delimiter_3 +1); // Glean information as substrings. String Series_Name =response.substring(delimiter + 1, delimiter_1); String Season =response.substring(delimiter_1 + 1, delimiter_2); String Episode =response.substring(delimiter_2 + 1, delimiter_3); String Episode_Name =response.substring(delimiter_3 + 1, delimiter_4); // Print information. myGLCD.clrScr(); myGLCD.print(Series_Name, 0, 0); myGLCD.print(Season + " x " + Episode, 0, 16); myGLCD.print(Episode_Name, 0, 32); // Play the opening song of the released series / anime until ceased:if(Series_Name =="One Piece") { send_command_to_MP3_player(play_song_1, 6); adjustColor(255,0,0); } if(Series_Name =="My Hero Academia") { send_command_to_MP3_player(play_song_2, 6); adjustColor(0,255,0); } if(Series_Name =="Westworld") { send_command_to_MP3_player(play_song_3, 6); adjustColor(0,0,255); } if(Series_Name =="The Simpsons") { send_command_to_MP3_player(play_song_4, 6); adjustColor(255,255,0); } if(Series_Name =="The Late Late Show") { send_command_to_MP3_player(play_song_5, 6); adjustColor(80,0,80); } // Wait until the Exit button pressed... volatile boolean song =true; while(song ==true){ read_buttons(); if(Exit ==HIGH){ song =false; send_command_to_MP3_player(pause, 4); adjustColor(0,0,0); } } myGLCD.clrScr(); }else{ // Print information. myGLCD.clrScr(); myGLCD.print("No Released", 0, 0); myGLCD.print("Episode", 0, 16); myGLCD.print("Detected :(", 0, 32); delay(5000); // Wait 5 seconds to display information... myGLCD.clrScr(); } // Draw TV icon while counting to the new request... myGLCD.drawBitmap(8, 0, tv, 60, 48); delay(10 * 1000); // Wait until next request... myGLCD.clrScr(); // Exit. read_buttons(); if(Exit ==HIGH){ Activated =false; myGLCD.clrScr(); } } } }while(TV ==false); } if(Music ==true){ do{ myGLCD.invertText(true); myGLCD.print("B.MP3 Player", 0, 24); myGLCD.invertText(false); delay(100); if(OK ==HIGH){ myGLCD.clrScr(); Activated =true; while(Activated ==true){ read_buttons(); // Draw music player icon. myGLCD.drawBitmap(8, 0, music, 60, 48); // MP3 Player:if(Right ==true) send_command_to_MP3_player(next_song, 4); if(Left ==true) send_command_to_MP3_player(previous_song, 4); if(OK ==true) send_command_to_MP3_player(pause, 4); // Exit. if(Exit ==HIGH){ Activated =false; myGLCD.clrScr(); send_command_to_MP3_player(pause, 4); } } } }while(Music ==false); } if(Sleep ==true){ do{ myGLCD.invertText(true); myGLCD.print("C.Sleep", 0, 32); myGLCD.invertText(false); задержка (100); if(OK ==HIGH){ // Activate the sleep mode in 10 seconds. myGLCD.clrScr(); myGLCD.print("Entering", CENTER, 0); myGLCD.print("Sleep Mode", CENTER, 8); myGLCD.print("in", CENTER, 16); myGLCD.print("Seconds", CENTER, 40); // Print remaining seconds. myGLCD.setFont(MediumNumbers); for (int s=10; s>=0; s--){ myGLCD.printNumI(s, CENTER, 24, 2, '0'); задержка (1000); } myGLCD.enableSleep(); Activated =true; while(Activated ==true){ // Color Pattern:adjustColor(255,0,0); задержка (500); adjustColor(0,255,0); задержка (500); adjustColor(0,0,255); задержка (500); adjustColor(255,255,0); задержка (500); adjustColor(80,0,80); задержка (500); // Exit. read_buttons(); if(Exit ==HIGH){ Activated =false; myGLCD.clrScr(); myGLCD.disableSleep(); myGLCD.setFont(SmallFont); adjustColor(0,0,0); } } } }while(Sleep ==false); }}void read_buttons(){ // Read the control buttons:Right =digitalRead(B_Right); OK =digitalRead(B_OK); Left =digitalRead(B_Left); Exit =digitalRead(B_Exit);}void send_command_to_MP3_player(int8_t command[], int len){ Serial.print("\nMP3 Command => "); for(int i=0;i 3) selected =1; задержка (100); // Depending on the selected option number, change boolean status. switch(selected){ case 1:TV =true; Music =false; Sleep =false; ломать; case 2:TV =false; Music =true; Sleep =false; ломать; case 3:TV =false; Music =false; Sleep =true; ломать; }}void adjustColor(int red, int green, int blue){ red =255 - red; green =255 - green; blue =255 - blue; analogWrite(redPin, red); analogWrite(greenPin, green); analogWrite(bluePin, blue);}
index.phpPHP
 0) ? true :false;}function createTable($table_name, $conn){ if(!checkDatabase($table_name, $conn)){ $sql ="CREATE TABLE `$table_name`( id int(11) AUTO_INCREMENT PRIMARY KEY NOT NULL, series_name varchar(255) NOT NULL, tv_id varchar(255) NOT NULL, status varchar(255) NOT NULL );"; if(mysqli_query($conn, $sql)){ echo "Database Table Created!"; }else{ echo "Error!"; } }else{ echo "Database Table Found!"; }}createTable("series", $conn_database);?>
query.phpPHP
conn =$conn; $this->table_name =$table_name; } private function check_ep_release_date($API_ID, $series_name, $status){ $date =date("Y-m-d"); $URL =self::ROOT.$API_ID.self::PATH.$date; if($get_content =json_decode(file_get_contents((String)$URL))){ if($status !="Released"){ echo "%".$series_name."%".$get_content[0]->season."%".$get_content[0]->number."%".$get_content[0]->name."%"; $sql ="UPDATE `$this->table_name` SET `status`='Released' WHERE series_name='$series_name'"; mysqli_query($this->conn, $sql); } }else{ if($status !="Pending"){ $sql ="UPDATE `$this->table_name` SET `status`='Pending' WHERE series_name='$series_name'"; mysqli_query($this->conn, $sql); } } } public function track_db_entries(){ $sql ="SELECT * FROM `$this->table_name` ORDER BY `id` DESC"; if($result =mysqli_query($this->conn, $sql)){ $check =mysqli_num_rows($result); if($check> 0){ while($row =mysqli_fetch_assoc($result)){ $this->check_ep_release_date($row['tv_id'], $row['series_name'], $row['status']); } }else{ echo "No Entry Found!"; } }else{ echo "No Database Found!"; } }}// Define the connection settings and the table name.$conn_database =mysqli_connect("localhost", "root", "bot", "tvseries");$table ="series";// Define the object to check release date for each registered series / anime.$q =new query();$q->define_user($conn_database, $table);$q->track_db_entries();?>

Изготовленные на заказ детали и корпуса

gerber_ycEfXzZq6h.zip tv-series-anime-episode-tracker_gCfN0nFiA8.zip opening_songs_y2LCEw79tg.zip tv_Iz2isO8nGI.c music_SA2xR86cZw.c

Схема


Производственный процесс

  1. Универсальный пульт дистанционного управления Raspberry Pi
  2. Кусочек Raspberry Pi
  3. Cycle Chaser
  4. Детектор воров Raspberry Pi
  5. Датчик температуры Raspberry Pi
  6. МАЛИНОВАЯ АВТОМАТИЗАЦИЯ ДОМА
  7. НОВАЯ МОДЕЛЬ B + МАЛИНЫ PI 3 ФУНКЦИИ И ПОКУПКА
  8. Робот-бокс для компакт-дисков Raspberry Pi
  9. RaspiRobot Board V2
  10. Rover