Semua Tentang Belajar Teknologi Digital Dalam Kehidupan Sehari - Hari

  • IC Timer 555 yang Multifungsi

    IC timer 555 adalah sirkuit terpadu (chip) yang digunakan dalam berbagai pembangkit timer, pulsa dan aplikasi osilator. Komponen ini digunakan secara luas, berkat kemudahan dalam penggunaan, harga rendah dan stabilitas yang baik

  • Data Science

    Mengulik Digitalisasi data statistik dengan bantuan python untuk pemanfaatan di bidang transportasi, kesehatan, keuangan dan masih banyak lagi

  • Artificial Intelligence - Pengenalan Object

    Menghadirkan pemanfaatan AI dengan praktek-praktek yang mudah diikuti - cocok untuk mahasiswa yang mencari ide tugas akhir

  • JAM DIGITAL 6 DIGIT TANPA MICRO FULL CMOS

    Jika anda pencinta IC TTL datau CMOS maka project jam digital ini akan menunjukkan bahwa tidak ada salahnya balik kembali ke dasar elektronika digital , sebab semuanya BISA dibuat dengan teknologi jadul

  • Node Red - Kontrol Industri 4.0

    Teknologi kontrol sudah melampaui ekspektasi semua orang dan dengan kemajuan dunia elektronika, kini semakin leluasa berkreasi melalui Node Red

Selasa, 23 Desember 2025

Inovasi SmartLamp : Integrasi YOLO dan IoT untuk Penerangan Jalan Berbasis Kepadatan Lalu Lintas

Pernahkah Anda membayangkan sebuah sistem lampu jalan yang tidak hanya menyala berdasarkan waktu, tetapi juga merespons kondisi nyata di lapangan? Sebuah proyek inovatif bertajuk "SmartLamp Otomatis dengan CCTV Times Square" baru saja dikembangkan untuk menjawab tantangan efisiensi energi dan manajemen lalu lintas cerdas. Proyek ini memanfaatkan teknologi deteksi objek terkini dan ekosistem IoT untuk menciptakan sistem penerangan yang adaptif.


Bagaimana Cara Kerjanya?


Sistem ini bekerja dengan mengintegrasikan beberapa platform canggih untuk memproses data visual menjadi aksi nyata pada perangkat keras. Berikut adalah alur proses utamanya:

1. Pengambilan Data Real-Time: Proyek ini menggunakan sumber data berupa live streaming CCTV dari website EarthCam, dengan lokasi spesifik di Times Square, New York City, salah satu persimpangan tersibuk di dunia.




2. Deteksi Objek dengan AI: Data video diakses menggunakan link M3U8 dan diproses di Google Colab menggunakan bahasa Python,. Di sini, model YOLO (You Only Look Once) digunakan untuk mendeteksi dan menghitung jumlah objek (seperti kendaraan atau pejalan kaki) dalam frame video yang diambil setiap 10 detik.


Simulasi untuk python-yolo ada di google colab klik disini


3. Klasifikasi Kepadatan: Hasil perhitungan objek kemudian dikategorikan ke dalam tingkat kepadatan 1 hingga 4 (dari sepi hingga sangat ramai),. Sebagai contoh, jika terdeteksi banyak objek (misalnya 33 objek), sistem akan mengkategorikannya ke level 4 atau "sangat ramai".

4. Komunikasi Data via MQTT: Tingkat kepadatan ini dikirimkan melalui protokol MQTT ke mikrokontroler ESP32,. MQTT dipilih karena kemampuannya dalam pengiriman data secara real-time yang membutuhkan koneksi internet stabil.



5. Eksekusi IoT di Simulator: Pada sisi perangkat keras (yang disimulasikan melalui Wokwi), ESP32 menerima data tersebut dan mengatur output-nya,. Jika tingkat kepadatan mencapai level 4, maka intensitas lampu akan diatur ke 100% dan motor servo akan bergerak ke posisi 180 derajat.


Teknologi dan Tools yang Digunakan


Proyek ini merupakan perpaduan antara Data Science dan Internet of Things. Beberapa alat utama yang digunakan meliputi:

• Google Colab & Python: Untuk membangun model deteksi objek dengan library computer vision,.

• VS Code & PlatformIO: Digunakan untuk menulis program berbasis C++ bagi mikrokontroler,.

• Wokwi: Platform simulator untuk menjalankan proyek IoT secara virtual,.

• Komponen Elektronika: ESP32 sebagai otak sistem, Liquid Crystal (LCD) I2C untuk menampilkan status, serta motor servo dan lampu sebagai indikator fisik,.


Kesimpulan

Proyek SmartLamp ini membuktikan bahwa integrasi antara Artificial Intelligence (AI) dan IoT dapat memberikan solusi cerdas bagi infrastruktur perkotaan. Dengan mendeteksi tingkat kepadatan lalu lintas secara otomatis, penggunaan energi untuk lampu jalan dapat dioptimalkan sesuai kebutuhan di lokasi tersebut.

Sistem ini layaknya seorang petugas lalu lintas yang memiliki mata elang, ia tidak hanya melihat seberapa gelap malam itu, tetapi juga mengamati seberapa sibuk jalanan, lalu memutuskan seberapa terang cahaya yang dibutuhkan untuk menjaga keamanan semua orang.


--------------------------------------------------------------------------------

Informasi dalam blog ini disusun berdasarkan pemaparan tugas UAS matkul Komputasi berjaringan oleh Zaskhia Artina Isnalifah, mahasiswa S2 Informatika Unesa 2025.




Share:

Pzem 017 - DC Power Meter dan Monitoring IOT-MQTT-HTML di Github



Kebutuhan akan energi listrik searah (DC) dalam berbagai aplikasi,seperti sistem tenaga surya (PLTS), sistem penyimpanan energi menggunakan aki, dan beban lampu DC, menuntut adanya pengawasan yang presisi terhadap parameter operasionalnya. 

Pemantauan terhadap tegangan (voltage), arus (current), dan daya (power) sangat penting untuk menjaga kesehatan baterai serta memastikan efisiensi konsumsi beban listrik. Pengukuran manual menggunakan multimeter konvensional seringkali tidak efisien untuk pengamatan jangka panjang karena tidak dapat merekam data secara kontinu dan real-time. (Saputra dkk., 2022).

Modul sensor PZEM-017 muncul sebagai solusi teknologi yang efektif untuk kebutuhan tersebut. Berdasarkan penelitian, PZEM-017 memiliki tingkat akurasi yang sangat tinggi dalam pembacaan parameter listrik DC, dengan tingkat akurasi pembacaan tegangan mencapai 99,98%, arus 98,08%, dan daya 98,33%. Sensor ini menggunakan protokol komunikasi Modbus-RTU melalui antarmuka RS485 yang memungkinkan transmisi data digital yang stabil bahkan dalam lingkungan dengan gangguan interferensi elektromagnetik. (Solar-Thailand, n.d.; Iswahyudi dkk., 2025).



Akses ke Pzem 04 & 017 - Python - Modbus baca disini 


Integrasi perangkat keras dengan platform perangkat lunak modernseperti Python memberikan fleksibilitas dalam pemrosesan data. Python mampu menjalankan fungsi kalkulasi dan mengirimkan data secara sinkron ke antarmuka berbasis web. Dengan memanfaatkan dashboard HTML yang dideploy melalui GitHub Pages, data monitoring dapat diakses secara daring, memungkinkan pengguna untuk memantau status aki dan beban lampu dari jarak jauh. 

Melalui percobaan ini, penggunaan PZEM-017 dengan suplai aki 12V dan beban lampu didokumentasikan untuk menganalisis performa sistem kelistrikan DC secara menyeluruh.


Berdasarkan latar belakang yang telah dijabarkan diatas, maka formula yang akan diusulkan pertanyaannya pada percobaan ini adalah:

1. Bagaimana cara integrasi sensor PZEM-017 dengan bahasa pemrograman Python sehingga sensor mampu membaca parameter energi listrik DC yang sesuai?

