Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Nieuwe afleveringsdatum tv-serie / anime-melding

Componenten en benodigdheden

JLCPCB aangepaste PCB
× 1
Arduino Nano 33 IoT
× 1
Raspberry Pi 3 Model B
Raspberry Pi 3 of Raspberry Pi 4
× 1
Raspberry Pi 4 Model B
Raspberry Pi 3 of Raspberry Pi 4
× 1
SparkFun Nokia 5110-scherm
× 1
Seriële MP3-speler van OPEN-SMART
× 1
RGB diffuse gemeenschappelijke anode
× 1
Flash-geheugenkaart, SD-kaart
× 2
Weerstand 220 ohm
× 12
Drukknop 6x6x5
× 4
TaydaElectronics DC POWER JACK 2.1MM VAT-TYPE PCB-MOUNT
× 1

Benodigde gereedschappen en machines

Soldeerbout (algemeen)
Hot lijmpistool (algemeen)

Apps en online services

Arduino IDE
KiCad
NotePad++

Over dit project

Beschrijving

Hoewel er talloze web- en mobiele applicaties zijn om de releasedatums van favoriete programma's bij te houden, wilde ik een apparaat maken dat me waarschuwt wanneer een nieuwe aflevering van een serie of een anime in mijn lijst helemaal opnieuw wordt uitgebracht - hardware en software - met verschillende functies.

Allereerst heb ik een webapplicatie gemaakt - TV Series / Anime Release Date Tracker - in PHP om een ​​serie/anime lijst te maken en informatie te verzamelen over hun releasedatums. In dat opzicht heb ik de TVMAZE REST API gebruikt waarmee de applicatie afleveringsinformatie op releasedatum nauwkeurig kan verkrijgen, zij het zonder diverse en verwarrende codeerstappen. Vervolgens heb ik een LAMP-server (met MariaDB) op Raspberry Pi opgezet om de applicatie uit te voeren. Maar voor degenen die geen Raspberry Pi hebben en er ook geen als host willen gebruiken, heb ik een gratis versie van de applicatie met een gebruiksvriendelijke interface op mijn website gepubliceerd. U kunt ook de broncode van de applicatie hieronder vinden.

Nadat ik het overbrengen van informatie met de webtoepassing had voltooid, besloot ik om een ​​Arduino Nano 33 IoT te gebruiken als ontwikkelbord om gegevens te verzamelen die door de toepassing zijn gegenereerd, als er een nieuwe aflevering bij de release is. Hieronder vindt u meer informatie over hoe ik het antwoord dat door de toepassing is verzonden, heb gesorteerd met behulp van een scheidingsteken. En om de functies en modi te beheren die ik op de Nano 33 IoT heb geïmplementeerd, ontwierp ik een gebruikersinterface (menu) met een Nokia 5110-scherm en drukknoppen.

Ten slotte, om op de hoogte te blijven wanneer een nieuwe aflevering van een show in mijn lijst met het openingsnummer wordt uitgebracht, heb ik een seriële MP3-spelermodule (OPEN-SMART) gebruikt vanwege de eenvoudig te gebruiken UART-opdrachtlijst. Bovendien kon ik de MP3-spelermodus toevoegen om alle openingsnummers af te spelen, waardoor het apparaat een intrigerend accessoire voor mijn kamer werd :)

Nadat ik mijn ontwerp op een breadboard had voltooid en de code had getest, ontwierp ik een PCB (TV Series / Anime Release Date Notifier) ​​met een unieke retro-telefoonvorm om een ​​gloednieuw ogend en gebruiksvriendelijk apparaat te creëren.

Grote dank aan JLCPCB voor het sponsoren van dit project.

Stap 1:Ontwerpen en solderen van de TV-serie / Anime Releasedatum Notifier PCB

Ik heb de TV Series / Anime Release Date Notifier PCB ontworpen met behulp van KiCad. Ik heb het Gerber-bestand van de PCB hieronder bijgevoegd, dus als je wilt, kun je deze PCB bij JLCPCB bestellen om dit project te repliceren om een ​​melding te krijgen wanneer er nieuwe afleveringen van je favoriete programma's verschijnen :)

Allereerst heb ik met behulp van een soldeerbout headers, drukknoppen, 220Ω-weerstanden, de stroomaansluiting, 5 mm anode RGB-led bevestigd.

Componentenlijst op de print:

A1 (Headers voor Arduino Nano 33 IoT)

J1 (headers voor seriële mp3-speler)

J2 (Headers voor DS3231 - Niet vereist)

J3 (Headers voor Nokia 5110-scherm)

J4 (stroomaansluiting)

D1 (5 mm anode RGB-led)

K1, K2, K3, K4 (Drukknoppen)

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

Stap 2:Een LAMP-webserver opzetten met MariaDB op Raspberry Pi

Als je een beginner bent in het programmeren met Raspberry Pi, kun je goed uitgelegde instructies en tutorials bekijken op de officiële Raspberry Pi-website.

Klik hier om naar de officiële installatiehandleiding van de Raspberry Pi te gaan.

  • Open een terminalvenster door Accessoires> Terminal in het menu te selecteren.
  • Installeer het apache2-pakket door de volgende opdracht in de terminal te typen en op Enter te drukken:

sudo apt-get install apache2 -y

  • Om de server te testen, opent u Chromium door Internet> Chromium-webbrowser in het menu te selecteren en http://localhost in te voeren.
  • Als je wilt, kun je ook het IP-adres van je Raspberry Pi gebruiken.

hostnaam -I

  • Installeer het PHP-pakket met de volgende opdracht:
  • Vergeet niet de Pi bij te werken.

sudo apt-get update

sudo apt-get install php -y

  • Installeer de MySQL Server (MariaDB) en PHP-MySQL-pakketten door de volgende opdracht in het terminalvenster in te voeren:

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

  • Als u een nieuwe gebruiker wilt maken, voert u het MySQL-commando voor beveiligde installatie uit in het terminalvenster.

sudo mysql_secure_installation

  • U wordt gevraagd Voer huidig ​​wachtwoord voor root in (voer voor geen): — druk op Enter.
  • Typ Y en druk op Enter om Stel root-wachtwoord in .
  • Typ bot op het Nieuw wachtwoord: prompt en druk op Enter.
  • Typ Y om Anoniem gebruikers te verwijderen .
  • Typ Y om Op afstand inloggen via root niet toe te staan .
  • Typ Y om Testdatabase te verwijderen en er toegang toe te krijgen .
  • Typ Y om Bevoegdheidstabellen nu opnieuw te laden .
  • Als je klaar bent, zie je dit bericht - Alles klaar! en bedankt voor het gebruik van MariaDB!

  • Als u een database (tvseries) wilt maken om variabelen op te slaan die zijn gegenereerd door TVMAZE REST API, voert u deze MySQL-opdracht uit in het terminalvenster:

sudo mysql -uroot -p

  • Voer het root-wachtwoord in - bot
  • U wordt begroet door het bericht Welkom bij de MariaDB-monitor .
  • Volg de onderstaande regels na de MariaDB [(none)]> :prompt om de tvserie te maken database in MariaDB:

database tv-serie maken;

VERLENEN ALLE VOORRECHTEN OP tvseries.* AAN 'root'@'localhost' GEDENTIFICEERD DOOR 'bot';

SPOEL VOORRECHTEN;

  • Verlaat de MariaDB-prompt met Ctrl + D.

  • Om gegevens van TVMAZE REST API te verkrijgen door alleen de file_get_contents() te gebruiken functie in PHP, installeer het php-curl pakket:

sudo apt-get install php-curl

  • Herstart vervolgens de apache-server om de geïnstalleerde pakketten op de localhost te kunnen gebruiken:

sudo-service apache2 opnieuw opstarten

Stap 3:Informatie verkrijgen van TVMAZE REST API over uw favoriete serie/anime

TVMAZE biedt een gratis en gebruiksvriendelijke REST API, waarmee gebruikers programma's kunnen zoeken op naam, datum, afleveringsnummer, enz. U kunt de beschikbare eindpunten en zoekopdrachten inspecteren:

Ga naar TVMAZE REST API.

Ik gebruikte de Aflevering op datum optie om alle afleveringen van een bepaalde show op te halen die op een specifieke datum zijn uitgezonden.

Om informatie op releasedatum te krijgen, moet je je favoriete programma's zoeken op TVMAZE en de tv-ID gebruiken die in hun links wordt vermeld.

  • URL:/shows/:id/episodesbydate?date=:date
  • Datum:ISO 8601-indeling
  • Voorbeeld:http://api.tvmaze.com/shows/1/episodesbydate?date=2013-07-01

Als er een aflevering wordt uitgezonden op de opgegeven datum, retourneert de API een reeks volledige afleveringsinformatie.

Anders retourneert de API een HTTP 404.

Hieronder kun je mijn favoriete serie/animelijst bekijken die ik heb gemaakt om bij te houden of er een nieuwe aflevering van een van hen is die samen met mijn project wordt uitgebracht.

Ik heb The Late Late Show toegevoegd om mijn code te testen, aangezien het een dagelijkse show is.

1) Een stuk

TV-ID:1505

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

2) My Hero Academia

TV-ID:13615

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

3) Westworld

TV-ID:1371

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

4) De Simpsons

TV-ID:83

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

5) The Late Late Show met James Corden

TV-ID:2831

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

Stap 4:Het ontwikkelen van de TV Series / Anime Release Date Tracker (applicatie) die draait op Raspberry Pi in PHP en het creëren van de serietabel om gegevens in te voegen

Ik heb de TV Series / Anime Release Date Tracker in PHP ontwikkeld en de broncode van de applicatie uitgelegd in de Code Verklaring hieronder voor geïnteresseerden.

Als u echter niet van webontwikkeling met PHP houdt, kunt u de applicatie downloaden in Downloads - genaamd TV-Series-Anime-Episode-Tracker.zip - en deze uploaden naar Raspberry Pi zonder in PHP-codering te duiken.

Uploaden :

Installeer door de volgende stappen de TV Series / Anime Release Date Tracker op de localhost:

  • Download de applicatie - TV-Series-Anime-Episode-Tracker.zip - inclusief index.php en query.php bestanden.

  • Extract de TV-Series-Anime-Episode-Tracker.zip.

  • Verplaats de applicatiemap (TV-Series-Anime-Episode-Tracker) van Downloads naar de server (/var/www/html) met behulp van de terminal, aangezien de apache-server een beveiligde locatie is.

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

  • Ga naar de tracker voor releasedatums van tv-series / anime:

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

Functies :

1) Na de installatie opent u de toepassing om een ​​tabel met de naam series in de database (tvseries) aan te maken. Wanneer u het index.php-bestand voor het eerst opent, maakt de toepassing automatisch de tabel met de naam series en informeert de gebruiker - Databasetabel aangemaakt!

2) Als de databasetabel (serie) met succes in de database is gemaakt, informeert de toepassing de gebruiker - Databasetabel gevonden!

3) Nadat u de databasetabel (serie) hebt gemaakt, voert u de volgende stappen uit om variabelen in te voegen die nodig zijn voor TVMAZE REST API voor elke show in uw lijst:

  • Voer deze MySQL-opdracht uit in het terminalvenster:

sudo mysql -uroot -p

  • Voer het root-wachtwoord in - bot
  • Selecteer de tv-serie databank:

GEBRUIK tv-serie;

  • Voeg vereiste variabelen in - serienaam, tv-ID, status - in de tabel voor elke show. De statusvariabele wordt door de applicatie gebruikt om de gebruiker op de hoogte te stellen zonder dat dit opnieuw gebeurt wanneer een nieuwe aflevering op een bepaalde datum wordt uitgebracht.

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

5) Op de query.php doet de applicatie verzoeken aan de TVMAZE REST API om te detecteren of er nieuwe afleveringen van shows in de database beschikbaar zijn. Als TVMAZE REST API een reeks volledige afleveringsgegevens van een vrijgegeven aflevering retourneert, drukt de applicatie eenmalig informatie af die kan worden verzameld door Arduino Nano 33 IoT om herhaling te voorkomen.

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) Anders wordt Geen invoer gevonden!

Code Uitleg :

