Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Pemberitahu Tanggal Rilis Serial TV / Anime Episode Baru

Komponen dan persediaan

JLCPCB PCB yang Disesuaikan
× 1
Arduino Nano 33 IoT
× 1
Raspberry Pi 3 Model B
Raspberry Pi 3 atau Raspberry Pi 4
× 1
Raspberry Pi 4 Model B
Raspberry Pi 3 atau Raspberry Pi 4
× 1
Layar SparkFun Nokia 5110
× 1
Pemutar MP3 Serial oleh OPEN-SMART
× 1
RGB Diffused Common Anode
× 1
Kartu Memori Flash, Kartu SD
× 2
Resistor 220 ohm
× 12
Sakelar Tombol Tekan 6x6x5
× 4
TaydaElectronics DC POWER JACK 2.1MM BARREL-TYPE PCB MOUNT
× 1

Alat dan mesin yang diperlukan

Besi solder (generik)
Pistol lem panas (generik)

Aplikasi dan layanan online

Arduino IDE
KiCad
NotePad++

Tentang proyek ini

Deskripsi

Meskipun ada banyak sekali web dan aplikasi seluler untuk melacak tanggal rilis acara favorit, saya ingin membuat perangkat yang memberi tahu saya saat episode baru dari serial atau anime dalam daftar saya dirilis dari awal - perangkat keras dan perangkat lunak - dengan berbagai fitur.

Pertama-tama, saya membuat aplikasi web - Pelacak Tanggal Rilis Serial TV / Anime - di PHP untuk membuat daftar serial/anime dan mengumpulkan informasi tentang tanggal rilisnya. Dalam hal ini, saya menggunakan TVMAZE REST API yang memungkinkan aplikasi untuk mendapatkan informasi episode berdasarkan tanggal rilis secara tepat, meskipun tanpa langkah-langkah coding yang berbeda dan membingungkan. Kemudian, saya menyiapkan server LAMP (w/ MariaDB) di Raspberry Pi untuk menjalankan aplikasi. Tetapi, bagi mereka yang tidak memiliki Raspberry Pi atau ingin menggunakannya sebagai host, saya menerbitkan aplikasi versi gratis dengan antarmuka yang ramah pengguna di situs web saya. Anda juga dapat menemukan kode sumber aplikasi di bawah ini.

Setelah memenuhi transfer informasi dengan aplikasi web, jika ada episode baru yang dirilis, saya memutuskan untuk menggunakan Arduino Nano 33 IoT sebagai papan pengembangan untuk menyusun data yang dihasilkan oleh aplikasi. Anda dapat menemukan informasi lebih lanjut di bawah tentang bagaimana saya menyortir respons yang ditransfer oleh aplikasi dengan menggunakan pembatas. Dan, untuk mengelola fitur dan mode yang saya terapkan pada Nano 33 IoT, saya merancang antarmuka pengguna (menu) dengan Layar Nokia 5110 dan tombol.

Terakhir, untuk mendapatkan informasi ketika episode baru dari acara di daftar saya dirilis dengan lagu pembukanya, saya menggunakan Modul Pemutar MP3 Serial (OPEN-SMART) karena daftar perintah UART yang mudah digunakan. Selain itu, saya dapat menambahkan mode MP3 Player untuk memutar semua lagu pembuka, yang mengubah perangkat menjadi aksesori yang menarik untuk kamar saya :)

Setelah menyelesaikan desain saya di papan tempat memotong roti dan menguji kode, saya merancang PCB (Serial TV / Anime Release Date Notifier) ​​dengan bentuk telepon retro yang unik untuk menciptakan perangkat yang tampak baru dan mudah digunakan.

Terima kasih sebesar-besarnya kepada JLCPCB yang telah mensponsori proyek ini.

Langkah 1:Merancang dan Menyolder PCB Pemberitahu Tanggal Rilis Serial TV / Anime

Saya merancang PCB Notifier Tanggal Rilis Serial TV / Anime dengan menggunakan KiCad. Saya melampirkan file Gerber dari PCB di bawah ini, jadi jika Anda mau, Anda dapat memesan PCB ini dari JLCPCB untuk mereplikasi proyek ini untuk mendapatkan pemberitahuan ketika ada episode baru dari acara favorit Anda yang dirilis :)