2. Bagaimana dampak pemberian beban lampu terhadap stabilitas tegangan serta seberapa besar arus yang dikonsumsi oleh suplai aki 12V?

3. Bagaimana cara merancang antarmuka dashboard monitoring berbasis web dengan desain HTML agar dapat dipantau secara real time?

4. Berapa tingkat akurasi dan reaktifitas sebua sensor terhadap perobahan parameter saat beban dipasang?


Pada percobaan kali ini terdapat beberapa komponen utama dan beberapa komponen penunjang yang masing masing memeliki peran penting untuk menunjang keberhasilan dalam percobaan. Komponen penunjang yang berperan penting tersebut dijelaskan sebagai berikut:


1. Modul PZEM-017 (DC)



PZEM-017 adalah modul elektronik yang dirancang khusus untuk mengukur parameter listrik DC seperti tegangan, arus, daya, dan energi. Modul ini menggunakan komunikasi RS485 melalui protokol Modbus-RTU, yang memungkinkan data dibaca secara akurat oleh mikrokontroler atau komputer melalui bantuan konverter serial.


2.  Komunikasi Serial & Python


Python digunakan sebagai bahasa perantara untuk membaca data dari sensor. Dengan pustaka (library) tertentu, Python dapat mengambil data mentah dari sensor PZEM dan mengolahnya menjadi informasi numerik yang dapat ditampilkan atau dikirim ke server web.


3. Dashboard Monitoring (HTML & GitHub Pages)


Visualisasi data dilakukan melalui dashboard berbasis HTML. Penggunaan GitHub Pages memungkinkan data tersebut diakses secara daring melalui URL tertentu, sehingga pemantauan tidak terbatas pada layar lokal komputer saja.


4.  Aki (Baterai Lead-Acid)

Aki atau baterai lead-acid merupakan perangkat elektrokimia yang berfungsi sebagai penyimpan energi listrik dalam bentuk energi kimia. Pada percobaan ini, aki 12V digunakan sebagai sumber tegangan utama (suplai) untuk sistem monitoring. Menurut literatur, aki memiliki karakteristik tegangan yang akan menurun seiring dengan besarnya beban yang diberikan (voltage drop). Penurunan tegangan inidipengaruhi oleh hambatan dalam baterai dan laju pengosongan arus (discharge rate).


5.  Beban Lampu


Lampu DC dalam sistem ini bertindak sebagai beban resistif yang mengonsumsi energi dari suplai aki. Lampu merupakan komponen yang mengubah energi listrik menjadi energi cahaya. Besarnya arus yang ditarik oleh lampu berbanding lurus dengan daya lampu tersebut dan berbanding terbalik dengan tegangan suplai sesuai dengan Hukum Ohm ( P = V x I). 

Penggunaan lampu sebagai beban bertujuan untuk melihat kemampuan sensor PZEM dalam merespons lonjakan arus dan perubahan daya secara real-time saat beban diaktifkan.


6. Shunt Resistor


Shunt resistor adalah komponen elektronika yang memiliki nilai hambatan sangat rendah dan presisi, yang dipasang secara seri dengan beban. Prinsip kerja shunt resistor didasarkan pada Hukum Ohm, di mana arus yang mengalir melalui hambatan tersebut akan  menghasilkan beda potensial (tegangan drop) yang sangat kecil.

Tegangan drop inilah yang kemudian dibaca oleh modul PZEM-017 untuk dikonversi menjadi nilai arus (Ampere). Dalam pengujian arus besar (seperti penggunaan aki dan lampu), shunt resistor berfungsi agar sensor tidak rusak akibat panas berlebih karena arus tidak langsung mengalir melalui sirkuit utama sensor, melainkan melalui hambatan eksternal ini.


Prosedur Pemasangan


1. Langkah pertama adalah menyiapkan alat dan bahan untuk kemudian akan dirangkai.

2. Alat yang diperlukan ialah sensor PZEM-017, Shunt Resistor, Modul rs-485, dan Aki 12V.

3. Kemudian merangkai sistem dengan menghubungkan Aki ke beban. Shunt Resistor dipasang secara seri pada jalur negatif (kutub negatif aki ke shunt, lalu shunt ke beban) sesuai diagram wiring PZEM-017.

4. Menghubungkan kabel data sensor PZEM-017 ke modul RS485 to USB, lalu dicolokkan ke port USB Laptop.

5. Jangan lupa untuk menjalankan program Python yang telah disesuaikan untuk membaca register Modbus PZEM-017 (DC) pada Visual Studio Code.

6. Memastikan pembacaan data Tegangan, Arus, dan Daya muncul pada terminal Python.

7. Mengirimkan data ke broker MQTT dan membuka dashboard.

8. Membuat repositori di GitHub dan mengunggah file index.html untuk dashboard monitoring.

9. Mengatur konfigurasi GitHub Pages pada pengaturan branch main dan folder root.

10. Menghubungkan sensor PZEM ke sumber daya aki 12V dan beban lampu.

11. Lalu hubungkan rangkaian ke suplai agar beban dapat menyala sehingga nantinya informasi seperti te gangan, arus, dan daya akan muncul pada dashboard html.


Cara kirim data pzem ke web github melalui MQTT baca disini. 




Berdasarkan pengujian yang telah dilakukan dengan menggunakan suplai aki 12V dan beban lampu DC, berikut adalah data hasil pengukuran yang diperoleh melalui dashboard monitoring:

Parameter Tegangan (Voltage):

Sistem membaca tegangan pada nilai 9,00 Volt. Terjadi voltage drop (penurunan tegangan) yang cukup signifikan dari nilai nominal aki 12V. Hal ini menunjukkan beban lampu menarik daya yang cukup besar atau kondisi State of Charge (SoC) aki yang sedang menurun.

Parameter Arus (Current):

Arus yang mengalir pada rangkaian terdeteksi sebesar 8,24 Ampere. Nilai ini menunjukkan beban lampu yang digunakan memiliki resistansi rendah sehingga menarik arus yang cukup tinggi dari suplai.

Parameter Daya (Power):

Daya listrik yang dikonsumsi oleh beban adalah sebesar 70,1 Watt. Hasil ini didapatkan dari perkalian real-time antara tegangan (9V) dan arus (8,34A).

Visualisasi Grafik:

Dashboard menampilkan grafik garis yang stabil namun meningkat tajam saat lampu dinyalakan. Grafik arus dan daya menunjukkan responsivitas sensor PZEM-003 yang sangat cepat dalam menangkap perubahan status beban (dari OFF ke ON).

Konektivitas Data:

Integrasi antara Python (sebagai pengolah data serial) dan GitHub Pages (sebagai host dashboard) berjalan tanpa kendala (delay rendah), sehingga data yang tampil di web sinkron dengan kondisi fisik di lapangan.




Bersama mahasiswa kelas Elektronika Daya D4 Teknik Listrik Vokasi Unesa 2024 (I). Link pengumpulan tugas lengkap disini : https://drive.google.com/drive/folders/1zgWdeR1pKQIqIM51rKrKw9vubsfMuFG3?usp=sharing


Share:

Praktek AGV Sequence Controller Bersama D4 TRO UNESA 2025



Perkembangan teknologi otomasi saat ini semakin pesat, terutama dalam bidang sistem kendali berbasis mikrokontroler. Salah satu aplikasi nyata dari otomasi adalah Automated Guided Vehicle (AGV), yaitu kendaraan yang mampu bergerak secara otomatis tanpa pengemudi. Meskipun AGV industri bersifat kompleks, konsep dasarnya dapat dipelajari melalui prototipe sederhana yang menggunakan komponen elektronik dan pemrograman dasar.

Dalam mata kuliah Komputasi Dasar, mahasiswa diperkenalkan pada logika pemrograman dan penerapannya dalam sistem fisik nyata. AGV sederhana yang dikendalikan melalui kode angka (misalnya: 1 = maju, 2 = mundur, dst.) menjadi sarana efektif untuk memahami integrasi antara perintah digital, mikrokontroler, dan aktuator seperti motor. Proyek ini tidak hanya melatih kemampuan komputasi, tetapi juga pemahaman terhadap sistem kendali otomatis yang menjadi fondasi teknologi industri 4.0.


