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:
- ESP32 – Sebagai mikrokontroler utama.
- Kartu SD – Menyimpan file audio MP3.
- Library AudioTools – Framework audio modular oleh pschatzmann.
- Codec MP3Helix – Untuk mendekode file MP3.
- A2DPStream – Untuk mengirim audio ke perangkat Bluetooth.
- AudioSourceSDFAT – Untuk membaca data dari SD card.
- ESP32 membaca file MP3 dari SD card.
- File tersebut didekode menggunakan codec MP3Helix.
- Data audio dalam format PCM dikirim ke A2DPStream.
- A2DPStream mengirimkan data ke perangkat Bluetooth (seperti speaker atau headphone).
- 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.
0 komentar:
Posting Komentar