Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Notificateur de date de sortie pour les séries télévisées/animés pour les nouveaux épisodes

Composants et fournitures

JLCPCB PCB personnalisé
× 1
Arduino Nano 33 IoT
× 1
Raspberry Pi 3 Modèle B
Raspberry Pi 3 ou Raspberry Pi 4
× 1
Raspberry Pi 4 Modèle B
Raspberry Pi 3 ou Raspberry Pi 4
× 1
Écran SparkFun Nokia 5110
× 1
Lecteur MP3 série par OPEN-SMART
× 1
Anode commune diffuse RVB
× 1
Carte mémoire Flash, carte SD
× 2
Résistance 220 ohm
× 12
Bouton poussoir 6x6x5
× 4
TaydaElectronics DC POWER JACK 2.1MM BARREL-TYPE PCB MOUNT
× 1

Outils et machines nécessaires

Fer à souder (générique)
Pistolet à colle chaude (générique)

Applications et services en ligne

Arduino IDE
KiCad
NotePad++

À propos de ce projet

Descriptif

Bien qu'il existe des myriades d'applications Web et mobiles pour suivre les dates de sortie de mes émissions préférées, je voulais créer un appareil qui m'avertit lorsqu'un nouvel épisode d'une série ou d'un anime de ma liste sort de zéro - matériel et logiciel - avec diverses fonctionnalités.

Tout d'abord, j'ai créé une application web - TV Series / Anime Release Date Tracker - en PHP pour créer une liste de séries/animes et recueillir des informations sur leurs dates de sortie. À cet égard, j'ai utilisé l'API TVMAZE REST qui permet à l'application d'obtenir des informations sur les épisodes par date de sortie avec précision, bien que sans étapes de codage diverses et déroutantes. Ensuite, j'ai configuré un serveur LAMP (avec MariaDB) sur Raspberry Pi pour exécuter l'application. Mais, pour ceux qui n'ont pas de Raspberry Pi et ne veulent pas en utiliser un comme hôte, j'ai publié une version gratuite de l'application avec une interface conviviale sur mon site Web. Vous pouvez également trouver le code source de l'application ci-dessous.

Après avoir effectué le transfert d'informations avec l'application Web, s'il y a un nouvel épisode à la sortie, j'ai décidé d'utiliser un Arduino Nano 33 IoT comme carte de développement pour rassembler les données générées par l'application. Vous pouvez trouver plus d'informations ci-dessous sur la façon dont j'ai trié la réponse transférée par l'application en utilisant un délimiteur. Et, pour gérer les fonctionnalités et les modes que j'ai implémentés sur le Nano 33 IoT, j'ai conçu une interface utilisateur (menu) avec un écran Nokia 5110 et des boutons-poussoirs.

Enfin, pour être informé de la sortie d'un nouvel épisode d'une émission de ma liste avec sa chanson d'ouverture, j'ai utilisé un module de lecteur MP3 série (OPEN-SMART) en raison de sa liste de commandes UART simple à utiliser. De plus, cela m'a permis d'ajouter le mode lecteur MP3 pour lire toutes les chansons d'ouverture, ce qui a transformé l'appareil en un accessoire intrigant pour ma chambre :)

Après avoir terminé ma conception sur une maquette et testé le code, j'ai conçu un PCB (TV Series / Anime Release Date Notifier) ​​avec une forme de téléphone rétro unique pour créer un tout nouvel appareil facile à utiliser.

Un grand merci à JLCPCB pour le parrainage de ce projet.

Étape 1 :Conception et soudure du circuit imprimé de notification de la date de sortie de la série télévisée / de l'anime

J'ai conçu le PCB du notificateur de la date de sortie des séries télévisées / anime en utilisant KiCad. J'ai joint le fichier Gerber du PCB ci-dessous, donc si vous le souhaitez, vous pouvez commander ce PCB auprès de JLCPCB pour répliquer ce projet afin d'être averti lorsqu'il y aura de nouveaux épisodes de vos émissions préférées à la sortie :)