Pengertian AGV



Automated Guided Vehicle (AGV) adalah kendaraan beroda yang mampu melakukan transportasi material secara otomatis tanpa kehadiran pengemudi. Sejak pertama kali dikembangkan pada 1950-an, AGV telah mengalami perkembangan pesat dan kini menjadi komponen penting dalam sistem logistik cerdas era Industri 4.0. AGV banyak digunakan di berbagai sektor, seperti pabrik otomotif, sistem manufaktur fleksibel (FMS), gudang logistik, pelabuhan kontainer, hingga sektor kesehatan. Menurut Guo et al. (2023), AGV modern tidak hanya berfungsi sebagai alat angkut, tetapi juga sebagai bagian dari sistem siber- fisik yang terintegrasi melalui teknologi Internet of Things (IoT). 

Di sisi lain, S ̧enaras et al. (2023) menekankan bahwa AGV berbiaya rendah yang umumnyamenggunakan sensor magnetik dan mengikuti jalur pita magnet di lantai semakin populer di industri kecil menengah karena investasinya lebih terjangkau. Namun, kelemahan utama AGV murah adalah efisiensi rendah akibat sistem yang terdesentralisasi dan hanya melayani satu sirkuit AGV, sehingga waktu tunggu di stasiun produksi tidak dapat dimanfaatkan secara optimal. Dalam konteks pendidikan dan pengembangan teknologi awal seperti pada laporan ini, AGV sederhana menjadi sarana efektif untuk mempelajari prinsip dasar otomasi, navigasi, dan kendali otomatis.


Mikrokontroler dan Perannya dalam Sistem Kendali

Mikrokontroler merupakan komponen inti dalam sistem AGV modern, terutama pada prototipe berbiaya rendah. Ia berfungsi sebagai “otak” yang mengolah input dari pengguna atau sensor, mengeksekusi logika pemrograman, lalu mengirim sinyal ke aktuator seperti motor penggerak. Dalam penelitian Chenet al. (2021), sistem AGV roda omnidirectional dikendalikan menggunakan mikrokontroler Microchip dsPIC30F6010A yang terintegrasi dengan sensor MPU- 9250 untuk memantau kecepatan longitudinal, transversal, dan sudut kemudi. 

Hal ini menunjukkan bahwa mikrokontroler tidak hanya bertindak sebagai penghubung antara perangkat lunak dan keras, tetapi juga sebagai platform untuk implementasi algoritma kendali canggih, seperti estimasi slip dan kompensasi gerakan. Pada AGV sederhana seperti dalam laporan ini, mikrokontroler (misalnya Arduino Uno) digunakan untuk menerima input berupa kode angka melalui antarmuka serial, lalu mentranslasikannya menjadi perintah gerakan spesifik: maju, mundur, belok kiri, atau berhenti. 

S ̧enaras et al. (2023) juga menyebut bahwa AGV berbiaya rendah umumnya menggunakan Programmable Logic Controller (PLC) atau sistem tertanam (embedded system), yang pada dasarnya memiliki fungsi serupa dengan mikrokontroler. Dengan demikian, peran mikrokontroler sangat sentral dalam merealisasikan sistem kendali otomatis yang responsif, fleksibel, dan dapat dipelajari secara langsung dalam lingkungan akademik.


Prinsip Kendali Berbasis Kode Angka




Kendali berbasis kode angka adalah pendekatan alternatif dalam mengoperasikan AGV yang mengandalkan input numerik sebagai perintah gerakan, menggantikan penggunaan remote control konvensional atau sistem navigasi otonom berbasis sensor lingkungan. Dalam sistem ini, setiap angka merepresentasikan aksi spesifik: misalnya, kode 1 untuk maju, 2 untuk mundur, 3 untuk belok kiri, 4 untuk kanan, dan 0 untuk berhenti. Pendekatan ini sangat sesuai untuk prototipe AGV sederhana karena strukturnya ringkas, mudah diprogram, dan tidak memerlukan perangkat keras tambahan yang kompleks.

Meskipun Guo et al. (2023) dan (Åženaras et al., 2023) membahas sistem AGV multi-agen dengan alokasi tugas terdistribusi dan optimisasi armada, prinsip dasar mereka tetap relevan: setiap perintah harus jelas, tidak ambigu, dan dapat diproses secara real-time. Dalam konteks pendidikan, sistem berbasis kode angka memungkinkan mahasiswa memahami secara langsung hubungan antara logika komputasi dan respons fisik. Selain itu, seperti yang dijelaskan oleh (Chen et al., 2021), akurasi gerakan AGV sangat dipengaruhi oleh kemampuan sistem dalam menafsirkan input dan mengkompensasi gangguan seperti slip roda. 

Dengan mengintegrasikan kode angka ke dalam struktur kendali, mahasiswa dapat bereksperimen dengan berbagai skenario gerakan, mengembangkan algoritma sederhana, dan membangun fondasi pemahaman untuk sistem AGV yang lebih kompleks di masa depan.



Diagram Sistem dan Rangkaian



Sistem AGV ini dirancang dengan arsitektur terdesentralisasi sederhana yang terdiri dari tiga subsistem utama: input, pemrosesan, dan output:


1. Input: Sebelum mengirim perintah, pengguna terlebih dahulu harus memastikan bahwa smartphone-nya terhubung ke jaringan WiFi dengan nama "MyAGV", yang merupakan hotspot yang dihasilkan oleh modul WiFi pada AGV. 

Setelah terhubung, pengguna membuka aplikasi browser (misalnya Google Chrome) dan mengakses alamat 192.168.4.1 untuk membuka antarmuka kendali berbasis web. Pada antarmuka tersebut, pengguna dapat menginput kode angka (0–4) secara real-time untuk mengendalikan gerakan AGV. 

Pendekatan berbasis kode diskrit ini menggantikan fungsi remote control fisik, memungkinkan pengguna memberikan perintah gerakan secara eksplisit melalui antarmuka digital. Setiap angka merepresentasikan aksi spesifik misalnya: 1 = maju, 2 = mundur, 3 = belok kiri, 4 = belok kanan, dan 0 = berhenti sehingga memperjelas hubungan langsung antara perintah digital dan respons fisik AGV.

2. Pemrosesan: Mikrokontroler (misalnya ESP32 atau Arduino dengan modul WiFi) berperan sebagai unit kendali terdesentralisasi yang menerima input dari smartphone, mengeksekusi logika pemrograman, lalu menentukan pola gerakan yang sesuai. Mikrokontroler ini berfungsi sebagai “otak lokal” yang memproses perintah secara mandiri, tanpa bergantung pada sistem kendali pusat sesuai dengan prinsip sistem AGV terdistribusi seperti yang diusulkan oleh Guo et al. (2023), di mana setiap agen mampu mengambil keputusan secara otonom.


3. Output: Sinyal digital dari mikrokontroler dikirim ke driver motor yang kemudian mengatur arah dan kecepatan motor DC sesuai perintah. Driver motor berfungsi sebagai aktuator interface yang mengubah sinyal logika dari mikrokontroler menjadi daya listrik yang cukup untuk menggerakkan roda AGV.


PCB Rangkaian remote AGV (bisa dibeli online, jangan rusak aslinya)



Penjelasan merubah RC menjadi Wifi  klik disini .

Desain sistem ini tidak hanya memenuhi kebutuhan pembelajaran dasar komputasi dan otomasi, tetapi juga mencerminkan prinsip efisiensi pada AGV berbiaya rendah. Dengan arsitektur terdesentralisasi, sistem mampu mengurangi ketergantungan pada infrastruktur kendali pusat, sekaligus membuka jalan bagi pengembangan sistem multi-AGV di masa depan sebagaimana ditekankan dalam penelitian S ̧enaras et al. (2023) tentang AGV pools dan alokasi tugas berbasis fleksibilitas lokal.


Penjelasan Kode