1) index.php

  • Definieer de instellingen voor de databaseverbinding - "localhost", "root", "bot", "tvseries".
  • In de checkDatabase() functie, detecteer of er een databasetabel is in de opgegeven naam - series.
  • In de createTable() functie, maak de serietabel aan als deze niet in de database wordt gevonden en informeer de gebruiker.

2) query.php

  • In de query class, definieer het pad naar de TVMAZE API om verzoeken in te dienen.
  • In de define_user() functie, krijg verbindingsinstellingen en de tabelnaam.
  • In de check_ep_release_date() functie, met behulp van de file_get_contents() functie, detecteren of er een nieuwe aflevering is uitgebracht voor een bepaalde tv-ID op de huidige datum. Wijzig de statusvariabele in de database van In behandeling in Vrijgegeven als een nieuwe aflevering wordt vrijgegeven om herhaling te voorkomen.
  • In de track_db_entries() functie, voer de check_ep_release_date() . uit voor elke show geregistreerd in de databasetabel - series.

Stap 4.1:Webapplicatie uitvoeren zonder Raspberry Pi

Voor abonnees van mijn website (TheAmplituhedron), heb ik een gratis versie van de TV Series / Anime Release Date Tracker ontwikkeld voor degenen die geen Raspberry Pi hebben en er ook geen willen gebruiken als host voor dit project.

Het biedt een gebruiksvriendelijke interface voor het beheer van de database. Als u deze interface met uw project wilt gebruiken in plaats van de terminal op Raspberry Pi te gebruiken om gegevens in te voegen, neem dan contact met mij op.

Ga naar de applicatie:

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

Stap 5:Arduino Nano 33 IoT instellen

Als je een beginner bent in het programmeren met Arduino Nano 33 IoT:maak je geen zorgen, het is eenvoudig te gebruiken met Arduino IDE. Download gewoon de vereiste stuurprogramma's - Arduino SAMD Core - zoals hier goed uitgelegd.

Download hier de WiFiNINA-bibliotheek om verbinding te maken met WiFi via Arduino Nano 33 IoT.

Download hier de bibliotheek LCD5110_Basic om tekst af te drukken en afbeeldingen te tekenen op het Nokia 5110-scherm.

Ik heb de tweede seriële poort (Serial1) op de Arduino Nano 33 IoT gebruikt om te communiceren met de seriële mp3-speler.

Seriële poorten op de Arduino Nano 33 IoT :

"De USB-connector van het bord is rechtstreeks verbonden met de USB-host-pinnen van de SAMD21. Door deze routering kunt u de Arduino NANO 33 IoT gebruiken als een client-USB-randapparaat (fungeert als een muis of een toetsenbord dat op de computer is aangesloten) ) of als USB-hostapparaat zodat apparaten zoals een muis, toetsenbord of een Android-telefoon kunnen worden aangesloten op de Arduino NANO 33 IoT. Deze poort kan ook worden gebruikt als een virtuele seriële poort met behulp van het seriële object in de Arduino-programmeertaal . De RX0- en TX1-pinnen zijn een tweede seriële poort die beschikbaar is als Serial1."

Dan is Arduino Nano 33 IoT klaar om de projectcode uit te voeren :)

Stap 6:Opdrachten verzenden naar de seriële mp3-speler (OPEN-SMART)

Ik heb een afspeellijst gemaakt die bestaat uit openingsnummers van mijn favoriete serie/animelijst in dit project:

1) Eendelig - Opening | Luister

2) My Hero Academia - Opening | Luister

3) Westworld - Opening | Luister

4) The Simpsons - Opening | Luister

5) De Late Late Show - Opening | Luister

Als je wilt, kun je mijn afspeellijst downloaden in een gecomprimeerde map - opening_songs.zip.

Het is moeiteloos om een ​​seriële mp3-speler te gebruiken met Arduino Nano 33 IoT, zolang u de UART-commando's kent die nodig zijn om de juiste functies te activeren. Ik gebruikte een seriële MP3-spelermodule met luidspreker van OPEN-SMART. Dus als je een seriële mp3-speler met een andere merknaam hebt, werken de onderstaande commando's niet voor jou.

Volg de instructies uit de handleiding:

"De module is een soort eenvoudig MP3-spelerapparaat dat is gebaseerd op een hoogwaardige MP3-audiochip. Het kan 8k Hz ~ 48k Hz bemonsteringsfrequentie MP3- en WAV-bestandsindelingen ondersteunen. Er is een TF-kaartaansluiting aan boord , zodat u de micro SD-kaart kunt aansluiten die audiobestanden opslaat. MCU kan de MP3-afspeelstatus regelen door opdrachten naar de module te sturen via de UART-poort, zoals het wisselen van nummers, het wijzigen van het volume en de afspeelmodus, enzovoort. U kunt ook debug de module via USB naar UART-module. Het is compatibel met Arduino / AVR / ARM / PIC. "

"Zorg ervoor dat uw micro SD-kaart is geformatteerd als FAT16 of FAT32 en dat er enkele nummers in staan. U moet mappen "01" en "02" maken en enkele nummers plaatsen met de naam 001xxx.mp3 / 002xxx.mp3 / 003xxx.mp3 erin."

Met andere woorden, om opdrachten nauwkeurig uit te voeren, slaat u uw nummers op in een map met de naam '01' en voegt u opeenvolgende nummers toe aan de nummernamen - 001One Piece-Opening.mp3, 002My Hero Academia-Opening.mp3, enz.

Om UART-opdrachten naar de seriële mp3-speler te sturen met Arduino Nano 33 IoT, heb ik een functie gemaakt met de naam send_command_to_MP3_player . Het draagt ​​elke byte in de gevraagde opdracht over naar de seriële mp3-speler via de tweede seriële poort op RX0- en TX1-pinnen - Serial1 - afhankelijk van de lengte van het gevraagde commando - 4, 5 of 6.

Zoals hieronder wordt getoond, scheidt u de opdracht die u naar de seriële mp3-speler wilt sturen met bytes - 0x7e. Alle commando's beginnen met '7E' en eindigen met 'EF'. De tweede byte is het aantal tussenliggende bytes - '02', '03', '04'. Download hieronder de handleiding van de seriële mp3-speler van OPEN-SMART om alle commando's te inspecteren en meer gedetailleerde instructies te krijgen.

// Definieer de vereiste MP3-speleropdrachten.
// U kunt alle gegeven opdrachten inspecteren vanaf de projectpagina:
// Selecteer opslagapparaat naar TF-kaart
static int8_t select_SD_card[] ={0x7e, 0x03, 0X35, 0x01, 0xef}; // 7E 03 35 01 EF
// Speel het nummer af met de directory:/01/001xxx.mp3
static int8_t play_song_1[] ={0x7e, 0x04, 0x41, 0x00, 0x01, 0xef}; // 7E 04 41 00 01 EF
// Speel het nummer af met de directory:/01/002xxx.mp3
static int8_t play_song_2[] ={0x7e, 0x04, 0x41, 0x00, 0x02, 0xef}; // 7E 04 41 00 02 EF
// Speel het nummer af met de directory:/01/003xxx.mp3
static int8_t play_song_3[] ={0x7e, 0x04, 0x41, 0x00, 0x03, 0xef}; // 7E 04 41 00 03 EF
// Speel het nummer af met de directory:/01/004xxx.mp3
static int8_t play_song_4[] ={0x7e, 0x04, 0x41, 0x00, 0x04, 0xef}; // 7E 04 41 00 04 EF
// Speel het nummer af met de directory:/01/005xxx.mp3
static int8_t play_song_5[] ={0x7e, 0x04, 0x41, 0x00, 0x05, 0xef}; // 7E 04 41 00 05 EF
// Speel het nummer af.
static int8_t play[] ={0x7e, 0x02, 0x01, 0xef}; // 7E 02 01 EF
// Pauzeer het nummer.
static int8_t pause[] ={0x7e, 0x02, 0x02, 0xef}; // 7E 02 02 EF
// Volgend nummer.
static int8_t next_song[] ={0x7e, 0x02, 0x03, 0xef}; // 7E 02 03 EF
// Vorig nummer.
static int8_t previous_song[] ={0x7e, 0x02, 0x04, 0xef}; // 7E 02 04 EF

Stap 7:Arduino Nano 33 IoT programmeren

  • Voeg de vereiste bibliotheken toe.
  • Definieer je wifi-instellingen - SSID en wachtwoord.
  • Voer het IP-adres van je Raspberry Pi in.
  • Definieer het pad van de applicatie (query.php) in Raspberry Pi.
  • Initialiseer de Ethernet-clientbibliotheek.
  • Definieer de scherminstellingen van de Nokia 5110.
  • Definieer de afbeeldingen voor gerelateerde schermmodi - tv en muziek.
  • Ga naar Monochrome Image Converter om verschillende afbeeldingen (monochrome afbeeldingen) te maken.
  • Definieer de vereiste MP3-speleropdrachten.
  • Definieer menu-opties en modi met vluchtige booleans.
  • Definieer de bedieningsknoppen en RGB LED-pinnen.
  • Start seriële communicatie voor de seriële MP3-spelermodule op de tweede seriële poort - Serial1 .
  • Verbind met het wifi-netwerk.
  • Controleer de verbinding op zowel de seriële monitor als het Nokia 5110-scherm.
  • In de read_buttons() functie, haal gegevens op van de bedieningsknoppen - Rechts, OK, Links en Afsluiten.
  • In de change_menu_options() , verhoog of verlaag het optienummer met de knoppen Rechts en Links.
  • In de interface() functie, druk de interface (menu) af.
  • Als de Init Tracker modus is geselecteerd, maakt u verbinding met de webtoepassing genaamd TV Series / Anime Release Date Tracker.
  • Als er inkomende bytes beschikbaar zijn, vraag dan het antwoord van de webapplicatie.
  • De endsWith() . gebruiken functie, detecteer of het antwoord het percentagesymbool (scheidingsteken) bevat of niet.
  • Indien inbegrepen, splits de antwoordreeks op een eenvoudige manier door een vooraf gedefinieerd scheidingsteken. '%'(percentage) wordt gedefinieerd als het scheidingsteken in dit project.
  • Verzamel informatie als substrings - Series_Name, Season, Episode, Episode_Name.
  • Druk informatie af en speel het openingsnummer van de uitgebrachte serie/anime tot het stopt.
  • Wacht tot de knop Afsluiten wordt ingedrukt.
  • Als er een blanco antwoord is, print dan Geen vrijgegeven aflevering gedetecteerd :(
  • Teken het tv-pictogram terwijl je telt tot het nieuwe verzoek.
  • Wacht tot het volgende verzoek.
  • Als de MP3-spelermodus is geselecteerd, tekent u het pictogram van de muziekspeler. Bedien de MP3-speler met de bedieningsknoppen - Rechts, Links, OK.
  • Als de Slaapmodus is geselecteerd, activeert u de slaapmodus over 10 seconden en drukt u de resterende seconden af.

Aansluitingen en aanpassingen

// Verbindingen
// Arduino Nano 33 IoT:
// Nokia 5110 Scherm
// 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); Serieel.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); vertraging (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); vertraging (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); vertraging (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'); vertraging (1000); } myGLCD.enableSleep(); Activated =true; while(Activated ==true){ // Color Pattern:adjustColor(255,0,0); vertraging (500); adjustColor(0,255,0); vertraging (500); adjustColor(0,0,255); vertraging (500); adjustColor(255,255,0); vertraging (500); adjustColor(80,0,80); vertraging (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; vertraging (100); // Depending on the selected option number, change boolean status. switch(selected){ case 1:TV =true; Music =false; Sleep =false; pauze; case 2:TV =false; Music =true; Sleep =false; pauze; case 3:TV =false; Music =false; Sleep =true; pauze; }}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();?>

Aangepaste onderdelen en behuizingen

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

Schema's


Productieproces

  1. Schaffner introduceert een nieuwe serie RFI-filters
  2. Raspberry Pi universele afstandsbediening
  3. Een stukje Raspberry Pi
  4. Cycle Chaser
  5. Raspberry Pi diefdetector
  6. Raspberry Pi-temperatuursensor
  7. RASPBERRY PI HOME AUTOMATION
  8. NIEUWE RASPBERRY PI 3 MODEL B + FUNCTIES EN AANKOOP
  9. Raspberry Pi CD Box Robot
  10. RaspiRobot Board V2
  11. Rover