Automatisiertes Benachrichtigungssystem für TV-Serien & Anime-Veröffentlichungstermine
Komponenten und Materialien
- JLCPCB Custom PCB (×1)
- Arduino Nano 33 IoT (×1)
- Raspberry Pi 3 Model B / 4 Model B (×1)
- Nokia 5110 LCD (SparkFun) (×1)
- Serial MP3 Player (OPEN-SMART) (×1)
- Micro-SD-Karte (×2)
- RGB-LED (gemeinsame Anode) (×1)
- Widerstand 220 Ω (×12)
- Taster 6×6×5 mm (×4)
- DC-Power-Jack 2,1 mm (×1)
Werkzeuge
- Lötkolben
- Heißklebepistole
Software & Dienste
- Arduino IDE
- KiCad (PCB-Design)
- Notepad++
Projektbeschreibung
Ziel: Ein eigenständiges Gerät, das benachrichtigt, wenn eine neue Folge einer favorisierten Serie/Anime erscheint – inklusive Titelsong. Komplett selbstgebaut: Hardware, Web-App, Firmware.
Architektur
- Web-App (PHP/LAMP auf Raspberry Pi): Nutzt TVMAZE REST API (Endpoint
/shows/:id/episodesbydate?date=YYYY-MM-DD). Speichert Serien (Name, TV-ID, Status) in MariaDB. - Arduino Nano 33 IoT: Fragt zyklisch
query.phpab. Bei neuer Folge: Anzeige auf Nokia 5110, Abspielen des Openings via MP3-Player, RGB-LED in Serienfarbe. - Benutzeroberfläche: Menü auf Nokia 5110 mit 4 Tastern (Links, Rechts, OK, Exit). Modi: Init Tracker, MP3 Player, Sleep.
Besonderheiten
- Eigene PCB in Retro-Telefon-Form (JLCPCB gesponsert).
- Kostenlose Web-App-Version auf TheAmplituhedron (für Abonnenten, kein Pi nötig).
- Delimiter-basiertes Parsing (
%) der Server-Antwort:%Serienname%Staffel%Folge%Folgentitel%. - MP3-Player nutzt UART-Befehle (OPEN-SMART Protokoll). Songs in Ordner
01/als001xxx.mp3.
Schritt-für-Schritt
1. PCB-Design & Bestückung (KiCad)
Gerber-Dateien im Download. Bestückung: Headers, Taster, Widerstände, Power-Jack, RGB-LED, Steckplätze für Nano 33 IoT, MP3-Player, Nokia 5110, optional DS3231.
2. LAMP-Server auf Raspberry Pi (MariaDB)
sudo apt-get update && sudo apt-get install apache2 php mariadb-server php-mysql php-curl -y
sudo mysql_secure_installation
# Root-Passwort: "bot", anonyme User entfernen, Test-DB löschen, etc.
sudo mysql -uroot -p
CREATE DATABASE tvseries;
GRANT ALL PRIVILEGES ON tvseries.* TO 'root'@'localhost' IDENTIFIED BY 'bot';
FLUSH PRIVILEGES;
EXIT;
sudo service apache2 restart
3. TVMAZE API nutzen
Serien suchen, TV-ID notieren (z. B. One Piece: 1505). Endpoint: https://api.tvmaze.com/shows/1505/episodesbydate?date=2024-01-15. Liefert Array mit Folgeninfos oder 404.
4. Web-App installieren (TV-Series-Anime-Episode-Tracker)
- ZIP herunterladen, entpacken, nach
/var/www/html/verschieben. index.phperstellt Tabelleseriesautomatisch.- Serien per SQL eintragen:
INSERT INTO series (series_name, tv_id, status) VALUES ('One Piece', '1505', 'Pending'); query.phpprüft alle Einträge, gibt bei neuer Folge formatierten String mit%-Delimitern aus, setzt Status aufReleased.
5. Arduino Nano 33 IoT einrichten
- Arduino SAMD Boards & WiFiNINA Library installieren.
- LCD5110_Basic Library für Nokia-Display.
- Zweiten Serial-Port (
Serial1an RX0/TX1) für MP3-Player.
6. MP3-Player UART-Befehle (OPEN-SMART)
// Beispiele (alle Befehle: 7E xx ... EF)
static int8_t select_SD_card[] = {0x7E,0x03,0x35,0x01,0xEF};
static int8_t play_song_1[] = {0x7E,0x04,0x41,0x00,0x01,0xEF};
static int8_t play_song_2[] = {0x7E,0x04,0x41,0x00,0x02,0xEF};
// ... play_song_3..5, play, pause, next, previous
SD-Karte: FAT16/32, Ordner 01, Dateien 001One Piece-Opening.mp3 etc.
7. Firmware-Highlights
- WiFi-Verbindung, Server-IP & Pfad konfigurieren.
- Menü-Navigation per Tastern (Links/Rechts = Auswahl, OK = Bestätigen, Exit = Zurück).
- Init Tracker: HTTP-GET auf
query.php, Response parsen, Info anzeigen, Opening abspielen, LED-Farbe setzen (z. B. One Piece = Rot), bis Exit gedrückt. - MP3 Player: Nächstes/Vorheriges Lied, Pause, Music-Icon anzeigen.
- Sleep: 10-s Countdown, dann Sleep-Mode + RGB-Nachtlicht-Farbschema, Exit weckt auf.
Anschlüsse (Arduino Nano 33 IoT)
Nokia 5110: D2=SCK, D3=MOSI, D4=DC, D5=RST, D6=CS
RGB-LED: D9=R, D10=G, D11=B (Anode → 3,3V, PWM invertiert)
Taster: A0=Left, A1=OK, A2=Right, A3=Exit
DS3231 (opt): A4=SDA, A5=SCL
MP3 Player: Serial1 (RX0/TX1)
Modi & Funktionen im Detail
A. Init Tracker
- Verbindung zum Pi-Server → „Connected to the server!!!“ oder „Connection Error!!!“
- Neue Folge erkannt → Anzeige:
One Piece, 10x54, Luffy's Determination, Opening spielt, LED Rot. - Keine neue Folge → „No Released Episode Detected :("
- TV-Icon während Wartezeit (10 s bis nächster Request).
B. MP3 Player
- Music-Icon, Steuerung: Rechts=Next, Links=Previous, OK=Pause.
C. Sleep
- 10-s Countdown, dann Sleep-Mode + RGB-Farbzyklus (Rot, Grün, Blau, Gelb, Lila je 500 ms).
- Exit → Aufwachen, zurück zum Menü.
Code
Series_Release_Date_Notifier.ino (Arduino)
// Vollständiger Sketch – siehe Original für kompletten Code.
// Kernfunktionen: setup() – WiFi, Display, MP3-Init; loop() – Menü, Modi-Handling;
// read_buttons(), change_menu_options(), interface();
// send_command_to_MP3_player(cmd, len) – UART über Serial1;
// adjustColor(r,g,b) – invertiert für Common Anode.
// HTTP-GET in Init Tracker, Response-Parsing mit indexOf('%'), substring().
index.php (Tabelle anlegen)
<?php
$conn = mysqli_connect("localhost","root","bot","tvseries");
function checkDatabase($t,$c){ return mysqli_num_rows(mysqli_query($c,"SHOW TABLES FROM `tvseries` LIKE '$t'"))>0; }
function createTable($t,$c){
if(!checkDatabase($t,$c)){
mysqli_query($c,"CREATE TABLE `$t`(id INT AUTO_INCREMENT PRIMARY KEY, series_name VARCHAR(255), tv_id VARCHAR(255), status VARCHAR(255))");
echo "Database Table Created!";
}else echo "Database Table Found!";
}
createTable("series",$conn);
?>
query.php (Prüfung & Ausgabe)
<?php
error_reporting(0);
class query{
const ROOT="https://api.tvmaze.com/shows/";
const PATH="/episodesbydate?date=";
public $conn,$table;
function define_user($c,$t){ $this->conn=$c; $this->table=$t; }
function check_ep_release_date($id,$name,$status){
$url=self::ROOT.$id.self::PATH.date("Y-m-d");
if($ep=json_decode(@file_get_contents($url))){
if($status!="Released"){
echo "%$name%".$ep[0]->season."%".$ep[0]->number."%".$ep[0]->name."%";
mysqli_query($this->conn,"UPDATE `$this->table` SET status='Released' WHERE series_name='$name'");
}
}elseif($status!="Pending"){
mysqli_query($this->conn,"UPDATE `$this->table` SET status='Pending' WHERE series_name='$name'");
}
}
function track_db_entries(){
$res=mysqli_query($this->conn,"SELECT * FROM `$this->table` ORDER BY id DESC");
if(mysqli_num_rows($res)>0) while($r=mysqli_fetch_assoc($res)) $this->check_ep_release_date($r['tv_id'],$r['series_name'],$r['status']);
else echo "No Entry Found!";
}
}
$conn=mysqli_connect("localhost","root","bot","tvseries");
$q=new query(); $q->define_user($conn,"series"); $q->track_db_entries();
?>
Downloads
- Gerber-Dateien (PCB)
- Web-App ZIP
- Opening-Songs ZIP
- Grafik-Dateien für Nokia 5110 (
tv.c,music.c)
Schaltpläne (KiCad)
Fazit
Gerät am Bücherregal befestigt (Heißkleber) – funktioniert hervorragend. Benachrichtigt zuverlässig bei neuen Folgen mit Opening-Song und Farbcode.
Herstellungsprozess
- Professionelle Raspberry Pi Universalfernbedienung mit LIRC bauen
- RF zu DC mit Raspberry Pi wandeln: Hüllkurvendetektor bauen & troubleshooten
- Cycle Chaser: Fahrrad zur nächtlichen Lichtshow mit Raspberry Pi verwandeln
- Raspberry Pi Diebstahlmelder bauen – Schritt-für-Schritt-Anleitung
- Raspberry Pi Heimtemperaturmonitor mit MCP9808, InfluxDB & Grafana bauen
- Raspberry Pi Home Automation System für Fernsteuerung bauen
- Raspberry Pi 3 B+ – Aktualisierte Features, Specs & Kaufberatung
- DIY Wall-E-inspirierter Raspberry Pi CD-Box-Roboter
- RasPiRobot Board V2: Raspberry Pi zum leistungsstarken Roboter-Controller erweitern
- Windows IoT Core Rover mit Raspberry Pi 2 bauen – Anfänger bis Fortgeschritten