Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Notificador de la fecha de lanzamiento del nuevo episodio de la serie de televisión / anime

Componentes y suministros

JLCPCB PCB personalizado
× 1
Arduino Nano 33 IoT
× 1
Raspberry Pi 3 Modelo B
Raspberry Pi 3 o Raspberry Pi 4
× 1
Raspberry Pi 4 Modelo B
Raspberry Pi 3 o Raspberry Pi 4
× 1
SparkFun Nokia 5110 Screen
× 1
Reproductor MP3 en serie de OPEN-SMART
× 1
Ánodo común difuso RGB
× 1
Tarjeta de memoria flash, tarjeta SD
× 2
Resistencia 220 ohmios
× 12
Interruptor de botón 6x6x5
× 4
TaydaElectronics DC POWER JACK 2.1MM MONTAJE EN PCB TIPO BARRIL
× 1

Herramientas y máquinas necesarias

Soldador (genérico)
Pistola de pegamento caliente (genérica)

Aplicaciones y servicios en línea

Arduino IDE
KiCad
Bloc de notas ++

Acerca de este proyecto

Descripción

Aunque hay una gran cantidad de aplicaciones web y móviles para rastrear las fechas de lanzamiento de los programas favoritos, quería crear un dispositivo que me notificara cuando un nuevo episodio de una serie o un anime de mi lista se lanza desde cero (hardware y software) con varias funciones.

En primer lugar, creé una aplicación web (TV Series / Anime Release Date Tracker) en PHP para crear una lista de series / anime y recopilar información sobre sus fechas de lanzamiento. En ese sentido, utilicé la API TVMAZE REST que permite a la aplicación obtener información del episodio por fecha de lanzamiento con precisión, aunque sin pasos de codificación diversos y desconcertantes. Luego, configuré un servidor LAMP (con MariaDB) en Raspberry Pi para ejecutar la aplicación. Pero, para aquellos que no tienen una Raspberry Pi ni quieren usar una como host, publiqué una versión gratuita de la aplicación con una interfaz fácil de usar en mi sitio web. Además, puede encontrar el código fuente de la aplicación a continuación.

Después de completar la transferencia de información con la aplicación web, si hay un nuevo episodio en el lanzamiento, decidí usar un Arduino Nano 33 IoT como placa de desarrollo para recopilar los datos generados por la aplicación. Puede encontrar más información a continuación sobre cómo clasifiqué la respuesta transferida por la aplicación usando un delimitador. Y, para administrar las funciones y modos que implementé en el Nano 33 IoT, diseñé una interfaz de usuario (menú) con una pantalla Nokia 5110 y botones.

Por último, para estar informado cuando se publica un nuevo episodio de un programa en mi lista con su canción de apertura, utilicé un módulo de reproductor MP3 en serie (OPEN-SMART) debido a su lista de comandos UART fácil de usar. Además, me permitió agregar el modo de reproductor MP3 para reproducir todas las canciones iniciales, lo que convirtió el dispositivo en un accesorio intrigante para mi habitación :)

Después de completar mi diseño en una placa y probar el código, diseñé un PCB (notificador de fecha de lanzamiento de series de TV / anime) con una forma de teléfono retro única para crear un dispositivo de apariencia nueva y fácil de usar.

Muchas gracias a JLCPCB por patrocinar este proyecto.

Paso 1:Diseño y soldadura del PCB notificador de la fecha de lanzamiento de la serie de televisión / anime

Diseñé el PCB notificador de fecha de lanzamiento de series de TV / anime utilizando KiCad. Adjunté el archivo Gerber del PCB a continuación, por lo que si lo desea, puede solicitar este PCB a JLCPCB para replicar este proyecto y recibir una notificación cuando haya nuevos episodios de sus programas favoritos en el lanzamiento :)

En primer lugar, al usar un soldador, adjunté encabezados, botones pulsadores, resistencias de 220 Ω, el conector de alimentación, LED RGB de ánodo de 5 mm.

Lista de componentes en la PCB:

A1 (encabezados para Arduino Nano 33 IoT)

J1 (encabezados para reproductor MP3 en serie)

J2 (encabezados para DS3231, no obligatorios)

J3 (encabezados para la pantalla del Nokia 5110)

J4 (conector de alimentación)

D1 (LED RGB de ánodo de 5 mm)

K1, K2, K3, K4 (botones)

R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12 (resistencias de 220Ω)

Paso 2:configurar un servidor web LAMP con MariaDB en Raspberry Pi

Si es un novato en la programación con Raspberry Pi, puede inspeccionar instrucciones y tutoriales bien explicados en el sitio web oficial de Raspberry Pi.

Para ir al tutorial oficial de configuración de Raspberry Pi, haga clic aquí.

  • Abra una ventana de terminal seleccionando Accesorios> Terminal en el menú.
  • Instale el paquete apache2 escribiendo el siguiente comando en la terminal y presionando Enter:

sudo apt-get install apache2 -y

  • Para probar el servidor, abra Chromium seleccionando Internet> Navegador web Chromium en el menú e ingrese http:// localhost.
  • Si lo desea, también puede usar la dirección IP de su Raspberry Pi.

nombre de host -I

  • Instale el paquete PHP con el siguiente comando:
  • No olvide actualizar la Pi.

sudo apt-get update

sudo apt-get install php -y

  • Instale el servidor MySQL (MariaDB) y los paquetes PHP-MySQL ingresando el siguiente comando en la ventana de la terminal:

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

  • Para crear un nuevo usuario, ejecute el comando de instalación segura de MySQL en la ventana de la terminal.

sudo mysql_secure_installation

  • Se le pedirá Ingrese la contraseña actual para root (ingrese para ninguna): - presione Entrar.
  • Escriba Y y presione Entrar para Establecer contraseña de root .
  • Escriba bot en la Nueva contraseña: y presione Entrar.
  • Escriba Y para Eliminar usuarios anónimos .
  • Escriba Y para No permitir el inicio de sesión de root de forma remota .
  • Escriba Y para Eliminar la base de datos de prueba y acceder a ella .
  • Escriba Y para Recargar tablas de privilegios ahora .
  • Cuando haya terminado, verá este mensaje: ¡Todo listo! ¡y gracias por usar MariaDB!

  • Para crear una base de datos (tvseries) para guardar variables generadas por TVMAZE REST API, ejecute este comando MySQL en la ventana de terminal:

sudo mysql -uroot -p

  • Ingrese la contraseña de root: bot
  • Recibirá el mensaje Bienvenido al monitor MariaDB .
  • Siga las líneas a continuación después de MariaDB [(none)]> :mensaje para crear la tvseries base de datos en MariaDB:

crear tvseries de base de datos;

OTORGAR TODOS LOS PRIVILEGIOS EN tvseries. * A 'root' @ 'localhost' IDENTIFICADO POR 'bot';

PRIVILEGIOS DE FLUSH;

  • Salga del indicador MariaDB con Ctrl + D.

  • Para obtener datos de TVMAZE REST API simplemente usando file_get_contents () función en PHP, instale el paquete php-curl:

sudo apt-get install php-curl

  • Luego, reinicie el servidor apache para poder usar los paquetes instalados en el host local:

reinicio de apache2 del servicio sudo

Paso 3:Obtener información de TVMAZE REST API sobre tu serie / anime favorito

TVMAZE proporciona una API REST gratuita y fácil de usar, que permite a los usuarios buscar programas por nombre, fecha, número de episodio, etc. Puede inspeccionar los puntos finales y las consultas disponibles:

Vaya a TVMAZE REST API.

Usé el Episodio por fecha opción para recuperar todos los episodios de un programa determinado que se hayan emitido en una fecha específica.

Para poder obtener información por fechas de lanzamiento, debe buscar sus programas favoritos en TVMAZE y usar el ID de TV indicado en sus enlaces.

  • URL:/ shows /:id / episodiosbydate? date =:date
  • Fecha:formato ISO 8601
  • Ejemplo:http://api.tvmaze.com/shows/1/episodiosbydate?date=2013-07-01

Si hay un episodio transmitido en la fecha indicada, la API devuelve una serie de información completa del episodio.

De lo contrario, la API devuelve un HTTP 404.

A continuación, puedes inspeccionar mi lista de series / animes favoritos que creé para rastrear si hay un nuevo episodio de uno de ellos que esté en lanzamiento con mi proyecto.

Agregué The Late Late Show para probar mi código, ya que es un programa diario.

1) Una pieza

ID de TV: 1505

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

2) My Hero Academia

ID de TV: 13615

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

3) Westworld

ID de TV: 1371

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

4) Los Simpson

ID de TV: 83

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

5) The Late Late Show with James Corden

ID de TV: 2831

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

Paso 4:Desarrollar el Rastreador de fechas de lanzamiento de series de TV / Anime (aplicación) que se ejecuta en Raspberry Pi en PHP y crear la tabla de series para insertar datos

Desarrollé el rastreador de fechas de lanzamiento de series de TV / anime en PHP y expliqué el código fuente de la aplicación en la sección Explicación del código a continuación para aquellos que estén interesados.

Sin embargo, si no le gusta el desarrollo web con PHP, puede descargar la aplicación en Descargas, llamada TV-Series-Anime-Episode-Tracker.zip, y cargarla en Raspberry Pi sin sumergirse en la codificación PHP.

Subir :

Siguiendo los siguientes pasos, instale el rastreador de fechas de lanzamiento de series de TV / anime en el host local:

  • Descargue la aplicación, TV-Series-Anime-Episode-Tracker.zip, incluidos los archivos index.php y query.php.

  • Extraiga el archivo TV-Series-Anime-Episode-Tracker.zip.

  • Mueva la carpeta de la aplicación (TV-Series-Anime-Episode-Tracker) de Descargas al servidor (/ var / www / html) usando la terminal, ya que el servidor Apache es una ubicación protegida.

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

  • Vaya al Rastreador de fechas de lanzamiento de series de televisión / anime:

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

Funciones :

1) Después de la instalación, abra la aplicación para crear una tabla llamada series en la base de datos (tvseries). Cuando abre por primera vez el archivo index.php, la aplicación crea automáticamente la tabla denominada series e informa al usuario: ¡Tabla de base de datos creada!

2) Si la tabla de la base de datos (serie) se crea correctamente en la base de datos, la aplicación informa al usuario: ¡Tabla de base de datos encontrada!

3) Después de crear la tabla de la base de datos (serie), para insertar las variables requeridas para TVMAZE REST API para cada programa en su lista, siga los siguientes pasos:

  • Ejecute este comando de MySQL en la ventana de la terminal:

sudo mysql -uroot -p

  • Ingrese la contraseña de root: bot
  • Seleccione la tvseries base de datos:

USE tvseries;

  • Inserte las variables requeridas (nombre de la serie, ID de TV, estado) en la tabla de cada programa. La aplicación utiliza la variable de estado para notificar al usuario sin que se repita el lanzamiento de un nuevo episodio en una fecha determinada.

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

5) En query.php, la aplicación realiza solicitudes a TVMAZE REST API para detectar si se están lanzando nuevos episodios de programas en la base de datos. Si TVMAZE REST API devuelve una serie de información completa del episodio de un episodio publicado, la aplicación imprime información que puede recopilar Arduino Nano 33 IoT por una vez para evitar que vuelva a ocurrir.

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

% Series_Name% Season% Episode_Number% Episode_Name%

% The Late Late Show% 2020% 91% Jason Schwartzman, Alicia Key%

6) De lo contrario, la aplicación imprime ¡No se ha encontrado ninguna entrada!

Explicación del código :

1) index.php

  • Defina la configuración de conexión de la base de datos:"localhost", "root", "bot", "tvseries".
  • En checkDatabase () función, detecta si hay una tabla de base de datos en el nombre dado - serie.
  • En createTable () función, cree la tabla de la serie si no se encuentra en la base de datos e informe al usuario.

2) query.php

  • En la consulta class, defina la ruta a la API TVMAZE para realizar solicitudes.
  • En define_user () función, obtenga la configuración de conexión y el nombre de la tabla.
  • En check_ep_release_date () función, utilizando file_get_contents () función, detecta si un nuevo episodio está en lanzamiento para un ID de TV dado en la fecha actual. Cambie la variable de estado en la base de datos de Pendiente a Publicada si se publica un nuevo episodio para evitar que vuelva a ocurrir.
  • En track_db_entries () función, ejecute la check_ep_release_date () para cada programa registrado en la tabla de la base de datos - serie.

Paso 4.1:Ejecución de la aplicación web sin Raspberry Pi

Para los suscriptores de mi sitio web (TheAmplituhedron), desarrollé una versión gratuita de TV Series / Anime Release Date Tracker para aquellos que no tienen una Raspberry Pi ni quieren usar una como anfitrión para este proyecto.

Proporciona una interfaz fácil de usar para administrar la base de datos. Si desea usar esta interfaz con su proyecto en lugar de usar el terminal en Raspberry Pi para insertar datos, comuníquese conmigo.

Vaya a la aplicación:

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

Paso 5:Configuración de Arduino Nano 33 IoT

Si eres un novato en la programación con Arduino Nano 33 IoT:no te preocupes, es fácil de usar con Arduino IDE. Simplemente descargue los controladores necesarios, Arduino SAMD Core, como se explica aquí.

Para poder conectarse al WiFi a través de Arduino Nano 33 IoT, descargue la biblioteca WiFiNINA desde aquí.

Para imprimir texto y dibujar gráficos en la pantalla del Nokia 5110, descargue la biblioteca LCD5110_Basic desde aquí.

Usé el segundo puerto serial (Serial1) en el Arduino Nano 33 IoT para comunicarme con el Reproductor MP3 serial.

Puertos serie en Arduino Nano 33 IoT :

"El conector USB de la placa está conectado directamente a los pines del host USB del SAMD21. Este enrutamiento le permite usar el Arduino NANO 33 IoT como un periférico USB cliente (actuando como un mouse o un teclado conectado a la computadora ) o como un dispositivo host USB para que dispositivos como un mouse, teclado o un teléfono Android se puedan conectar al Arduino NANO 33 IoT. Este puerto también se puede usar como un puerto serial virtual usando el objeto Serial en el lenguaje de programación Arduino . Los pines RX0 y TX1 son un segundo puerto serie disponible como Serial1 ".

Entonces, Arduino Nano 33 IoT está listo para ejecutar el código del proyecto :)

Paso 6:Envío de comandos al reproductor MP3 en serie (OPEN-SMART)

Creé una lista de reproducción que consta de canciones de apertura de mi lista de series / animes favoritos en este proyecto:

1) Una pieza - Apertura | Escuche

2) My Hero Academia - Apertura | Escuche

3) Westworld - Apertura | Escuche

4) Los Simpson - Apertura | Escuche

5) The Late Late Show - Apertura | Escuche

Si lo desea, puede descargar mi lista de reproducción en una carpeta comprimida:opening_songs.zip.

Es fácil utilizar un reproductor MP3 en serie con Arduino Nano 33 IoT siempre que conozca los comandos UART necesarios para activar las funciones correctas. Usé un módulo de reproductor MP3 en serie con altavoz de OPEN-SMART. Por lo tanto, si tiene un reproductor MP3 en serie con un nombre de marca diferente, estos comandos que se muestran a continuación no funcionarán para usted.

Siga las instrucciones de la guía:

"El módulo es una especie de dispositivo reproductor MP3 simple que se basa en un chip de audio MP3 de alta calidad. Puede admitir formatos de archivo MP3 y WAV de frecuencia de muestreo de 8k Hz ~ 48k Hz. Hay una toma de tarjeta TF a bordo , para que pueda conectar la tarjeta micro SD que almacena archivos de audio. MCU puede controlar el estado de reproducción de MP3 enviando comandos al módulo a través del puerto UART, como cambiar canciones, cambiar el volumen y el modo de reproducción, etc. También puede depure el módulo a través de USB a módulo UART. Es compatible con Arduino / AVR / ARM / PIC. "

"Asegúrese de que su tarjeta micro SD esté formateada como FAT16 o FAT32 y que contenga algunas canciones. Debe crear las carpetas" 01 "y" 02 ", y poner algunas canciones con el nombre 001xxx.mp3 / 002xxx.mp3 / 003xxx.mp3 en ellos ".

En otras palabras, para poder ejecutar comandos con precisión, guarde sus canciones en una carpeta llamada '01' y agregue números consecutivos a los nombres de las canciones:001One Piece-Opening.mp3, 002My Hero Academia-Opening.mp3, etc.

Para enviar comandos UART al reproductor MP3 en serie con Arduino Nano 33 IoT, creé una función llamada send_command_to_MP3_player . Transfiere cada byte en el comando solicitado al Reproductor MP3 serial a través del segundo puerto serial en los pines RX0 y TX1 - Serial1 - dependiendo de la longitud del comando solicitado - 4, 5 o 6.

Como se muestra a continuación, separe el comando que desea enviar al Reproductor MP3 en serie por bytes - 0x7e. Todos los comandos comienzan con '7E' y terminan con 'EF'. El segundo byte es el número de bytes entre - '02', '03', '04'. A continuación, descargue el manual del reproductor MP3 en serie de OPEN-SMART para inspeccionar todos los comandos y obtener instrucciones más detalladas.

  // Defina los comandos requeridos del reproductor MP3. 
// Puede inspeccionar todos los comandos dados desde la página del proyecto:
// Seleccione el dispositivo de almacenamiento para la tarjeta TF
static int8_t select_SD_card [] ={0x7e, 0x03, 0X35, 0x01, 0xef}; // 7E 03 35 01 EF
// Reproduce la canción con el directorio:/01/001xxx.mp3
static int8_t play_song_1 [] ={0x7e, 0x04, 0x41, 0x00, 0x01, 0xef}; // 7E 04 41 00 01 EF
// Reproduce la canción con el directorio:/01/002xxx.mp3
static int8_t play_song_2 [] ={0x7e, 0x04, 0x41, 0x00, 0x02, 0xef}; // 7E 04 41 00 02 EF
// Reproduce la canción con el directorio:/01/003xxx.mp3
static int8_t play_song_3 [] ={0x7e, 0x04, 0x41, 0x00, 0x03, 0xef}; // 7E 04 41 00 03 EF
// Reproduce la canción con el directorio:/01/004xxx.mp3
static int8_t play_song_4 [] ={0x7e, 0x04, 0x41, 0x00, 0x04, 0xef}; // 7E 04 41 00 04 EF
// Reproduce la canción con el directorio:/01/005xxx.mp3
static int8_t play_song_5 [] ={0x7e, 0x04, 0x41, 0x00, 0x05, 0xef}; // 7E 04 41 00 05 EF
// Reproduce la canción.
static int8_t play [] ={0x7e, 0x02, 0x01, 0xef}; // 7E 02 01 EF
// Pausa la canción.
static int8_t pause [] ={0x7e, 0x02, 0x02, 0xef}; // 7E 02 02 EF
// Siguiente canción.
static int8_t next_song [] ={0x7e, 0x02, 0x03, 0xef}; // 7E 02 03 EF
// Canción anterior.
static int8_t previous_song [] ={0x7e, 0x02, 0x04, 0xef}; // 7E 02 04 EF

Paso 7:Programación de Arduino Nano 33 IoT

  • Incluya las bibliotecas necesarias.
  • Defina su configuración de WiFi:SSID y contraseña.
  • Ingrese la dirección IP de su Raspberry Pi.
  • Defina la ruta de la aplicación (query.php) en Raspberry Pi.
  • Inicialice la biblioteca cliente de Ethernet.
  • Defina la configuración de pantalla del Nokia 5110.
  • Defina los gráficos para los modos de pantalla relacionados:televisión y música.
  • Para crear diferentes gráficos (imágenes monocromas), vaya a Monochrome Image Converter.
  • Defina los comandos necesarios del reproductor MP3.
  • Defina las opciones y modos del menú utilizando valores booleanos volátiles.
  • Defina los botones de control y los pines LED RGB.
  • Inicie la comunicación en serie para el módulo del reproductor MP3 en serie en el segundo puerto en serie: Serial1 .
  • Conéctese a la red WiFi.
  • Verifique la conexión tanto en el monitor en serie como en la pantalla del Nokia 5110.
  • En read_buttons () función, obtenga datos de los botones de control:Derecha, Aceptar, Izquierda y Salir.
  • En change_menu_options () , aumente o disminuya el número de opción usando los botones Derecha e Izquierda.
  • En la interfaz () función, imprima la interfaz (menú).
  • Si el Init Tracker está seleccionado el modo, conéctese a la aplicación web llamada TV Series / Anime Release Date Tracker.
  • Si hay bytes entrantes disponibles, obtenga la respuesta de la aplicación web.
  • Usando endsWith () función, detecta si la respuesta tiene el símbolo de porcentaje (delimitador) o no.
  • Si se incluye, divida la cadena de respuesta por un delimitador predefinido de una manera sencilla. '%' (porcentaje) se define como el delimitador en este proyecto.
  • Obtenga información como subcadenas:nombre_de_serie, temporada, episodio, nombre_del_ episodio.
  • Imprime información y reproduce la canción de apertura de la serie / anime lanzados hasta que cese.
  • Espere hasta que se presione el botón Salir.
  • Si hay una respuesta en blanco, imprima No se detectó ningún episodio publicado :(
  • Dibuje el ícono de TV mientras cuenta hasta la nueva solicitud.
  • Espere hasta la próxima solicitud.
  • Si el modo de reproductor MP3 está seleccionado, dibuje el icono del reproductor de música. Controle el reproductor MP3 con los botones de control:derecha, izquierda, OK.
  • Si el modo de suspensión está seleccionado, active el modo de suspensión en 10 segundos e imprima los segundos restantes.

Connections and Adjustments

// 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 :)

Código

  • 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, SALIDA); pinMode (bluePin, SALIDA); 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); // esperar 10 segundos para la conexión: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); retraso (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); retraso (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); } retraso (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); retraso (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'); retraso (1000); } myGLCD.enableSleep(); Activated =true; while(Activated ==true){ // Color Pattern:adjustColor(255,0,0); retraso (500); adjustColor(0,255,0); retraso (500); adjustColor(0,0,255); retraso (500); adjustColor(255,255,0); retraso (500); adjustColor(80,0,80); retraso (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; retraso (100); // Depending on the selected option number, change boolean status. switch(selected){ case 1:TV =true; Music =false; Sleep =false; descanso; case 2:TV =false; Music =true; Sleep =false; descanso; case 3:TV =false; Music =false; Sleep =true; descanso; }}void adjustColor(int red, int green, int blue){ red =255 - red; green =255 - green; blue =255 - blue; analogWrite(redPin, red); analogWrite (greenPin, verde); 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();?>

Piezas y carcasas personalizadas

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

Esquemas


Proceso de manufactura

  1. Schaffner presenta una nueva serie de filtros RFI
  2. Mando a distancia universal Raspberry Pi
  3. Un trozo de Raspberry Pi
  4. Cycle Chaser
  5. Detector de ladrones Raspberry Pi
  6. Sensor de temperatura Raspberry Pi
  7. RASPBERRY PI HOME AUTOMATION
  8. NUEVA FRAMBUESA PI 3 MODELO B + CARACTERÍSTICAS Y COMPRA
  9. Robot de caja de CD Raspberry Pi
  10. Placa RaspiRobot V2
  11. Rover