Sistem AGV pada laporan ini dikendalikan secara nirkabel melalui komunikasi WiFi. Smartphone pengguna dan mikrokontroler terhubung ke jaringan WiFi yang sama, sehingga perintah berupa kode angka (1–5) dapatdikirim dari smartphone ke AGV secara real-time.


Koding lengkap di github klik disini .


Pada sisi mikrokontroler, program berjalan dalam dua bagian utama:

1. Penerimaan data via WiFi. Mikrokontroler bertindak sebagai server kecil. Ketika smartphone mengirim kode (misal lewat aplikasi sederhana, browser, atau Serial Monitor nirkabel), mikrokontroler menerima data

tersebut dalam bentuk string atau karakter.

2. Eksekusi perintah. Setelah menerima input, program menggunakan struktur if-else atau switch-case untuk menjalankan fungsi gerakan sesuai kode:


o 1 → maju

o 2 → belok kiri

o 3 → belok kanan

o 4 → mundur

o 5 → berhenti


Setiap fungsi mengatur sinyal ke driver motor untuk mengubah arah putaran motor kiri dan kanan. Misalnya, saat menerima kode 3 (belok kiri), motor kiri dijalankan mundur sementara motor kanan maju, sehingga AGV berputar ke kiri.





Untuk pengembangan lebih lanjut, disarankan agar sistem AGV ini ditingkatkan dengan beberapa langkah teknis yang aplikatif. 

Pertama, mengganti protokol komunikasi WiFi dengan Bluetooth Low Energy (BLE) atau ESP-NOW, yang memiliki latensi lebih rendah dan stabilitas lebih baik untuk kendali real- time jarak dekat. 

Kedua, menambahkan indikator LED sebagai umpan balik langsung saat perintah diterima, sehingga pengguna dapat memastikan status sistem meskipun AGV berada di luar jangkauan pandangan. 

Ketiga, mengimplementasikan buffer parsing sederhana di sisi mikrokontroler untukmemisahkan proses penerimaan data dan eksekusi, guna meningkatkan responsivitas. 

Keempat, dalam tahap lanjut, mengintegrasikan sensor encoder atau MPU-6050 untuk memantau pergerakan roda secara real-time dan menerapkan algoritma kompensasi slip seperti yang diusulkan oleh Chen et al. (2021), sehingga akurasi gerakan dapat ditingkatkan secara signifikan. 

Dengan pengembangan tersebut, AGV sederhana ini tidak hanya menjadi alat pembelajaran komputasi dan otomasi, tetapi juga fondasi konkret menuju sistem logistik cerdas berbasis teknologi terjangkau.


Disadur dari laporan praktek Ambar Arta Nofa, Mahasiswi D4 Teknik Rekayasa Otomotif (2025 I)  Fakultas Vokasi Universitas Negeri Surabaya

Link github dan koleksi laporan lengkap : https://github.com/ahocool-aisi555/AGVRC27Mhz

Share:

Selasa, 02 September 2025

[ESP32-A2DP] Talkie Suara Digital dari Era 80-an: Pelaporan Suhu DHT11 Lewat Audio

Bayangkan sebuah suara robotik yang khas, kaku, namun jelas – seperti suara dari film fiksi ilmiah tahun 1980-an. Suara itu bukan hasil rekaman manusia, bukan pula hasil AI modern seperti Google Assistant atau Siri. Suara itu adalah hasil dari sintesis vokal berbasis Linear Predictive Coding (LPC), teknologi canggih di masanya yang diusung oleh chip legendaris: TMS5100 dari Texas Instruments.



Hari ini, dengan ESP32 dan library modern seperti TalkiePCM ( kreasi Phill Schatzmann baca disini ), kita bisa menghidupkan kembali suara ikonik itu – bukan hanya untuk nostalgia, tapi untuk aplikasi nyata. Dalam proyek ini, saya berhasil membuat sistem pelaporan suhu dan kelembaban otomatis menggunakan sensor DHT11, yang kemudian "dibacakan" oleh suara digital vintage dan dikirim ke speaker Bluetooth. Mari kita telusuri sejarah menakjubkan di balik teknologi ini, dan bagaimana ia masih relevan di era IoT.


Dari Lab TI ke Mainstream: Kelahiran TMS5100 dan Revolusi Speech Synthesis

Pada akhir 1970-an, Texas Instruments (TI) merilis sebuah chip revolusioner: TMS5100. Ini bukan sekadar chip audio biasa. TMS5100 adalah prosesor LPC (Linear Predictive Coding) pertama yang dikomersialkan, mampu mensintesis suara manusia dari data terkompresi dengan sangat efisien – bahkan dengan memori yang sangat terbatas.

Teknologi LPC bekerja dengan memodelkan saluran vokal manusia secara matematis, bukan merekam suara asli. Alih-alih menyimpan audio mentah, chip ini menyimpan parameter seperti frekuensi fonasi, resonansi (formant), dan energi suara. Saat diaktifkan, ia "membangun" suara dari parameter ini, menghasilkan ucapan yang terdengar mekanis, tetapi cukup jelas untuk dipahami.


TMS5100 menjadi jantung dari berbagai produk populer:




  • Speak & Spell (1978): Mainan edukasi TI yang mengajarkan ejaan dengan suara robotik yang ikonik.
  • TI-99/4A Home Computer: Dengan modul ekspansi speech, komputer rumahan ini bisa berbicara.
  • Game Arcade Atari: Suara Darth Vader yang mengintimidasi di Star Wars Arcade (1983) dihasilkan oleh TMS5220, penerus TMS5100.
  • BBC Micro dan Apple Echo II: Menunjukkan bahwa teknologi ini diadopsi luas di dunia komputasi awal.
  • Suara dari chip-chip ini menjadi simbol era digital awal – suara dari masa depan yang dibayangkan di masa lalu.


Talkie: Membangkitkan Kembali Warisan TI di Abad 21

Talkie adalah proyek open-source yang menghidupkan kembali arsitektur TMS5100 secara perangkat lunak. Dikembangkan oleh Peter Knight dan dikembangkan lebih lanjut oleh Phil Schatzmann (pschatzmann), Talkie bukan emulator perangkat keras, melainkan reimplementasi algoritma LPC yang digunakan oleh TMS5100, dikompilasi menjadi kode C++ yang ringan dan platform-independent.


Yang membuat Talkie sangat menarik:

  • Header-only dan ringan: Cocok untuk mikrokontroler seperti ESP32.
  • Menghasilkan PCM 16-bit @ 8 kHz: Format dasar yang bisa diproses lebih lanjut.
  • Vokabular siap pakai: Termasuk Vocab_US_Large.h yang berisi ratusan kata seperti "temperature", "is", "degrees", "button", dan angka.
  • Kemampuan baca angka dan float: Bisa mengucapkan angka desimal secara otomatis.

Contoh vocabulary yang paling lengkap dan bisa kamu kreasikan sendiri  jika ada waktu : https://github.com/ptwz/python_wizard



Dengan Talkie, kita tidak hanya mendapatkan suara vintage – kita mendapatkan mesin TTS (Text-to-Speech) analog digital yang bisa digunakan untuk sistem informasi otomatis, tanpa bergantung pada cloud atau AI besar.


Proyek: Sistem Pelaporan Suhu Otomatis dengan ESP32 dan Bluetooth

Saya memanfaatkan kekuatan Talkie untuk membuat sistem yang fungsional dan futuristik-nostalgik sekaligus:


ESP32 membaca data dari sensor DHT11, lalu "mengucapkan" suhu dan kelembaban melalui speaker Bluetooth dengan suara robotik khas tahun 80-an. Jika tidak ada aktivitas selama 10 detik, sistem secara otomatis melaporkan kondisi terkini. 


Arsitektur Sistem

  • Sensor: DHT11 membaca suhu & kelembaban.
  • Sintesis Suara: Library TalkiePCM menghasilkan ucapan dari vokabular TI.
  • Konversi Format: Audio 8 kHz dari Talkie di-upsample ke 44.1 kHz agar kompatibel dengan Bluetooth A2DP.
  • Output Nirkabel: Data dikirim via A2DPStream ke speaker Bluetooth.
  • Interaksi: Dua tombol fisik untuk memicu pesan khusus ("Button one is press").
  • Integrasi dengan AudioTools