Pertama-tama, dengan menggunakan besi solder, saya memasang header, tombol tekan, resistor 220Ω, colokan listrik, LED RGB Anoda 5mm.

Daftar komponen pada PCB:

A1 (Header untuk Arduino Nano 33 IoT)

J1 (Header untuk Serial MP3 Player)

J2 (Header untuk DS3231 - Tidak Diperlukan)

J3 (Header untuk Layar Nokia 5110)

J4 (colokan listrik)

D1 (LED RGB Anoda 5mm)

K1, K2, K3, K4 (Tombol Tekan)

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

Langkah 2:Menyiapkan server web LAMP dengan MariaDB di Raspberry Pi

Jika Anda seorang pemula dalam pemrograman dengan Raspberry Pi, Anda dapat memeriksa instruksi dan tutorial yang dijelaskan dengan baik di situs web resmi Raspberry Pi.

Untuk membuka tutorial pengaturan Raspberry Pi resmi, klik di sini.

  • Buka jendela terminal dengan memilih Aksesoris> Terminal dari menu.
  • Instal paket apache2 dengan mengetikkan perintah berikut ke terminal dan menekan Enter:

sudo apt-get install apache2 -y

  • Untuk menguji server, buka Chromium dengan memilih Internet> Chromium Web Browser dari menu dan masukkan http://localhost.
  • Jika mau, Anda juga dapat menggunakan alamat IP Raspberry Pi Anda.

nama host -saya

  • Instal paket PHP dengan perintah berikut:
  • Jangan lupa untuk memperbarui Pi.

sudo apt-get update

sudo apt-get install php -y

  • Instal MySQL Server (MariaDB) dan paket PHP-MySQL dengan memasukkan perintah berikut ke jendela terminal:

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

  • Untuk membuat pengguna baru, jalankan perintah instalasi aman MySQL di jendela terminal.

sudo mysql_secure_installation

  • Anda akan diminta Masukkan kata sandi saat ini untuk root (masukkan tanpa kata sandi): — tekan Enter.
  • Ketik Y dan tekan Enter untuk Setel kata sandi root .
  • Ketik bot di Kata sandi baru: prompt, dan tekan Enter.
  • Ketik Y untuk Menghapus pengguna anonim .
  • Ketik Y untuk Larang login root dari jarak jauh .
  • Ketik Y untuk Hapus database pengujian dan akses ke sana .
  • Ketik Y untuk Muat ulang tabel hak istimewa sekarang .
  • Setelah selesai, Anda akan melihat pesan ini - Semua selesai! dan Terima kasih telah menggunakan MariaDB!

  • Untuk membuat database (tvseries) untuk menyimpan variabel yang dihasilkan oleh TVMAZE REST API, jalankan perintah MySQL ini di jendela terminal:

sudo mysql -uroot -p

  • Masukkan kata sandi root - bot
  • Anda akan disambut oleh pesan Selamat datang di monitor MariaDB .
  • Ikuti baris di bawah ini setelah MariaDB [(none)]> :prompt untuk membuat tvseries database di MariaDB:

membuat database tvseries;

BERIKAN SEMUA HAK ISTIMEWA DI tvseries.* UNTUK 'root'@'localhost' DIIDENTIFIKASI OLEH 'bot';

Hak Istimewa Siram;

  • Keluar dari perintah MariaDB dengan Ctrl + D.

  • Untuk mendapatkan data dari TVMAZE REST API hanya dengan menggunakan file_get_contents() fungsi di PHP, instal paket php-curl:

sudo apt-get install php-curl

  • Kemudian restart server apache untuk dapat menggunakan paket-paket yang terinstall di localhost:

sudo service apache2 restart

Langkah 3:Mendapatkan informasi dari TVMAZE REST API di serial/anime favorit Anda

TVMAZE menyediakan REST API gratis dan mudah digunakan, yang memungkinkan pengguna mencari acara berdasarkan nama, tanggal, nomor episode, dll. Anda dapat memeriksa titik akhir dan kueri yang tersedia:

Buka TVMAZE REST API.

Saya menggunakan Episode berdasarkan Tanggal opsi untuk mengambil semua episode dari acara tertentu yang telah ditayangkan pada tanggal tertentu.

Untuk dapat memperoleh informasi berdasarkan tanggal rilis, Anda perlu mencari acara favorit Anda di TVMAZE dan menggunakan ID TV yang ditunjukkan di tautannya.

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

Jika ada episode yang ditayangkan pada tanggal tertentu, API akan menampilkan serangkaian info episode lengkap.

Jika tidak, API akan mengembalikan HTTP 404.

Di bawah ini, Anda dapat memeriksa daftar serial/anime favorit saya yang saya buat untuk melacak apakah ada episode baru dari salah satunya yang dirilis dengan proyek saya.

Saya menambahkan The Late Late Show untuk menguji kode saya karena ini adalah acara harian.

1) One Piece

ID TV:1505

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

2) Akademisi Pahlawan Saya

ID TV:13615

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

3) Dunia Barat

ID TV:1371

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

4) The Simpsons

ID TV:83

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

5) Pertunjukan Terlambat dengan James Corden

ID TV:2831

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

Langkah 4:Mengembangkan Serial TV / Anime Release Date Tracker (aplikasi) yang berjalan di Raspberry Pi di PHP dan membuat tabel serial untuk memasukkan data

Saya mengembangkan Pelacak Tanggal Rilis Serial TV / Anime di PHP dan menjelaskan kode sumber aplikasi di bagian Penjelasan Kode di bawah ini bagi yang berminat.

Namun, jika Anda tidak menyukai pengembangan web dengan PHP, Anda dapat mengunduh aplikasi di Unduhan - bernama TV-Series-Anime-Episode-Tracker.zip - dan mengunggahnya ke Raspberry Pi tanpa menyelami koding PHP.

Unggah :

Dengan langkah-langkah berikut, instal Pelacak Tanggal Rilis Serial TV / Anime di localhost:

  • Unduh aplikasi - TV-Series-Anime-Episode-Tracker.zip - termasuk file index.php dan query.php.

  • Ekstrak Serial TV-Anime-Episode-Tracker.zip.

  • Pindahkan folder aplikasi (TV-Series-Anime-Episode-Tracker) dari Unduhan ke server (/var/www/html) dengan menggunakan terminal karena server apache adalah lokasi yang dilindungi.

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

  • Buka Pelacak Tanggal Rilis Serial TV / Anime:

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

Fitur :

1) Setelah instalasi, buka aplikasi untuk membuat tabel bernama seri di database (tvseries). Saat Anda pertama kali membuka file index.php, aplikasi membuat tabel bernama seri secara otomatis dan memberi tahu pengguna - Tabel Database Dibuat!

2) Jika tabel database (seri) berhasil dibuat dalam database, aplikasi menginformasikan pengguna - Tabel Database Ditemukan!

3) Setelah membuat tabel database (seri), untuk menyisipkan variabel yang diperlukan untuk TVMAZE REST API untuk setiap acara dalam daftar Anda, lakukan langkah-langkah berikut:

  • Jalankan perintah MySQL ini di jendela terminal:

sudo mysql -uroot -p

  • Masukkan kata sandi root - bot
  • Pilih serial tv basis data:

GUNAKAN serial tv;

  • Sisipkan variabel yang diperlukan - nama serial, ID TV, status - ke tabel untuk setiap acara. Variabel status digunakan oleh aplikasi untuk memberi tahu pengguna tanpa berulang saat episode baru dirilis pada tanggal tertentu.

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

5) Pada query.php, aplikasi membuat permintaan ke TVMAZE REST API untuk mendeteksi apakah episode baru acara dalam database sedang dirilis. Jika TVMAZE REST API mengembalikan serangkaian info episode lengkap dari episode yang dirilis, aplikasi akan mencetak informasi yang dapat dikumpulkan oleh Arduino Nano 33 IoT sekali untuk mencegah pengulangan.

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

