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

Sistema automatizado de notificación de estrenos de series TV y anime

Componentes y materiales

Componente Cantidad
PCB personalizado JLCPCB 1
Arduino Nano 33 IoT 1
Raspberry Pi 3 Model B 1 o Raspberry Pi 4
Raspberry Pi 4 Model B 1 o Raspberry Pi 3
Pantalla Nokia 5110 (SparkFun) 1
Reproductor MP3 Serie OPEN-SMART 1
LED RGB difuso ánodo común 1
Tarjeta memoria Flash, SD 2
Resistencia 220 ohm 12
Pulsador 6x6x5 4
Jack DC 2.1mm PCB (TaydaElectronics) 1

Herramientas necesarias

Aplicaciones y servicios online

Sobre este proyecto

Descripción

Aunque existen multitud de aplicaciones web y móviles para seguir fechas de estreno de series favoritas, quise crear un dispositivo que me notifique cuando se estrena un nuevo episodio de una serie o anime de mi lista, desde cero - hardware y software - con diversas características.

Primero, creé una aplicación web - Rastreador de Fechas de Estreno de Series TV / Anime - en PHP para crear una lista de series/anime y recopilar información sobre sus fechas de estreno. Para ello, utilicé la API REST de TVMAZE que permite obtener información de episodios por fecha de estreno con precisión, sin pasos de codificación complejos. Luego, monté un servidor LAMP (con MariaDB) en Raspberry Pi para ejecutar la aplicación. Pero para quienes no tengan Raspberry Pi ni quieran usarla como host, publiqué una versión gratuita de la aplicación con interfaz amigable en mi web. También encontrarás el código fuente abajo.

Tras gestionar la transferencia de información con la aplicación web, si hay un nuevo episodio en estreno, decidí usar un Arduino Nano 33 IoT como placa de desarrollo para recopilar los datos generados por la aplicación. Más abajo verás cómo organicé la respuesta transferida usando un delimitador. Y para gestionar las funciones y modos implementados en el Nano 33 IoT, diseñé una interfaz de usuario (menú) con pantalla Nokia 5110 y pulsadores.

Por último, para ser notificado cuando se estrena un nuevo episodio de una serie en mi lista con su canción de apertura, usé un Módulo Reproductor MP3 Serie (OPEN-SMART) por su sencilla lista de comandos UART. Además, me permitió añadir el modo Reproductor MP3 para reproducir todas las aperturas, convirtiendo el dispositivo en un accesorio intrigante para mi habitación :)

Tras completar el diseño en protoboard y probar el código, diseñé un PCB (Notificador de Estrenos Series TV / Anime) con forma única de teléfono retro para crear un dispositivo novedoso y fácil de usar.

¡Gran agradecimiento a JLCPCB por patrocinar este proyecto!

Sistema automatizado de notificación de estrenos de series TV y anime

Paso 1: Diseño y soldadura del PCB Notificador Series TV / Anime

Diseñé el PCB usando KiCad. Adjunto el archivo Gerber abajo, así que si quieres puedes encargar este PCB a JLCPCB para replicar el proyecto y recibir notificaciones cuando hay nuevos episodios de tus series favoritas :)

Sistema automatizado de notificación de estrenos de series TV y anime

Primero, con soldador, coloqué headers, pulsadores, resistencias 220Ω, jack de alimentación, LED RGB ánodo común 5mm.

Lista de componentes en el PCB:

Sistema automatizado de notificación de estrenos de series TV y anime
Sistema automatizado de notificación de estrenos de series TV y anime
Sistema automatizado de notificación de estrenos de series TV y anime

Paso 2: Configurar servidor web LAMP con MariaDB en Raspberry Pi

Si eres novato programando con Raspberry Pi, consulta las instrucciones y tutoriales bien explicados en la web oficial de Raspberry Pi.

Tutorial oficial Raspberry Pi