Karena Talkie hanya menghasilkan data PCM mentah, saya menggunakan AudioTools oleh pschatzmann untuk menghubungkannya ke dunia nyata:

  1. FormatConverterStream: Mengubah 8kHz → 44.1kHz.
  2. BufferedStream: Menjamin aliran data halus.
  3. A2DPStream: Mengirim audio ke Bluetooth dengan nama perangkat "K1".


FormatConverterStream out(a2dp);

BufferedStream bs(1024, out);

TalkiePCM voice(bs, 2); // Output ke stream dengan stereo



Setiap kali saya memanggil:


voice.say(sp3_TEMPERATURE);

voice.sayFloat(t, 2, 0, 1);

voice.say(sp3_CELCIUS);

bs.flush();


...ESP32 secara real-time menghasilkan suara "temperature is twenty three point five degrees" – dengan aksen robotik yang khas, lalu mengirimkannya ke speaker.


Berikut adalah contoh kode lengkap, sesuaikan dengan pin esp32 yg kamu pakai:

#include "AudioTools.h"
#include "AudioTools/AudioCodecs/CodecMP3Helix.h"
#include "AudioTools/AudioLibs/A2DPStream.h"
#include "TalkiePCM.h"
#include "Vocab_US_Large.h"
#include "DHT.h"

// Definisikan pin tombol
const int PIN_BUTTON_1 = 22; // Tombol untuk memutar audio 1
const int PIN_BUTTON_2 = 21; // Tombol untuk memutar audio 2

// === Bluetooth Name Sesuaikan dengan nama speaker kamu ===
const char* BT_NAME = "K1";

// === Audio Info seperti di contoh ===
AudioInfo from(8000, 2, 16);  // TTS (input: 8kHz, stereo - meski mono, kita isi 2)
AudioInfo to(44100, 2, 16);   // A2DP (output: 44.1kHz, stereo)

// === Stream ===
A2DPStream a2dp;
FormatConverterStream out(a2dp);
BufferedStream bs(1024, out);  // Buffer untuk smooth playback
TalkiePCM voice(bs, from.channels);

#define DHTTYPE DHT11  //Sensor DHT11
const int dhtPin = 23; //PIN DHT11 di ESP32


DHT dht(dhtPin, DHTTYPE);

// === Timer Idle ===
unsigned long lastActivity = 0;
const unsigned long IDLE_TIMEOUT = 10000; // 30 detik

void setup() {
  Serial.begin(115200);

  pinMode(PIN_BUTTON_1, INPUT_PULLUP);
  pinMode(PIN_BUTTON_2, INPUT_PULLUP);
    
  AudioToolsLogger.begin(Serial, AudioToolsLogLevel::Info);
  Serial.println(" TalkiePCM to A2DP - Dengan Idle Timer 30 Detik");
   
  // Setup konversi format: 8kHz → 44.1kHz, mono → stereo
  out.begin(from, to);
  
  // Setup Bluetooth
  auto cfg = a2dp.defaultConfig(TX_MODE);
  cfg.name = BT_NAME;
  cfg.silence_on_nodata = true;
  a2dp.begin(cfg);
  a2dp.setVolume(0.8);

  delay(2000); // Beri waktu Bluetooth stabil

  Serial.println(" Siap. Play Suhu dan Tekan tombol kapan saja...");

  dht.begin();

  playTemp();
  // Simpan waktu terakhir aktivitas
  lastActivity = millis();
}


void playTemp(){
   
 
    float h = dht.readHumidity();
    float t = dht.readTemperature();

    bool fail = false;

    if (isnan(h) || isnan(t)) {
      Serial.println("Failed to read from DHT sensor!");
      fail =true;
    }
    
    Serial.print("Humidity: "); 
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: "); 
    Serial.print(t);
    Serial.println(" °C ");
  
    //ngomong temp
    voice.say(sp4_THE);
    voice.say(sp3_TEMPERATURE);
    voice.say(sp2_IS);
    if(!fail){
       voice.sayFloat(t,2,0,1);
       voice.say(sp3_CELCIUS);
      }
     else{
       voice.say(sp2_DEVICE);
       voice.say(sp3_ERROR); 
     }
    delay(200);
    voice.say(sp4_PLEASE);
    voice.say(sp2_PRESS);
    voice.say(sp2_A);
    voice.say(sp2_BUTTON);
    bs.flush();
  }

void loop() {
  unsigned long now = millis();

  // Cek tombol 1
  if (digitalRead(PIN_BUTTON_1) == LOW) {
    Serial.println(" Tekan 1: Button one is press");
    delay(50);
    if (digitalRead(PIN_BUTTON_1) == LOW) {
      voice.say(sp2_BUTTON);
      voice.say(sp2_ONE);
      voice.say(sp2_IS);
      voice.say(sp2_PRESS);
      bs.flush();
      lastActivity = now; // Reset timer
    }
    while (digitalRead(PIN_BUTTON_1) == LOW) delay(10);
  }

  // Cek tombol 2
  if (digitalRead(PIN_BUTTON_2) == LOW) {
    Serial.println(" Tekan 2: Button two is press");
    delay(50);
    if (digitalRead(PIN_BUTTON_2) == LOW) {
      voice.say(sp2_BUTTON);
      voice.say(sp2_TWO);
      voice.say(sp2_IS);
      voice.say(sp2_PRESS);
      bs.flush();
      lastActivity = now; // Reset timer
    }
    while (digitalRead(PIN_BUTTON_2) == LOW) delay(10);
  }

  // Cek idle: jika tidak ada aktivitas selama 10 detik
  if (now - lastActivity > IDLE_TIMEOUT) {
    Serial.println(" Idle 10 detik: memutar suhu");

    playTemp();
    lastActivity = now; // Reset timer setelah main
  }

  delay(10); // Stabilisasi loop
}





Fitur Cerdas: Mode Idle Otomatis

Salah satu fitur menarik adalah mode idle. Jika tidak ada tombol yang ditekan selama 10 detik, sistem otomatis memutar pembacaan suhu terbaru:


Ini membuat sistem sangat cocok untuk:


  • Panel informasi cuaca mini di rumah.
  • Sistem monitoring IoT yang memberi laporan berkala.
  • Instalasi seni interaktif dengan nuansa retro-futuristik.


Mengapa Ini Penting di Era Modern?

Di tengah dominasi AI dan cloud, proyek seperti ini mengingatkan kita bahwa:


  • Komputasi edge bisa tetap cerdas tanpa internet.
  • Efisiensi dan kemandirian lebih penting daripada kompleksitas.
  • Nostalgia teknologi bisa menjadi inspirasi desain.
  • Talkie tidak hanya tentang suara – ia adalah penghormatan terhadap inovasi masa lalu yang masih bisa digunakan hari ini untuk membuat sesuatu yang unik, fungsional, dan menyenangkan.


Kesimpulan: Masa Lalu yang Masih Bisa Berbicara

Dengan kombinasi:

  • Sejarah chip TMS5100,
  • Rekayasa ulang oleh TalkiePCM,
  • Kemudahan integrasi melalui AudioTools,
  • Dan kreativitas dalam aplikasi IoT,

Saya berhasil membuat sistem yang bukan hanya bekerja, tapi berkarakter. Suara robotik yang keluar dari speaker Bluetooth bukan sekadar informasi – ia adalah nada waktu, pengingat bahwa teknologi lama tetap bisa bernyawa di tangan pembuat yang kreatif.

Jika Anda ingin membuat proyek IoT yang tidak hanya pintar, tapi juga punya jiwa, cobalah hidupkan kembali suara dari masa lalu. Karena terkadang, masa depan terdengar seperti tahun 1982.








Proyek ini menggunakan: ESP32, DHT11, TalkiePCM, Vocab_US_Large, AudioTools, dan A2DP. Semua kode open-source dan tersedia untuk dikembangkan lebih lanjut.