%Series_Name%Season%Episode_Number%Episode_Name%

%Pertunjukan Terlambat Terlambat%2020%91%Jason Schwartzman, Alicia Key%

6) Jika tidak, aplikasi akan mencetak Tidak Ditemukan Entri!

Penjelasan Kode :

1) index.php

  • Tentukan pengaturan koneksi database - "localhost", "root", "bot", "tvseries".
  • Di checkDatabase() fungsi, mendeteksi apakah ada tabel database dalam nama yang diberikan - seri.
  • Dalam createTable() fungsi, buat tabel seri jika tidak ditemukan di database dan beri tahu pengguna.

2) query.php

  • Dalam kueri kelas, tentukan jalur ke TVMAZE API untuk membuat permintaan.
  • Dalam define_user() fungsi, dapatkan pengaturan koneksi dan nama tabel.
  • Dalam check_ep_release_date() fungsi, menggunakan file_get_contents() fungsi, mendeteksi apakah episode baru dirilis untuk ID TV tertentu pada tanggal saat ini. Ubah variabel status dalam database dari Tertunda menjadi Dirilis jika episode baru sedang dirilis untuk mencegah pengulangan.
  • Di track_db_entries() fungsi, jalankan check_ep_release_date() untuk setiap pertunjukan yang terdaftar di tabel database - seri.

Langkah 4.1:Menjalankan aplikasi web tanpa Raspberry Pi

Untuk pelanggan situs web saya (TheAmplituhedron), saya mengembangkan versi gratis dari Pelacak Tanggal Rilis Serial TV / Anime untuk mereka yang tidak memiliki Raspberry Pi atau ingin menggunakannya sebagai host untuk proyek ini.

Ini menyediakan antarmuka yang ramah pengguna untuk mengelola database. Jika Anda ingin menggunakan antarmuka ini dengan proyek Anda daripada menggunakan terminal pada Raspberry Pi untuk memasukkan data, silakan hubungi saya.

Buka aplikasi:

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

Langkah 5:Menyiapkan Arduino Nano 33 IoT

Jika Anda seorang pemula dalam pemrograman dengan Arduino Nano 33 IoT:jangan khawatir, ini mudah digunakan dengan Arduino IDE. Cukup unduh driver yang diperlukan - Arduino SAMD Core - juga dijelaskan di sini.

Untuk dapat terhubung ke WiFi melalui Arduino Nano 33 IoT, unduh library WiFiNINA dari sini.

Untuk mencetak teks dan menggambar grafik di Layar Nokia 5110, unduh perpustakaan LCD5110_Basic dari sini.

Saya menggunakan port serial kedua (Serial1) pada Arduino Nano 33 IoT untuk berkomunikasi dengan Serial MP3 Player.

Port Serial pada Arduino Nano 33 IoT :

"Konektor USB papan terhubung langsung ke pin host USB SAMD21. Perutean ini memungkinkan Anda untuk menggunakan Arduino NANO 33 IoT sebagai periferal USB klien (bertindak sebagai mouse atau keyboard yang terhubung ke komputer ) atau sebagai perangkat USB host sehingga perangkat seperti mouse, keyboard, atau ponsel Android dapat terhubung ke Arduino NANO 33 IoT. Port ini juga dapat digunakan sebagai port serial virtual menggunakan objek Serial dalam bahasa pemrograman Arduino . Pin RX0 dan TX1 adalah port serial kedua yang tersedia sebagai Serial1."

Kemudian, Arduino Nano 33 IoT siap untuk mengeksekusi kode proyek :)

Langkah 6:Mengirim perintah ke Serial MP3 Player (OPEN-SMART)

Saya membuat playlist yang berisi lagu pembuka dari serial/daftar anime favorit saya dalam proyek ini:

1) One Piece - Pembukaan | Dengarkan

2) Akademi Pahlawan Saya - Pembukaan | Dengarkan

3) Westworld - Pembukaan | Dengarkan

4) The Simpsons - Pembukaan | Dengarkan

5) Pertunjukan Terlambat - Pembukaan | Dengarkan