Sistema automatizado de notificación de estrenos de series TV y anime
  1. Abre terminal: Accesorios > Terminal.
  2. Instala apache2: sudo apt-get install apache2 -y
  3. Prueba el servidor: abre Chromium (Internet > Chromium) y ve a https://localhost o usa la IP de la Pi: hostname -I
  4. Instala PHP: sudo apt-get update && sudo apt-get install php -y
  5. Instala MariaDB y PHP-MySQL: sudo apt-get install mariadb-server php-mysql -y
  6. Crea usuario seguro: sudo mysql_secure_installation
    • Contraseña root actual: Enter
    • Establecer contraseña root: Y, contraseña: bot
    • Eliminar usuarios anónimos: Y
    • Deshabilitar login root remoto: Y
    • Eliminar BD test: Y
    • Recargar privilegios: Y
  7. Crea base de datos tvseries:
    sudo mysql -uroot -p
    -- contraseña: bot
    CREATE DATABASE tvseries;
    GRANT ALL PRIVILEGES ON tvseries.* TO 'root'@'localhost' IDENTIFIED BY 'bot';
    FLUSH PRIVILEGES;
    Ctrl+D para salir
  8. Instala php-curl para file_get_contents(): sudo apt-get install php-curl
  9. Reinicia Apache: sudo service apache2 restart

Paso 3: Obtener información de TVMAZE REST API sobre tus series/anime favoritos

TVMAZE ofrece una API REST gratuita y fácil para buscar series por nombre, fecha, número de episodio, etc. TVMAZE REST API

Sistema automatizado de notificación de estrenos de series TV y anime

Usé la opción Episodio por Fecha para obtener todos los episodios de una serie que se emitieron en una fecha concreta.

Para obtener info por fechas de estreno, busca tus series favoritas en TVMAZE y usa el TV ID de sus enlaces.

Sistema automatizado de notificación de estrenos de series TV y anime

Si hay episodio emitido en esa fecha, la API devuelve array con info completa del episodio.

Sistema automatizado de notificación de estrenos de series TV y anime

Si no, devuelve HTTP 404.

Sistema automatizado de notificación de estrenos de series TV y anime

Mi lista de series/anime favoritas para rastrear:

  1. One Piece - TV ID: 1505 - tvmaze.com
  2. My Hero Academia - TV ID: 13615 - tvmaze.com
  3. Westworld - TV ID: 1371 - tvmaze.com
  4. The Simpsons - TV ID: 83 - tvmaze.com
  5. The Late Late Show with James Corden - TV ID: 2831 - tvmaze.com (show diario para test)

Paso 4: Desarrollar la aplicación Rastreador Series/Anime (PHP) en Raspberry Pi y crear tabla series

Desarrollé la aplicación en PHP y explico el código abajo. Si no te gusta desarrollo web PHP, descarga la app en Descargas - TV-Series-Anime-Episode-Tracker.zip - y súbela a la Pi sin tocar código PHP.

Instalación

  1. Descarga TV-Series-Anime-Episode-Tracker.zip (incluye index.php y query.php).
  2. Descomprime.
  3. Mueve la carpeta al servidor (ubicación protegida): sudo mv /home/pi/Downloads/TV-Series-Anime-Episode-Tracker/ /var/www/html/
  4. Accede: https://localhost/TV-Series-Anime-Episode-Tracker/

Características

  1. Al abrir index.php por primera vez, crea tabla series automáticamente y muestra "Database Table Created!".
  2. Si la tabla ya existe, muestra "Database Table Found!".
  3. Para insertar variables requeridas por TVMAZE API para cada serie (nombre, TV ID, estado), ejecuta en terminal:
    sudo mysql -uroot -p
    -- contraseña: bot
    USE tvseries;
    INSERT INTO `series` (`series_name`, `tv_id`, `status`) VALUES ('One Piece', '1505', 'Pending');
  4. En query.php, la app consulta TVMAZE API para detectar nuevos episodios. Si hay episodio emitido, imprime info parsable por Arduino Nano 33 IoT una sola vez (evita recurrencia):
    https://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%
  5. Si no hay episodio, imprime No Entry Found!.

Explicación del código

1) index.php
2) query.php

Paso 4.1: Ejecutar aplicación web sin Raspberry Pi

Para suscriptores de mi web (TheAmplituhedron), desarrollé versión gratuita del Rastreador para quienes no tengan Pi ni quieran usarla como host. Ofrece interfaz amigable para gestionar la BD. Si quieres usar esta interfaz con tu proyecto en lugar de terminal en Pi, contáctame.

Accede: Aplicación web online

Sistema automatizado de notificación de estrenos de series TV y anime

Paso 5: Configurar Arduino Nano 33 IoT

Si eres novato con Nano 33 IoT: no te preocupes, es simple con Arduino IDE. Descarga drivers - Arduino SAMD Core - como se explica aquí.

Sistema automatizado de notificación de estrenos de series TV y anime

Para conectar WiFi, descarga librería WiFiNINA aquí.

Sistema automatizado de notificación de estrenos de series TV y anime

Para texto y gráficos en Nokia 5110, descarga librería LCD5110_Basic aquí.

Usé el segundo puerto serie (Serial1) en Nano 33 IoT para comunicar con el Reproductor MP3 Serie.

Puertos serie en Arduino Nano 33 IoT:

"El conector USB está conectado directamente a los pines USB host del SAMD21. Esto permite usar el Nano 33 IoT como periférico USB cliente (ratón/teclado) o host USB para dispositivos como ratón, teclado, teléfono Android. Este puerto también sirve como puerto serie virtual usando objeto Serial. Los pines RX0 y TX1 son un segundo puerto serie disponible como Serial1."

¡Arduino Nano 33 IoT listo para ejecutar el código del proyecto! :)

Paso 6: Enviar comandos al Reproductor MP3 Serie (OPEN-SMART)

Creé una lista de reproducción con aperturas de mis series/anime favoritos:

  1. One Piece - Opening
  2. My Hero Academia - Opening
  3. Westworld - Opening
  4. The Simpsons - Opening
  5. The Late Late Show - Opening

Puedes descargar mi playlist en opening_songs.zip.

Es fácil usar el Reproductor MP3 Serie con Arduino Nano 33 IoT si conoces los comandos UART. Usé módulo con altavoz OPEN-SMART; si tienes otra marca, estos comandos no funcionarán.

Instrucciones del fabricante:

"El módulo es un reproductor MP3 simple basado en chip de audio de alta calidad. Soporta MP3 y WAV 8kHz~48kHz. Tiene socket TF para micro SD. El MCU controla reproducción enviando comandos vía UART: cambiar canción, volumen, modo, etc. También depurable vía USB-UART. Compatible con Arduino/AVR/ARM/PIC."

"Asegúrate que tu micro SD esté formateada FAT16/FAT32 y tenga canciones. Crea carpetas '01' y '02', y pon canciones como 001xxx.mp3 / 002xxx.mp3 / 003xxx.mp3."

Para ejecutar comandos con precisión, guarda canciones en carpeta '01' con números consecutivos: 001One Piece-Opening.mp3, 002My Hero Academia-Opening.mp3, etc.

Sistema automatizado de notificación de estrenos de series TV y anime

Para enviar comandos UART, creé función send_command_to_MP3_player. Transfiere cada byte del comando al reproductor vía segundo puerto serie (RX0/TX1) - Serial1 - según longitud del comando (4, 5 o 6 bytes).

Separar comando por bytes - 0x7e. Todos empiezan con '7E' y terminan con 'EF'. Segundo byte es número de bytes intermedios - '02', '03', '04'. Descarga manual del Reproductor MP3 Serie OPEN-SMART para ver todos los comandos.

// Comandos MP3 Player requeridos
// Seleccionar almacenamiento a tarjeta TF
static int8_t select_SD_card[] = {0x7e, 0x03, 0X35, 0x01, 0xef}; // 7E 03 35 01 EF
// Reproducir canción en directorio: /01/001xxx.mp3
static int8_t play_song_1[] = {0x7e, 0x04, 0x41, 0x00, 0x01, 0xef}; // 7E 04 41 00 01 EF
// Reproducir canción en directorio: /01/002xxx.mp3
static int8_t play_song_2[] = {0x7e, 0x04, 0x41, 0x00, 0x02, 0xef}; // 7E 04 41 00 02 EF
// Reproducir canción en directorio: /01/003xxx.mp3
static int8_t play_song_3[] = {0x7e, 0x04, 0x41, 0x00, 0x03, 0xef}; // 7E 04 41 00 03 EF
// Reproducir canción en directorio: /01/004xxx.mp3
static int8_t play_song_4[] = {0x7e, 0x04, 0x41, 0x00, 0x04, 0xef}; // 7E 04 41 00 04 EF
// Reproducir canción en directorio: /01/005xxx.mp3
static int8_t play_song_5[] = {0x7e, 0x04, 0x41, 0x00, 0x05, 0xef}; // 7E 04 41 00 05 EF
// Reproducir
static int8_t play[] = {0x7e, 0x02, 0x01, 0xef}; // 7E 02 01 EF
// Pausar
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
Sistema automatizado de notificación de estrenos de series TV y anime

Paso 7: Programar Arduino Nano 33 IoT

Sistema automatizado de notificación de estrenos de series TV y anime
Sistema automatizado de notificación de estrenos de series TV y anime
Sistema automatizado de notificación de estrenos de series TV y anime
Sistema automatizado de notificación de estrenos de series TV y anime
Sistema automatizado de notificación de estrenos de series TV y anime
Sistema automatizado de notificación de estrenos de series TV y anime
Sistema automatizado de notificación de estrenos de series TV y anime

Conexiones y ajustes

// Conexiones
// 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 (Opcional para Nano y No Requerido para Nano 33 IoT)
// A4 --------------------------- SDA
// A5 --------------------------- SCL

Tras terminar y subir código al Nano 33 IoT, conecté todos los componentes a la placa vía headers.

También incluí ranura para módulo RTC DS3231 por si se quiere cambiar Nano 33 IoT por Nano normal. Pero necesitarás introducir fechas de estreno manualmente para cada serie en el Nano sin poder obtener datos de la app web para crear cuenta regresiva con RTC.

Sistema automatizado de notificación de estrenos de series TV y anime

Nota: Puedes conectar altavoz o auriculares al Reproductor MP3 Serie para escuchar la playlist. Yo conecté el altavoz incluido con el módulo OPEN-SMART.

Sistema automatizado de notificación de estrenos de series TV y anime
Sistema automatizado de notificación de estrenos de series TV y anime

Modos y características

1) Conexión WiFi

Mientras intenta conectar, muestra Waiting... Attempting to connect to WiFi.

Sistema automatizado de notificación de estrenos de series TV y anime

Tras conexión exitosa: Connected to WiFi!!!

Sistema automatizado de notificación de estrenos de series TV y anime

2) Menú principal

Muestra interfaz con modos: A.Init Tracker, B.MP3 Player, C.Sleep. Cambia con Derecha/Izquierda, selecciona con OK.

Sistema automatizado de notificación de estrenos de series TV y anime

A. Init Tracker

A.1) Tras seleccionar, intenta conectar a localhost en Raspberry Pi. Si éxito: Connected to the server!!!; si fallo: Connection Error!!!

Sistema automatizado de notificación de estrenos de series TV y anime
Sistema automatizado de notificación de estrenos de series TV y anime

A.2) Si la app envía datos de episodio estrenado de serie registrada:

Colores asignados:

Mantiene info y color hasta pulsar Salir. Notifica una sola vez por episodio para evitar recurrencia.

Sistema automatizado de notificación de estrenos de series TV y anime

A.3) Tras pulsar Salir, dibuja icono TV mientras espera siguiente petición.

Sistema automatizado de notificación de estrenos de series TV y anime

A.4) Si no hay episodio estrenado: No Released Episode Detected :( y dibuja icono TV hasta siguiente petición.

Sistema automatizado de notificación de estrenos de series TV y anime
Sistema automatizado de notificación de estrenos de series TV y anime

A.5) Vuelve al menú si se pulsa Salir mostrando icono TV.

B. MP3 Player

Función subsidiaria y divertida para convertir el dispositivo en accesorio intrigante.

B.1) Al seleccionar, dibuja icono nota musical y permite reproducir todas las aperturas con botones:

B.2) Vuelve al menú con botón Salir.

Sistema automatizado de notificación de estrenos de series TV y anime
Sistema automatizado de notificación de estrenos de series TV y anime

C. Sleep

C.1) Al seleccionar, activa modo sleep en 10 segundos e imprime cuenta regresiva.

Sistema automatizado de notificación de estrenos de series TV y anime
Sistema automatizado de notificación de estrenos de series TV y anime

C.2) En sleep, aplica patrón de colores al RGB como luz nocturna.

Sistema automatizado de notificación de estrenos de series TV y anime
Sistema automatizado de notificación de estrenos de series TV y anime

C.3) Vuelve al menú con botón Salir.

Vídeos y conclusión

Tras completar todos los pasos, fijé el dispositivo a mi estantería con pistola de silicona. ¡Funciona estupendamente! :)

Sistema automatizado de notificación de estrenos de series TV y anime
Sistema automatizado de notificación de estrenos de series TV y anime

Código

Series_Release_Date_Notifier.ino (Arduino)

 //////////////////////////////////////////////////// // 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 <SPI.h> #include <WiFiNINA.h> #include <LCD5110_Basic.h> 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 library WiFiClient 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 card static int8_t select_SD_card[] = {0x7e, 0x03, 0X35, 0x01, 0xef}; // 7E 03 35 01 EF // Play the song with the directory: /01/001xxx.mp3 static 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.mp3 static 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.mp3 static 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.mp3 static 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.mp3 static 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); // wait 10 seconds for connection: 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); delay(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); delay(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); delay(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'); delay(1000); } myGLCD.enableSleep(); Activated = true; while(Activated == true){ // Color Pattern: adjustColor(255,0,0); delay(500); adjustColor(0,255,0); delay(500); adjustColor(0,0,255); delay(500); adjustColor(255,255,0); delay(500); adjustColor(80,0,80); delay(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<len;i++){ Serial1.write(command[i]); Serial.print(command[i], HEX); } delay(1000); } void interface(){ // Define options. myGLCD.print("Menu Options :", 0, 0); myGLCD.print("A.Init Tracker", 0, 16); myGLCD.print("B.MP3 Player", 0, 24); myGLCD.print("C.Sleep", 0, 32); } void change_menu_options(){ // Increase or decrease the option number using Right and Left buttons. if(Right == true) selected++; if(Left == true) selected--; if(selected < 0) selected = 3; if(selected > 3) selected = 1; delay(100); // Depending on the selected option number, change boolean status. switch(selected){ case 1: TV = true; Music = false; Sleep = false; break; case 2: TV = false; Music = true; Sleep = false; break; case 3: TV = false; Music = false; Sleep = true; break; } } 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.php (PHP)

<?php $conn_database = mysqli_connect("localhost", "root", "bot", "tvseries"); function checkDatabase($table, $conn){ $sql = "SHOW TABLES FROM `tvseries` LIKE '$table'"; $check = mysqli_num_rows(mysqli_query($conn, $sql)); return ($check > 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.php (PHP)

<?php error_reporting(0); class query{ const ROOT = "https://api.tvmaze.com/shows/"; const PATH = "/episodesbydate?date="; public $conn, $table_name; public function define_user($conn, $table_name){ $this->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(); ?>

Partes personalizadas y cajas

Esquemáticos

Sistema automatizado de notificación de estrenos de series TV y anime
Sistema automatizado de notificación de estrenos de series TV y anime
Sistema automatizado de notificación de estrenos de series TV y anime
Sistema automatizado de notificación de estrenos de series TV y anime

Proceso de manufactura

  1. Construya un Mando Universal Profesional para Raspberry Pi con LIRC
  2. Conversión de RF a CC con Raspberry Pi: Construcción y Solución de Problemas de un Detector de Envolvente
  3. Cycle Chaser: Transforme su Bici en un Espectáculo de Luces Nocturno con Raspberry Pi
  4. Construya un Detector de Ladrones Basado en Raspberry Pi – Guía Paso a Paso
  5. Monitor de temperatura casero con Raspberry Pi, MCP9808, InfluxDB y Grafana
  6. Construye sistema domótico con Raspberry Pi para control remoto
  7. Raspberry Pi 3 B+ – Características Actualizadas, Especificaciones y Guía de Compra
  8. Robot DIY inspirado en Wall‑E con Raspberry Pi y caja de CD
  9. Placa RasPiRobot Board V2: Convierte tu Raspberry Pi en un Controlador de Robot Potente
  10. Construye un Rover con Windows IoT Core en Raspberry Pi 2 – Guía de Principiante a Avanzado
  11. Schaffner Lanza Filtros RFI Avanzados FN 9262/9266 con IEC C14 PEMs para Aplicaciones Médicas y de Consumo