Share:

[ESP32-A2DP] MP3 player menggunakan SD Card dan kirim ke speaker Bluetooth

Pada artikel sebelumnya, kita telah membahas cara membuat suara sirene digital menggunakan ESP32 dan mengirimkannya melalui Bluetooth A2DP dengan bantuan library AudioTools oleh pschatzmann. Kali ini, kita akan melangkah lebih jauh dengan memanfaatkan kemampuan ESP32 untuk memutar file audio MP3 dari kartu SD dan mengalirkannya ke perangkat speaker Bluetooth secara nirkabel menggunakan protokol A2DP.



Namun, ada satu hal penting yang perlu ditekankan: dengan konfigurasi dan library tertentu — khususnya kombinasi AudioSourceSDFAT, CodecMP3Helix, dan A2DPStream — sistem ini hanya mampu memutar semua file MP3 pada scdard secara otomatis dan berulang (loop), tanpa kemampuan memilih file lain secara dinamis. Artikel ini akan menjelaskan mengapa hal ini terjadi, bagaimana sistem bekerja, serta batasan-batasan teknis yang perlu dipahami oleh pengembang.


1. Arsitektur Sistem: Alur Pemutaran Audio

Untuk memutar file MP3 dari SD card ke speaker Bluetooth, kita membutuhkan beberapa komponen utama:


  1. ESP32 – Sebagai mikrokontroler utama.
  2. Kartu SD – Menyimpan file audio MP3.
  3. Library AudioTools – Framework audio modular oleh pschatzmann.
  4. Codec MP3Helix – Untuk mendekode file MP3.
  5. A2DPStream – Untuk mengirim audio ke perangkat Bluetooth.
  6. AudioSourceSDFAT – Untuk membaca data dari SD card.






Alur kerjanya adalah:


  1. ESP32 membaca file MP3 dari SD card.
  2. File tersebut didekode menggunakan codec MP3Helix.
  3. Data audio dalam format PCM dikirim ke A2DPStream.
  4. A2DPStream mengirimkan data ke perangkat Bluetooth (seperti speaker atau headphone).
  5. Proses ini berjalan terus-menerus (loop) selama perangkat menyala.


2. Kode Dasar untuk Pemutaran MP3 via A2DP

Berikut adalah contoh kode minimal menggunakan library yang disebutkan:

#define HELIX_LOGGING_ACTIVE true

#include "AudioTools.h"
#include "AudioTools/AudioLibs/A2DPStream.h"
#include "AudioTools/Disk/AudioSourceSDFAT.h"
#include "AudioTools/AudioCodecs/CodecMP3Helix.h"

// === SD Card Pins ===
#define SD_CS   5
#define SD_MOSI 23
#define SD_MISO 19
#define SD_SCK  18

// === Konfigurasi ===
const char *startFilePath = "/"; //pindahkan file mp3 ke sdcard 
const char* ext = "mp3";

// === Objek Audio ===
AudioSourceSDFAT source(startFilePath, ext);
A2DPStream out;
MP3DecoderHelix decoder;
AudioPlayer player(source, out, decoder);

void setup() {
  Serial.begin(115200);
  AudioToolsLogger.begin(Serial, AudioToolsLogLevel::Warning);

  // Setup SPI dengan pin kamu
  SPI.begin(SD_SCK, SD_MISO, SD_MOSI, SD_CS);

  // Setup player
  player.setVolume(0.8);  // 0.0 - 1.0
  player.begin();

  // Setup Bluetooth
  auto cfg = out.defaultConfig(TX_MODE);
  cfg.silence_on_nodata = true;
  cfg.name = "K1";  //  Ganti jadi nama speaker BT kamu
  out.begin(cfg);

  Serial.println(" Siap memutar MP3 ke K1...");
}

void loop() {
  player.copy();  // Otomatis mainkan file .mp3 dari SD
}



3. Bagaimana Pemilihan File Dilakukan?

Perhatikan bahwa dalam kode di atas, tidak ada perintah eksplisit untuk memilih nama file tertentu. Ini karena AudioSourceSDFAT — dalam konfigurasi default — secara otomatis membuka file pertama yang ditemukan di root direktori SD card dengan ekstensi .mp3.


Artinya:


  • Jika Anda memiliki file alarm.mp3, music.mp3, dan siren.mp3 di SD card, maka satu persatu fileakan diputar — biasanya yang pertama menurut urutan pembacaan sistem file (FAT).
  • Tidak ada fungsi seperti source.open("siren.mp3") yang tersedia secara langsung dalam implementasi dasar AudioSourceSDFAT saat digunakan dengan AudioPlayer dan A2DPStream.


4. Mengapa Tidak Bisa Memilih File Secara Bebas?

Ada beberapa alasan teknis mengapa pemilihan file dinamis tidak didukung secara langsung dalam pendekatan ini:


a. Abstraksi Tingkat Tinggi

Library AudioTools dirancang untuk mempermudah alur data audio, bukan sebagai sistem manajemen file. AudioSourceSDFAT bertindak sebagai source pasif yang hanya menyediakan data mentah, dan AudioPlayer mengharapkan sumber yang siap digunakan tanpa intervensi pengguna.


b. Keterbatasan A2DPStream

A2DPStream adalah output stream yang bersifat continuous. Begitu koneksi Bluetooth terbentuk, ia mengharapkan aliran data tanpa henti. Jika kita ingin berganti file, kita harus:


  • Menghentikan stream,
  • Mengganti file di sumber,
  • Memulai ulang koneksi A2DP.
  • Proses ini tidak stabil dan sering menyebabkan koneksi Bluetooth terputus atau speaker gagal reconnect.


c. Tidak Ada Event Callback untuk Akhir File

Dalam konfigurasi ini, saat file MP3 selesai diputar, AudioPlayer secara otomatis melakukan loop ke awal file yang sama, bukan melanjutkan ke file berikutnya. Tidak ada event seperti onFinish() yang bisa digunakan untuk beralih ke file lain.


5. Sistem Ini Dirancang untuk Pemutaran Loop Otomatis

Justru karena keterbatasan ini, sistem ini sangat cocok untuk aplikasi yang membutuhkan pemutaran terus-menerus dari satu file, seperti:


  • Alarm atau sirene darurat yang harus berbunyi terus hingga dimatikan.
  • Panduan suara di pameran yang memutar satu rekaman berulang-ulang.
  • Speaker background music di toko kecil dengan satu playlist statis.


Keuntungannya:


  • Stabil: Tidak ada perpindahan file yang bisa merusak koneksi Bluetooth.
  • Sederhana: Tidak perlu logika kompleks untuk manajemen file.
  • Hemat sumber daya: Cocok untuk sistem embedded dengan memori terbatas.


6. Solusi Alternatif (Jika Ingin Pemilihan File)

Jika Anda benar-benar membutuhkan kemampuan memilih file, beberapa opsi yang bisa dipertimbangkan:


  • Gunakan SPIFFS atau SD card dengan daftar file statis dan buat logika manual untuk mengganti sumber.
  • Restart seluruh pipeline audio (player.end(), ganti file, player.begin()).
  • Gunakan Bluetooth Sink + ESP32 sebagai penerima, lalu keluarkan ke DAC/I2S — lebih stabil untuk kontrol file.
  • Gunakan platform lain seperti ESP32-S3 dengan dukungan RTOS dan codec lebih baik.
  • Namun, semua ini keluar dari lingkup kemudahan yang ditawarkan oleh AudioSourceSDFAT + A2DPStream secara default.


Silahkan baca bagaimana memutar file Mp3 untuk pembacaan LM35 disini : https://www.aisi555.com/2024/05/esp8266-kirim-data-suhu-lm35-lewat.html


7. Kesimpulan: Simplicity with a Trade-off

Kombinasi library:


#include "AudioTools.h"

#include "AudioTools/AudioLibs/A2DPStream.h"

#include "AudioTools/Disk/AudioSourceSDFAT.h"

#include "AudioTools/AudioCodecs/CodecMP3Helix.h"