Jika mau, Anda dapat mengunduh daftar putar saya di folder zip - opening_songs.zip.

Sangat mudah untuk menggunakan Serial MP3 Player dengan Arduino Nano 33 IoT selama Anda mengetahui perintah UART yang diperlukan untuk memicu fungsi yang tepat. Saya menggunakan modul Serial MP3 Player dengan Speaker oleh OPEN-SMART. Jadi, jika Anda memiliki Serial MP3 Player dengan nama merek yang berbeda, perintah di bawah ini tidak akan berfungsi untuk Anda.

Ikuti petunjuk dari panduan:

"Modul ini adalah sejenis perangkat pemutar MP3 sederhana yang didasarkan pada chip audio MP3 berkualitas tinggi. Modul ini dapat mendukung frekuensi pengambilan sampel 8k Hz ~ 48k Hz format file MP3 dan WAV. Ada soket kartu TF di papan , sehingga Anda dapat mencolokkan kartu micro SD yang menyimpan file audio. MCU dapat mengontrol status pemutaran MP3 dengan mengirimkan perintah ke modul melalui port UART, seperti mengganti lagu, mengubah volume dan mode putar, dan sebagainya. Anda juga dapat debug modul melalui USB ke modul UART. Ini kompatibel dengan Arduino / AVR / ARM / PIC."

"Pastikan kartu micro SD Anda diformat sebagai FAT16 atau FAT32 dan ada beberapa lagu di dalamnya. Anda harus membuat folder "01" dan "02", dan meletakkan beberapa lagu dengan nama 001xxx.mp3 / 002xxx.mp3 / 003xxx.mp3 di dalamnya."

Dengan kata lain, untuk dapat menjalankan perintah secara akurat, simpan lagu Anda di folder bernama '01' dan tambahkan nomor berurutan ke nama lagu - 001One Piece-Opening.mp3, 002My Hero Academia-Opening.mp3, dll.

Untuk mengirim perintah UART ke Serial MP3 Player dengan Arduino Nano 33 IoT, saya membuat fungsi bernama send_command_to_MP3_player . Ini mentransfer setiap byte dalam perintah yang diminta ke Serial MP3 Player melalui port serial kedua pada pin RX0 dan TX1 - Serial1 - tergantung pada panjang perintah yang diminta - 4, 5, atau 6.

Seperti yang ditunjukkan di bawah ini, pisahkan perintah yang ingin Anda kirim ke Serial MP3 Player dengan byte - 0x7e. Semua perintah dimulai dengan '7E' dan diakhiri dengan 'EF'. Byte kedua adalah jumlah byte di antara - '02', '03', '04'. Di bawah ini, unduh manual Serial MP3 Player oleh OPEN-SMART untuk memeriksa semua perintah dan mendapatkan instruksi yang lebih detail.

// Tentukan Perintah Pemutar MP3 yang diperlukan.
// Anda dapat memeriksa semua perintah yang diberikan dari halaman proyek:
// Pilih perangkat penyimpanan ke kartu TF
static int8_t pilih_SD_card[] ={0x7e, 0x03, 0X35, 0x01, 0xef}; // 7E 03 35 01 EF
// Putar lagu dengan direktori:/01/001xxx.mp3
static int8_t play_song_1[] ={0x7e, 0x04, 0x41, 0x00, 0x01, 0xef}; // 7E 04 41 00 01 EF
// Putar lagu dengan direktori:/01/002xxx.mp3
static int8_t play_song_2[] ={0x7e, 0x04, 0x41, 0x00, 0x02, 0xef}; // 7E 04 41 00 02 EF
// Putar lagu dengan direktori:/01/003xxx.mp3
static int8_t play_song_3[] ={0x7e, 0x04, 0x41, 0x00, 0x03, 0xef}; // 7E 04 41 00 03 EF
// Putar lagu dengan direktori:/01/004xxx.mp3
static int8_t play_song_4[] ={0x7e, 0x04, 0x41, 0x00, 0x04, 0xef}; // 7E 04 41 00 04 EF
// Putar lagu dengan direktori:/01/005xxx.mp3
static int8_t play_song_5[] ={0x7e, 0x04, 0x41, 0x00, 0x05, 0xef}; // 7E 04 41 00 05 EF
// Putar lagunya.
static int8_t play[] ={0x7e, 0x02, 0x01, 0xef}; // 7E 02 01 EF
// Menjeda lagu.
static int8_t pause[] ={0x7e, 0x02, 0x02, 0xef}; // 7E 02 02 EF
// Lagu berikutnya.
static int8_t next_song[] ={0x7e, 0x02, 0x03, 0xef}; // 7E 02 03 EF
// Lagu sebelumnya.
static int8_t sebelumnya_song[] ={0x7e, 0x02, 0x04, 0xef}; // 7E 02 04 EF

Langkah 7:Memprogram Arduino Nano 33 IoT

  • Sertakan perpustakaan yang diperlukan.
  • Tentukan setelan WiFi Anda - SSID dan sandi.
  • Masukkan alamat IPA Raspberry Pi Anda.
  • Menentukan jalur aplikasi (query.php) di Raspberry Pi.
  • Inisialisasi pustaka klien Ethernet.
  • Tentukan pengaturan layar Nokia 5110.
  • Tentukan grafik untuk mode layar terkait - tv dan musik.
  • Untuk membuat grafik yang berbeda (gambar monokrom), buka Monochrome Image Converter.
  • Tentukan Perintah Pemutar MP3 yang diperlukan.
  • Tentukan opsi dan mode menu menggunakan boolean yang mudah menguap.
  • Tentukan tombol kontrol dan pin LED RGB.
  • Memulai komunikasi serial untuk Modul Pemutar MP3 Serial pada port serial kedua - Serial1 .
  • Hubungkan ke jaringan Wi-Fi.
  • Verifikasi koneksi pada monitor serial dan Layar Nokia 5110.
  • Dalam read_buttons() fungsi, dapatkan data dari tombol kontrol - Kanan, OK, Kiri, dan Keluar.
  • Dalam change_menu_options() , menambah atau mengurangi nomor opsi menggunakan tombol Kanan dan Kiri.
  • Di antarmuka() fungsi, cetak antarmuka (menu).
  • Jika Init Tracker mode dipilih, sambungkan ke aplikasi web bernama Pelacak Tanggal Rilis Serial TV / Anime.
  • Jika ada byte masuk yang tersedia, dapatkan respons dari aplikasi web.
  • Menggunakan endsWith() fungsi, mendeteksi apakah respons memiliki simbol persentase (pembatas) di dalamnya atau tidak.
  • Jika disertakan, pisahkan string respons dengan pembatas yang telah ditentukan dengan cara yang sederhana. '%'(persentase) didefinisikan sebagai pembatas dalam proyek ini.
  • Kumpulkan informasi sebagai substring - Series_Name, Season, Episode, Episode_Name.
  • Cetak informasi dan putar lagu pembuka dari serial/anime yang dirilis hingga dihentikan.
  • Tunggu sampai tombol Keluar ditekan.
  • Jika ada respon kosong, print Tidak Ada Episode yang Dilepaskan Terdeteksi :(
  • Gambar ikon TV sambil menghitung permintaan baru.
  • Tunggu sampai permintaan berikutnya.
  • Jika mode Pemutar MP3 dipilih, gambar ikon pemutar musik. Kontrol Pemutar MP3 dengan tombol kontrol - Kanan, Kiri, Oke.
  • Jika mode Tidur is selected, activate the sleep mode in 10 seconds and print the remaining seconds.

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

Kode

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

Custom parts and enclosures

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

Skema


Proses manufaktur

  1. Raspberry Pi Universal Remote
  2. Sepotong Raspberry Pi
  3. Cycle Chaser
  4. Detektor Pencuri Raspberry Pi
  5. Sensor Suhu Raspberry Pi
  6. RASPBERRY PI HOME AUTOMATION
  7. MODEL B RASPBERRY PI 3 BARU + FITUR DAN PEMBELIAN
  8. Robot Kotak CD Raspberry Pi
  9. RaspiRobot Board V2
  10. Rover