Tout d'abord, en utilisant un fer à souder, j'ai attaché des en-têtes, des boutons-poussoirs, des résistances 220Ω, la prise d'alimentation, une LED RVB anode 5 mm.

Liste des composants sur le PCB :

A1 (En-têtes pour Arduino Nano 33 IoT)

J1 (En-têtes pour lecteur MP3 série)

J2 (En-têtes pour DS3231 - Non requis)

J3 (En-têtes pour écran Nokia 5110)

J4 (prise d'alimentation)

D1 (LED RVB à anode 5 mm)

K1, K2, K3, K4 (boutons-poussoirs)

R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12 (résistances 220Ω)

Étape 2 :Configuration d'un serveur Web LAMP avec MariaDB sur Raspberry Pi

Si vous êtes novice en programmation avec Raspberry Pi, vous pouvez consulter des instructions et des tutoriels bien expliqués sur le site officiel de Raspberry Pi.

Pour accéder au didacticiel officiel de configuration du Raspberry Pi, cliquez ici.

  • Ouvrez une fenêtre de terminal en sélectionnant Accessoires > Terminal dans le menu.
  • Installez le package apache2 en tapant la commande suivante dans le terminal et en appuyant sur Entrée :

sudo apt-get install apache2 -y

  • Pour tester le serveur, ouvrez Chromium en sélectionnant Internet > Navigateur Web Chromium dans le menu et saisissez http://localhost.
  • Si vous le souhaitez, vous pouvez également utiliser l'adresse IP de votre Raspberry Pi.

nom d'hôte -I

  • Installez le package PHP avec la commande suivante :
  • N'oubliez pas de mettre à jour le Pi.

sudo apt-get update

sudo apt-get install php -y

  • Installez les packages MySQL Server (MariaDB) et PHP-MySQL en entrant la commande suivante dans la fenêtre du terminal :

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

  • Pour créer un nouvel utilisateur, exécutez la commande d'installation sécurisée MySQL dans la fenêtre du terminal.

sudo mysql_secure_installation

  • Il vous sera demandé Entrez le mot de passe actuel pour root (entrez pour aucun) : — appuyez sur Entrée.
  • Tapez Y et appuyez sur Entrée pour Définir le mot de passe root .
  • Saisissez bot au Nouveau mot de passe : invite et appuyez sur Entrée.
  • Tapez Y pour Supprimer les utilisateurs anonymes .
  • Tapez Y pour Interdire la connexion root à distance .
  • Tapez Y pour Supprimer la base de données de test et y accéder .
  • Tapez Y pour Recharger les tables de privilèges maintenant .
  • Une fois terminé, vous verrez ce message - C'est terminé ! et merci d'avoir utilisé MariaDB !

  • Pour créer une base de données (tvseries) pour enregistrer les variables générées par l'API TVMAZE REST, exécutez cette commande MySQL dans la fenêtre du terminal :

sudo mysql -uroot -p

  • Entrez le mot de passe root - bot
  • Vous serez accueilli par le message Bienvenue sur le moniteur MariaDB .
  • Suivez les lignes ci-dessous après MariaDB [(none)]> :invite à créer la série télévisée base de données dans MariaDB :

créer une base de données de séries télévisées ;

ACCORDER TOUS LES PRIVILÈGES SUR tvseries.* À 'root'@'localhost' IDENTIFIÉ PAR 'bot' ;

PRIVILÈGES DE RINÇAGE ;

  • Quittez l'invite MariaDB avec Ctrl + D.

  • Pour obtenir des données de l'API REST TVMAZE en utilisant simplement file_get_contents() fonction en PHP, installez le package php-curl :

sudo apt-get install php-curl

  • Ensuite, redémarrez le serveur Apache pour pouvoir utiliser les packages installés sur le localhost :

redémarrage sudo service apache2

Étape 3 :Obtenir des informations de l'API REST TVMAZE sur votre série/anime préféré

TVMAZE fournit une API REST gratuite et facile à utiliser, qui permet aux utilisateurs de rechercher des émissions par nom, date, numéro d'épisode, etc. Vous pouvez inspecter les points de terminaison et les requêtes disponibles :

Accédez à l'API REST TVMAZE.

J'ai utilisé l'Épisode par date option pour récupérer tous les épisodes d'une émission donnée qui ont été diffusés à une date spécifique.

Pour pouvoir obtenir des informations par dates de sortie, vous devez rechercher vos émissions préférées sur TVMAZE et utiliser l'ID TV indiqué dans leurs liens.

  • URL :/shows/:id/episodesbydate?date=:date
  • Date :format ISO 8601
  • Exemple :http://api.tvmaze.com/shows/1/episodesbydate?date=2013-07-01

S'il y a un épisode diffusé à la date donnée, l'API renvoie un tableau d'informations complètes sur l'épisode.

Sinon, l'API renvoie un HTTP 404.

Ci-dessous, vous pouvez inspecter ma liste de séries/animes préférés que j'ai créés pour savoir s'il y a un nouvel épisode de l'un d'entre eux qui sort avec mon projet.

J'ai ajouté The Late Late Show pour tester mon code car c'est une émission quotidienne.

1) Une pièce

ID TV :1505

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

2) My Hero Academia

ID TV :13615

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

3) Westworld

Identifiant du téléviseur :1371

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

4) Les Simpson

ID TV :83

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

5) Le Late Late Show avec James Corden

ID TV :2831

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

Étape 4 :Développer le suivi de la date de sortie des séries télévisées / anime (application) fonctionnant sur Raspberry Pi en PHP et créer la table des séries pour insérer des données

J'ai développé le suivi des dates de sortie des séries télévisées / anime en PHP et expliqué le code source de l'application dans la section Explication du code ci-dessous pour ceux qui sont intéressés.

Cependant, si vous n'aimez pas le développement Web avec PHP, vous pouvez télécharger l'application dans Téléchargements - nommée TV-Series-Anime-Episode-Tracker.zip - et la télécharger sur Raspberry Pi sans plonger dans le codage PHP.

Télécharger  :

En suivant les étapes suivantes, installez le suivi de la date de sortie des séries télévisées / anime sur l'hôte local :

  • Téléchargez l'application - Série TV-Anime-Episode-Tracker.zip - y compris les fichiers index.php et query.php.

  • Extraire le fichier TV-Series-Anime-Episode-Tracker.zip.

  • Déplacez le dossier de l'application (TV-Series-Anime-Episode-Tracker) de Téléchargements vers le serveur (/var/www/html) en utilisant le terminal car le serveur Apache est un emplacement protégé.

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

  • Accéder à l'outil de suivi des dates de sortie des séries télévisées/animes :

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

Caractéristiques  :

1) Après l'installation, ouvrez l'application pour créer une table nommée series dans la base de données (tvseries). Lorsque vous ouvrez pour la première fois le fichier index.php, l'application crée automatiquement la table nommée series et informe l'utilisateur - Table de base de données créée !

2) Si la table de base de données (série) est créée avec succès dans la base de données, l'application en informe l'utilisateur - Table de base de données trouvée !

3) Après avoir créé la table de base de données (série), pour insérer les variables requises pour l'API TVMAZE REST pour chaque émission de votre liste, procédez comme suit :

  • Exécutez cette commande MySQL dans la fenêtre du terminal :

sudo mysql -uroot -p

  • Entrez le mot de passe root - bot
  • Sélectionnez la série télévisée base de données :

UTILISER les séries télévisées ;

  • Insérez les variables requises - nom de la série, ID TV, statut - dans le tableau pour chaque émission. La variable d'état est utilisée par l'application pour avertir l'utilisateur sans se reproduire lorsqu'un nouvel épisode sort à une date donnée.

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

5) Sur le query.php, l'application fait des requêtes à TVMAZE REST API pour détecter si de nouveaux épisodes d'émissions dans la base de données sont en sortie. Si l'API TVMAZE REST renvoie un tableau d'informations complètes sur l'épisode d'un épisode publié, l'application imprime les informations pouvant être collationnées par Arduino Nano 33 IoT pour une fois afin d'éviter une récurrence.

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) Sinon, l'application imprime Aucune entrée trouvée !

Explication du code  :

1) index.php

  • Définissez les paramètres de connexion à la base de données - "localhost", "root", "bot", "tvseries".
  • Dans la checkDatabase() fonction, détecte s'il existe une table de base de données dans le nom donné - série.
  • Dans le createTable() fonction, créez la table des séries si elle n'est pas trouvée dans la base de données et informez l'utilisateur.

2) requête.php

  • Dans la requête class, définissez le chemin vers l'API TVMAZE pour faire des requêtes.
  • Dans le define_user() fonction, obtenez les paramètres de connexion et le nom de la table.
  • Dans le check_ep_release_date() fonction, en utilisant le file_get_contents() fonction, détectez si un nouvel épisode est en cours de sortie pour un ID TV donné à la date actuelle. Modifiez la variable d'état dans la base de données de En attente à Sorti si un nouvel épisode est en cours de sortie pour éviter qu'il ne se reproduise.
  • Dans le track_db_entries() fonction, exécutez la check_ep_release_date() pour chaque spectacle inscrit dans la table de base de données - séries.

Étape 4.1 :Exécuter une application Web sans Raspberry Pi

Pour les abonnés de mon site Web (TheAmplituhedron), j'ai développé une version gratuite de la série TV / Anime Release Date Tracker pour ceux qui n'ont pas de Raspberry Pi et ne veulent pas en utiliser un comme hôte pour ce projet.

Il fournit une interface conviviale pour la gestion de la base de données. Si vous souhaitez utiliser cette interface avec votre projet au lieu d'utiliser le terminal sur Raspberry Pi pour insérer des données, veuillez me contacter.

Accédez à l'application :

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

Étape 5 :Configuration de l'Arduino Nano 33 IoT

Si vous êtes novice en programmation avec Arduino Nano 33 IoT :ne vous inquiétez pas, il est simple à utiliser avec Arduino IDE. Téléchargez simplement les pilotes requis - Arduino SAMD Core - comme expliqué ici.

Pour pouvoir vous connecter au WiFi via Arduino Nano 33 IoT, téléchargez la bibliothèque WiFiNINA à partir d'ici.

Pour imprimer du texte et dessiner des graphiques sur l'écran Nokia 5110, téléchargez la bibliothèque LCD5110_Basic à partir d'ici.

J'ai utilisé le deuxième port série (Serial1) sur l'IoT Arduino Nano 33 pour communiquer avec le lecteur MP3 série.

Ports série sur l'IdO Arduino Nano 33  :

"Le connecteur USB de la carte est directement connecté aux broches hôte USB du SAMD21. Ce routage vous permet d'utiliser l'Arduino NANO 33 IoT comme périphérique USB client (agissant comme une souris ou un clavier connecté à l'ordinateur ) ou en tant que périphérique hôte USB afin que des périphériques tels qu'une souris, un clavier ou un téléphone Android puissent être connectés à l'IoT Arduino NANO 33. Ce port peut également être utilisé comme port série virtuel à l'aide de l'objet Serial dans le langage de programmation Arduino Les broches RX0 et TX1 sont un deuxième port série disponible en tant que Serial1."

Ensuite, Arduino Nano 33 IoT est prêt à exécuter le code du projet :)

Étape 6 :Envoi de commandes au lecteur MP3 série (OPEN-SMART)

J'ai créé une liste de lecture composée de chansons d'ouverture de ma liste de séries/animes préférés dans ce projet :

1) One Piece - Ouverture | Écouter

2) My Hero Academia - Ouverture | Écouter

3) Westworld - Ouverture | Écouter

4) Les Simpson - Ouverture | Écouter

5) Le Late Late Show - Ouverture | Écouter

Si vous le souhaitez, vous pouvez télécharger ma liste de lecture dans un dossier zippé - opening_songs.zip.

Il est facile d'utiliser un lecteur MP3 série avec Arduino Nano 33 IoT tant que vous connaissez les commandes UART requises pour déclencher les bonnes fonctions. J'ai utilisé un module Serial MP3 Player avec haut-parleur d'OPEN-SMART. Donc, si vous avez un lecteur MP3 série avec un nom de marque différent, les commandes ci-dessous ne fonctionneront pas pour vous.

Suivez les instructions du guide :

"Le module est une sorte de lecteur MP3 simple basé sur une puce audio MP3 de haute qualité. Il peut prendre en charge les formats de fichier MP3 et WAV à fréquence d'échantillonnage de 8k Hz ~ 48k Hz. Il y a une prise de carte TF à bord , vous pouvez donc brancher la carte micro SD qui stocke les fichiers audio. MCU peut contrôler l'état de lecture MP3 en envoyant des commandes au module via le port UART, telles que changer de chanson, changer le volume et le mode de lecture, etc. Vous pouvez également déboguer le module via le module USB vers UART. Il est compatible avec Arduino/AVR/ARM/PIC."

"Assurez-vous que votre carte micro SD est formatée en FAT16 ou FAT32 et qu'elle contient des chansons. Vous devez créer les dossiers "01" et "02", et mettre quelques chansons avec le nom 001xxx.mp3 / 002xxx.mp3 / 003xxx.mp3 en eux."

En d'autres termes, pour pouvoir exécuter des commandes avec précision, enregistrez vos chansons dans un dossier nommé "01" et ajoutez des numéros consécutifs aux noms de chansons - 001One Piece-Opening.mp3, 002My Hero Academia-Opening.mp3, etc.

Pour envoyer des commandes UART au lecteur MP3 série avec Arduino Nano 33 IoT, j'ai créé une fonction nommée send_command_to_MP3_player . Il transfère chaque octet de la commande demandée au lecteur MP3 série via le deuxième port série sur les broches RX0 et TX1 - Serial1 - selon la longueur de la commande demandée - 4, 5 ou 6.

Comme indiqué ci-dessous, séparez la commande que vous souhaitez envoyer au lecteur MP3 série par octets - 0x7e. Toutes les commandes commencent par « 7E » et se terminent par « EF ». Le deuxième octet est le nombre d'octets intermédiaires - '02', '03', '04'. Ci-dessous, téléchargez le manuel du lecteur MP3 série par OPEN-SMART pour inspecter toutes les commandes et obtenir des instructions plus détaillées.

// Définissez les commandes du lecteur MP3 requises.
// Vous pouvez inspecter toutes les commandes données à partir de la page du projet :
// Sélectionnez le périphérique de stockage sur la carte TF
static int8_t select_SD_card[] ={0x7e, 0x03, 0X35, 0x01, 0xef} ; // 7E 03 35 01 EF
// Joue la chanson avec le répertoire :/01/001xxx.mp3
static int8_t play_song_1[] ={0x7e, 0x04, 0x41, 0x00, 0x01, 0xef}; // 7E 04 41 00 01 EF
// Joue la chanson avec le répertoire :/01/002xxx.mp3
static int8_t play_song_2[] ={0x7e, 0x04, 0x41, 0x00, 0x02, 0xef}; // 7E 04 41 00 02 EF
// Joue la chanson avec le répertoire :/01/003xxx.mp3
static int8_t play_song_3[] ={0x7e, 0x04, 0x41, 0x00, 0x03, 0xef}; // 7E 04 41 00 03 EF
// Joue la chanson avec le répertoire :/01/004xxx.mp3
static int8_t play_song_4[] ={0x7e, 0x04, 0x41, 0x00, 0x04, 0xef}; // 7E 04 41 00 04 EF
// Joue la chanson avec le répertoire :/01/005xxx.mp3
static int8_t play_song_5[] ={0x7e, 0x04, 0x41, 0x00, 0x05, 0xef}; // 7E 04 41 00 05 EF
// Joue la chanson.
static int8_t play[] ={0x7e, 0x02, 0x01, 0xef}; // 7E 02 01 EF
// Pause de la chanson.
static int8_t pause[] ={0x7e, 0x02, 0x02, 0xef}; // 7E 02 02 EF
// Chanson suivante.
static int8_t next_song[] ={0x7e, 0x02, 0x03, 0xef} ; // 7E 02 03 EF
// Chanson précédente.
static int8_t previous_song[] ={0x7e, 0x02, 0x04, 0xef} ; // 7E 02 04 EF

Étape 7 :Programmation de l'IoT Arduino Nano 33

  • Inclure les bibliothèques requises.
  • Définissez vos paramètres Wi-Fi - SSID et mot de passe.
  • Entrez l'adresse IP de votre Raspberry Pi.
  • Définissez le chemin de l'application (query.php) dans Raspberry Pi.
  • Initialisez la bibliothèque cliente Ethernet.
  • Définissez les paramètres de l'écran du Nokia 5110.
  • Définissez les graphiques des modes d'écran associés :télévision et musique.
  • Pour créer différents graphiques (images monochromes), accédez à Convertisseur d'images monochromes.
  • Définissez les commandes de lecteur MP3 requises.
  • Définissez les options et les modes de menu à l'aide de booléens volatiles.
  • Définissez les boutons de commande et les broches LED RVB.
  • Initiez la communication série pour le module de lecteur MP3 série sur le deuxième port série - Serial1 .
  • Connectez-vous au réseau Wi-Fi.
  • Vérifiez la connexion sur le moniteur série et sur l'écran Nokia 5110.
  • Dans les read_buttons() fonction, obtenez des données à partir des boutons de commande - Droite, OK, Gauche et Quitter.
  • Dans le change_menu_options() , augmentez ou diminuez le numéro de l'option à l'aide des boutons Droite et Gauche.
  • Dans l'interface() fonction, imprimer l'interface (menu).
  • Si le Init Tracker est sélectionné, connectez-vous à l'application Web nommée TV Series / Anime Release Date Tracker.
  • Si des octets entrants sont disponibles, obtenez la réponse de l'application Web.
  • En utilisant le endsWith() fonction, détectez si la réponse contient ou non le symbole de pourcentage (délimiteur).
  • S'il est inclus, divisez la chaîne de réponse par un délimiteur prédéfini de manière simple. '%'(pourcentage) est défini comme délimiteur dans ce projet.
  • Gleuez des informations sous forme de sous-chaînes :Series_Name, Season, Episode, Episode_Name.
  • Imprimez les informations et jouez la chanson d'ouverture de la série/de l'anime sorti jusqu'à la fin.
  • Attendez que le bouton Quitter soit enfoncé.
  • S'il y a une réponse vide, imprimez Aucun épisode publié détecté :(
  • Dessinez l'icône du téléviseur en comptant jusqu'à la nouvelle demande.
  • Attendez la prochaine demande.
  • Si le mode lecteur MP3 est sélectionné, dessinez l'icône du lecteur de musique. Contrôlez le lecteur MP3 avec les boutons de commande - Droite, Gauche, OK.
  • Si le Mode veille est sélectionné, activez le mode veille dans 10 secondes et imprimez les secondes 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 :)

Code

  • 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); // 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); retard (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); retard (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(); réponse +=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); retard (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'); retard(1000); } myGLCD.enableSleep(); Activated =true; while(Activated ==true){ // Color Pattern:adjustColor(255,0,0); retard (500); adjustColor(0,255,0); retard (500); adjustColor(0,0,255); retard (500); adjustColor(255,255,0); retard (500); adjustColor(80,0,80); retard (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; retard (100); // Depending on the selected option number, change boolean status. switch(selected){ case 1:TV =true; Music =false; Sleep =false; Pause; case 2:TV =false; Music =true; Sleep =false; Pause; case 3:TV =false; Music =false; Sleep =true; Pause; }}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();?>

Pièces et boîtiers personnalisés

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

Schémas


Processus de fabrication

  1. Télécommande universelle Raspberry Pi
  2. Une tranche de framboise Pi
  3. Cycle Chaser
  4. Détecteur de voleur Raspberry Pi
  5. Capteur de température Raspberry Pi
  6. DOMOMATISATION RASPBERRY PI
  7. NEW RASPBERRY PI 3 MODEL B + CARACTÉRISTIQUES ET ACHAT
  8. Robot boîtier CD Raspberry Pi
  9. Carte RaspiRobot V2