menawarkan solusi cepat, mudah, dan stabil untuk memutar satu file MP3 dari SD card secara loop terus-menerus melalui Bluetooth A2DP.

Namun, pengguna harus menerima kenyataan bahwa sistem ini tidak dirancang untuk navigasi file atau pemilihan lagu dinamis. Ini bukan kelemahan, melainkan konsekuensi dari desain yang mengutamakan kesederhanaan dan keandalan.

Jika proyek Anda membutuhkan pemutaran otomatis tanpa intervensi, seperti sistem alarm, panduan otomatis, atau iklan berulang, maka pendekatan ini sangat ideal. Tapi jika Anda ingin membuat music player dengan playlist dan kontrol, Anda perlu mempertimbangkan arsitektur yang lebih kompleks.

Dengan memahami batasan ini sejak awal, Anda bisa merancang sistem yang realistis, efisien, dan sesuai kebutuhan — tanpa frustrasi karena ekspektasi yang salah terhadap kemampuan library.

AudioTools tetap menjadi salah satu library paling powerful untuk proyek audio di ESP32, selama kita tahu apa yang bisa dan tidak bisa dilakukannya.

Share:

[ESP32-A2DP] Berkenalan dengan library siap pakai AudioTools - Membuat Sirene

Dalam era Internet of Things (IoT), mikrokontroler seperti ESP32 telah menjadi pilihan populer karena kemampuannya yang luar biasa, termasuk konektivitas Wi-Fi dan Bluetooth. Salah satu fitur menarik dari ESP32 adalah dukungan terhadap Bluetooth A2DP (Advanced Audio Distribution Profile), yang memungkinkan perangkat mengirimkan aliran audio berkualitas tinggi ke perangkat audio nirkabel seperti speaker Bluetooth. Dengan memanfaatkan library AudioTools yang dikembangkan oleh pschatzmann, proses pengiriman audio melalui A2DP menjadi jauh lebih mudah dan terstruktur.





Pada artikel ini, kita akan membahas bagaimana ESP32 dapat digunakan untuk menghasilkan suara sirene digital dan mengirimkannya ke speaker Bluetooth menggunakan protokol A2DP dengan bantuan library AudioTools. Pembahasan akan mencakup dasar teori, arsitektur sistem, serta konsep pembangkitan sinyal audio secara real-time.


1. Apa itu A2DP dan Mengapa ESP32 Cocok untuk Ini?

A2DP adalah protokol Bluetooth yang memungkinkan transmisi data audio secara nirkabel dari sumber (seperti smartphone atau mikrokontroler) ke perangkat penerima (seperti headphone atau speaker). ESP32 dilengkapi dengan modul Bluetooth dual-mode (Classic Bluetooth dan BLE), sehingga mampu bertindak sebagai sumber audio A2DP (Source).

Dengan fitur ini, ESP32 bisa digunakan sebagai pemutar musik, interkom nirkabel, atau bahkan sistem peringatan seperti sirene darurat yang dikirim ke speaker Bluetooth di lokasi tertentu.


2. Peran Library AudioTools oleh pschatzmann

Salah satu tantangan dalam pengembangan aplikasi audio di ESP32 adalah kompleksitas manajemen buffer, codec, dan sinkronisasi aliran data. Di sinilah library AudioTools oleh pschatzmann sangat membantu. Library ini menyediakan abstraksi tingkat tinggi yang mempermudah proses pembuatan, manipulasi, dan transmisi audio.


Beberapa keunggulan AudioTools:

  1. Mendukung berbagai format audio (WAV, MP3, RAW, dll).
  2. Memiliki antarmuka modular untuk input, output, dan prosesor audio.
  3. Integrasi langsung dengan A2DP melalui BluetoothA2DPSink atau BluetoothA2DPSource.
  4. Mudah digunakan dengan sintaks yang intuitif.


Untuk proyek ini, kita akan menggunakan BluetoothA2DPSink agar ESP32 dapat menerima audio, tetapi karena tujuan kita adalah mengirim audio sirene, maka kita sebenarnya membutuhkan mode A2DP Source. Namun, perlu dicatat bahwa implementasi A2DP Source di ESP32 masih terbatas dibandingkan Sink. Oleh karena itu, alternatifnya adalah menghasilkan audio secara internal dan mengirimkannya melalui koneksi Bluetooth sebagai sumber virtual, atau menggunakan pendekatan lain seperti mengirim audio melalui DAC atau I2S, lalu memancarkannya via Bluetooth dari perangkat lain.

Namun, dengan perkembangan library AudioTools, pschatzmann telah menyediakan dukungan eksperimental untuk A2DP Source, yang memungkinkan ESP32 berperan sebagai pengirim audio. Ini adalah kunci dari proyek kita.


3. Konsep Pembangkitan Suara Sirene Digital

Suara sirene umumnya merupakan gelombang suara dengan frekuensi yang berubah-ubah secara periodik, seperti naik-turun (wailing) atau berdenyut (yelp). Untuk menghasilkan efek ini secara digital, kita bisa menggunakan osilator gelombang sinus dengan frekuensi yang dimodulasi terhadap waktu.


Secara matematis, sinyal sirene dapat direpresentasikan sebagai:


s(t)=A⋅sin(2Ï€⋅f(t)⋅t)

di mana:

A adalah amplitudo (volume),

f(t) adalah frekuensi yang berubah terhadap waktu (misalnya, dari 500 Hz ke 1500 Hz secara linier).


Modulasi frekuensi ini bisa diimplementasikan dengan memvariasikan nilai frekuensi osilator dalam loop utama program. ESP32 cukup cepat untuk menghitung nilai sinus ini secara real-time menggunakan fungsi sin() dari C++ (dengan optimasi jika perlu).


4. Arsitektur Sistem

Berikut adalah komponen utama sistem:


  1. ESP32 – Sebagai otak sistem, menghasilkan sinyal audio dan mengelola koneksi Bluetooth.
  2. Library AudioTools – Menyediakan framework untuk pembangkitan dan transmisi audio.
  3. Bluetooth A2DP Source – Mengirimkan aliran audio ke perangkat penerima.
  4. Speaker Bluetooth – Perangkat yang menerima dan memutar suara sirene.


Alur kerja sistem:


  1. ESP32 menginisialisasi modul Bluetooth dalam mode A2DP Source.
  2. Secara berkala, ia menghasilkan sampel audio sirene (dalam bentuk array nilai 16-bit signed).
  3. Sampel ini dikirim ke buffer audio yang dikelola oleh AudioTools.
  4. Library AudioTools menangani enkapsulasi data ke format A2DP dan transmisi nirkabel.
  5. Speaker Bluetooth menerima data, mendekode, dan memutar suaranya.


5. Implementasi Teoritis - Praktek dengan AudioTools

Untuk membuat sirene, kita bisa membuat kelas atau fungsi yang menghasilkan sampel audio setiap waktu. Berikut adalah gambaran kode teoritis:

Silahkan download library yang sesuai di googling saja dengan kata kunci :  AudioTools - Pschatzmann dan ESP32-A2DP

Test 1 - Tone Generator : 

#include "BluetoothA2DPSource.h"
#include <math.h>

// Objek utama untuk mengelola koneksi Bluetooth
BluetoothA2DPSource a2dp_source;

// Frekuensi nada yang akan dihasilkan dalam Hz (A4)
#define A4_FREQUENCY 1000.0

// Variabel untuk melacak waktu/fase agar gelombang sinyal kontinu
static float m_time = 0.0;

// Fungsi callback untuk menghasilkan data audio
int32_t get_data_frames(Frame *frame, int32_t frame_count) {
  // Volume, dari -32,768 hingga 32,767
  float m_amplitude = 10000.0;
  // Interval waktu antar sampel, untuk sample rate 44.1 kHz
  float m_deltaTime = 1.0 / 44100.0;
  float pi_2 = PI * 2.0;

  // Isi buffer frame dengan data sinyal
  for (int sample = 0; sample < frame_count; ++sample) {
    // Hitung sudut untuk gelombang sinus
    float angle = pi_2 * A4_FREQUENCY * m_time;
    // Hasilkan sinyal
    int16_t signal = (int16_t)(m_amplitude * sin(angle));
    
    // Isi data ke kedua saluran (stereo)
    frame[sample].channel1 = signal;
    frame[sample].channel2 = signal;
    
    // Majukan waktu
    m_time += m_deltaTime;
  }
  return frame_count;
}

// Callback untuk melacak status koneksi
void connection_state_changed(esp_a2d_connection_state_t state, void *ptr){
  Serial.println(a2dp_source.to_str(state));
}

void setup() {
  Serial.begin(115200);
  a2dp_source.set_auto_reconnect(false);
  a2dp_source.set_on_connection_state_changed(connection_state_changed);
  a2dp_source.set_data_callback_in_frames(get_data_frames);
  a2dp_source.set_volume(100);
  a2dp_source.start("K1"); // Ubah K1 dengan nama speaker BT anda
}

void loop() {
  // Hanya jeda untuk mencegah watchdog timer
  delay(10);
}


Test 2- Sirene Generator : 

#include "AudioTools.h"
#include "BluetoothA2DPSource.h"

using namespace audio_tools;

// Generator dan Bluetooth
SineWaveGenerator<int16_t> sine_gen;
BluetoothA2DPSource a2dp_source;

// Konfigurasi sirene
#define SIRENE_FREQ_1 800.0f
#define SIRENE_FREQ_2 1000.0f
#define DURATION_S_TONE 0.5f  // 0.5 detik

// State
float current_frequency = SIRENE_FREQ_1;
float time_of_last_switch = 0.0f;
float m_time = 0.0f;
const float sample_rate = 44100.0f;

// Buffer
const int FRAME_COUNT = 1024;
int16_t buffer_mono[FRAME_COUNT];
Frame buffer_stereo[FRAME_COUNT];  // channel1 & channel2

// Callback: generate audio data
int32_t get_data_frames(Frame *frame, int32_t frame_count) {
  // Ganti frekuensi setiap DURATION_S_TONE detik
  if (m_time - time_of_last_switch >= DURATION_S_TONE) {
    current_frequency = (current_frequency == SIRENE_FREQ_1) ? SIRENE_FREQ_2 : SIRENE_FREQ_1;
    time_of_last_switch = m_time;
    sine_gen.setFrequency(current_frequency);
  }

  // Gunakan readBytes() — memindah byte audio
  size_t bytes_to_read = frame_count * sizeof(int16_t);
  size_t bytes_read = sine_gen.readBytes((uint8_t*)buffer_mono, bytes_to_read);
  size_t samples_read = bytes_read / sizeof(int16_t);

  // Konversi mono → stereo
  for (int i = 0; i < samples_read; i++) {
    frame[i].channel1 = buffer_mono[i];
    frame[i].channel2 = buffer_mono[i];
  }

  // Update waktu
  m_time += samples_read / sample_rate;

  return samples_read;
}

// Callback: status koneksi Bluetooth
void connection_state_changed(esp_a2d_connection_state_t state, void *ptr) {
  Serial.println(a2dp_source.to_str(state));
}

void setup() {
  Serial.begin(115200);
  while (!Serial);

  // Konfigurasi audio
  AudioInfo cfg;
  cfg.sample_rate = 44100;
  cfg.channels = 1;
  cfg.bits_per_sample = 16;

  // Inisialisasi generator
  sine_gen.begin(cfg);
  sine_gen.setFrequency(SIRENE_FREQ_1);      // Mulai dari 800 Hz
  sine_gen.setAmplitude(10000.0f);           // Amplitude ~30% dari max

  // Setup Bluetooth
  
  a2dp_source.set_auto_reconnect(true);
  a2dp_source.set_volume(100);  // 0–100
  a2dp_source.set_on_connection_state_changed(connection_state_changed);
  a2dp_source.set_data_callback_in_frames(get_data_frames);

  Serial.println("Mencoba terhubung ke speaker 'K1'...");
  a2dp_source.start("K1"); //Sesuaikan dengan nama speaker BT anda
}

void loop() {
  delay(10);
}


6. Tantangan dan Solusi

Keterbatasan A2DP Source di ESP32: ESP-IDF lebih mendukung A2DP Sink. Implementasi Source masih dalam pengembangan. Solusi: Gunakan versi terbaru library AudioTools yang telah mengatasi sebagian besar isu ini.

  1. Kualitas Audio: Penggunaan fungsi sin() secara real-time bisa memberatkan CPU. Optimasi dengan lookup table (LUT) sinus dapat mengurangi beban prosesor.
  2. Latensi dan Buffering: Pastikan buffer audio cukup besar untuk menghindari crackling atau putus-putus suara.
  3. Daya Baterai: Transmisi Bluetooth konstan memakan daya. Untuk aplikasi portabel, pertimbangkan untuk mengaktifkan sirene hanya saat diperlukan.


7. Aplikasi Nyata

Sistem ini bisa digunakan dalam berbagai skenario:


  1. Alarm rumah pintar yang memicu sirene melalui speaker Bluetooth di seluruh rumah.
  2. Sistem peringatan bencana berbasis IoT.
  3. Proyek edukasi tentang pemrosesan sinyal digital dan komunikasi nirkabel.


Kesimpulan

Dengan kombinasi ESP32, library AudioTools oleh pschatzmann, dan protokol Bluetooth A2DP, kita dapat membangun sistem audio yang canggih namun tetap sederhana secara konseptual. Pembuatan suara sirene digital adalah contoh nyata bagaimana mikrokontroler modern bisa digunakan tidak hanya untuk kontrol logika, tetapi juga untuk pemrosesan sinyal waktu-nyata.

Meskipun ada tantangan teknis, terutama terkait dukungan A2DP Source, perkembangan library open-source seperti AudioTools terus mempermudah pengembangan aplikasi audio di platform ESP32. Dengan sedikit pemahaman tentang dasar-dasar gelombang suara dan modulasi frekuensi, siapa pun bisa membuat sistem audio nirkabel yang fungsional dan kreatif.

Proyek ini membuka pintu bagi eksplorasi lebih lanjut, seperti menambahkan kontrol jarak jauh via Wi-Fi, menyimpan audio dalam SD card, atau bahkan menggabungkan dengan sensor untuk sistem alarm otomatis. Dunia audio di IoT menanti untuk dieksplorasi!

Share:

Kontak Penulis



12179018.png (60×60)
+6281331339072

Mail : ahocool@gmail.com

Site View

Categories

555 (8) 7 segmen (3) adc (4) amplifier (2) analog (19) android (14) antares (11) arduino (29) artikel (11) attiny (3) attiny2313 (19) audio (8) baterai (5) blog (1) bluetooth (1) chatgpt (2) cmos (2) crypto (2) dasar (46) digital (11) dimmer (5) display (3) esp32 (3) esp8266 (31) euro2020 (13) gcc (1) gis (3) gsm (1) iklan (1) infrared (2) Input Output (3) iot (79) jam (7) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (17) komputer (3) komunikasi (1) kontrol (8) lain-lain (8) lcd (2) led (14) led matrix (6) line tracer (1) lm35 (1) lora (11) lorawan (2) MATV (1) memory (1) metal detector (4) microcontroller (70) micropython (6) mikrokontroler (3) mikrokontroller (14) mikrotik (5) modbus (9) mqtt (4) ninmedia (5) ntp (1) openwrt (3) paket belajar (19) palang pintu otomatis (1) parabola (88) pcb (2) power (1) praktek (2) project (37) proyek (1) python (11) radio (31) raspberry pi (9) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) SDR (3) sensor (2) sharing (3) signage (1) sinyal (1) sms (6) software (18) solar (1) solusi (1) statistik (5) tachometer (2) technology (1) teknologi (2) telegram (2) telepon (9) televisi (167) television (28) telkomiot (5) transistor (2) troubleshoot (3) tulisan (96) tutorial (108) tv digital (6) tvri (2) unesa (10) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (6) yolo (10)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika