Tutorial DFPlayer Mini Arduino: Memutar MP3, Kartu SD, dan Speaker
Cara memakai DFPlayer Mini dengan Arduino: resistor 1k di RX, kartu SD dan penamaan 0001.mp3, kode library, tombol, speaker, serta contoh untuk ESP32 dan Pico.
DFPlayer Mini adalah cara termurah dan termudah untuk memutar MP3 dengan Arduino: modul ini mendekode sendiri file audio di kartu microSD, langsung menggerakkan speaker dengan amplifier kecil bawaannya, dan menerima perintah dari Arduino lewat koneksi serial dua kabel. Berbeda dengan bunyi bip dari buzzer, modul ini bisa memutar lagu, suara ucapan, nada bel pintu, atau peringatan lisan seperti “Pintunya masih terbuka”. Kebanyakan orang yang pertama kali menyambungkannya mengalami masalah yang sama: tidak ada suara, speaker berdesis, file diputar dengan urutan yang salah, atau Serial Monitor menampilkan “Unable to begin”. Panduan ini menyelesaikan semuanya dan menjelaskan kenapa masalah itu terjadi.
Pertama kamu akan mempelajari pin modul ini dan kenapa resistor 1 kΩ dipasang di jalur RX. Lalu kamu akan melihat cara menyiapkan kartu SD sebagai FAT32, menamai file dengan skema 0001.mp3 dan folder 01, memutar suara pertamamu dengan library DFRobotDFPlayerMini, mengatur volume dan EQ, mengganti lagu dengan tombol, serta memilih speaker atau amplifier eksternal yang tepat. Bagian terakhir membahas cara mengatasi error “Unable to begin” langkah demi langkah, pemutar MP3 yang dikendalikan dari halaman web dengan ESP32, dan contoh MicroPython tanpa library untuk Raspberry Pi Pico. Kalau yang kamu butuhkan hanya bunyi bip atau melodi sederhana, buzzer adalah pilihan yang lebih simpel.

Apa itu DFPlayer Mini dan bagaimana cara kerjanya?
DFPlayer Mini adalah pemutar MP3 mandiri yang terdiri dari chip dekoder MP3, DAC 24-bit, slot kartu microSD, dan amplifier mono kecil. Arduino cukup mengirim perintah singkat seperti “putar lagu 3” atau “atur volume ke 20”; membaca file dari kartu, mendekode audio yang terkompresi, dan menggerakkan speaker adalah tugas modul. Karena itulah Arduino Uno dengan RAM 2 KB pun bisa memutar musik dengan santai. Perintah dikirim pada 9600 baud dalam paket berukuran 10 byte, dan modul membalas dengan format yang sama ketika lagu selesai, kartu dimasukkan atau dicabut, atau terjadi error. Chip di board-nya berbeda-beda tergantung produsen (YX5200-24SS, MH2024K-24SS, GD3200B, dan lainnya). Semuanya memahami perintah yang sama, tapi waktu balasnya bisa berbeda, detail yang nanti penting untuk error “Unable to begin”. Modul ini bisa dikendalikan dengan tiga cara: lewat port serial (UART), dengan tombol IO, atau dengan tangga resistor ADKEY.
| Fitur | Nilai |
|---|---|
| File yang didukung | MP3, WAV, WMA |
| Sample rate | 8 / 11,025 / 12 / 16 / 22,05 / 24 / 32 / 44,1 / 48 kHz |
| DAC | 24-bit; rentang dinamis 90 dB, rasio sinyal terhadap noise 85 dB |
| Penyimpanan | Kartu microSD (TF) sampai 32 GB, FAT16 atau FAT32; flashdisk USB juga didukung |
| Kapasitas folder | Sampai 100 folder, 255 file per folder |
| Volume | 30 tingkat (0–30) |
| Equalizer (EQ) | 6 mode: Normal, Pop, Rock, Jazz, Classic, Bass |
| Output speaker | Amplifier mono bawaan, speaker di bawah 3 W |
| Output line | DAC_L dan DAC_R: stereo, untuk headphone atau amplifier eksternal |
| Catu daya | 3,2–5,0 V (biasanya 4,2 V) |
| Arus standby | Sekitar 20 mA |
| Antarmuka | UART, 9600 baud, 8N1 |
| Ukuran | 20 × 20 mm |
Pinout DFPlayer Mini
| Pin | Nama | Fungsi |
|---|---|---|
| 1 | VCC | Input daya, 3,2–5,0 V |
| 2 | RX | Input serial: tersambung ke pin TX board lewat resistor 1 kΩ |
| 3 | TX | Output serial: menuju pin RX board |
| 4 | DAC_R | Output line kanal kanan (headphone atau amplifier) |
| 5 | DAC_L | Output line kanal kiri (headphone atau amplifier) |
| 6 dan 8 | SPK_1, SPK_2 | Output speaker: dua kabel speaker di bawah 3 W disambungkan di sini |
| 7 | GND | Ground |
| 9 | IO_1 | Tekan singkat ke GND: lagu sebelumnya; tekan lama: volume turun |
| 10 | GND | Ground |
| 11 | IO_2 | Tekan singkat ke GND: lagu berikutnya; tekan lama: volume naik |
| 12 | ADKEY1 | Input banyak tombol lewat tangga resistor |
| 13 | ADKEY2 | Input tangga resistor kedua |
| 14 | USB+ | D+ untuk flashdisk USB |
| 15 | USB− | D− untuk flashdisk USB |
| 16 | BUSY | LOW selama memutar, HIGH ketika diam |
Kalau kamu memakai port serial, kamu hanya butuh pin VCC, GND, RX, TX, dan speaker. Pin BUSY memberi tahu apakah sebuah lagu sudah selesai tanpa lalu lintas serial apa pun, dan LED kecil di board juga menyala selama pemutaran. Pin IO_1 dan IO_2 memungkinkan modul bekerja tanpa Arduino sama sekali: dengan tombol di antara masing-masing pin dan GND, tekan singkat mengganti lagu dan tekan lama mengatur volume. Tombol yang disambungkan ke pin ADKEY lewat resistor dengan nilai berbeda juga bisa memutar lagu tertentu. Artinya, baterai, speaker, dan dua tombol sudah cukup untuk membuat bel pintu atau mainan bicara tanpa mikrokontroler. Pin USB+ dan USB− dipakai untuk memutar dari flashdisk USB sebagai pengganti kartu SD dan dibiarkan tidak tersambung di kebanyakan proyek.
Pengkabelan DFPlayer Mini ke Arduino dan resistor 1k di RX
| Pin DFPlayer | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| VCC | 5V | 5V (VIN) | VBUS (USB 5 V, pin 40) |
| GND | GND | GND | GND |
| RX | D11 lewat resistor 1 kΩ | GPIO 17 (TX2) lewat resistor 1 kΩ | GP0 (UART0 TX) lewat resistor 1 kΩ |
| TX | D10 | GPIO 16 (RX2) | GP1 (UART0 RX) |
| SPK_1 dan SPK_2 | Dua kabel speaker | Dua kabel speaker | Dua kabel speaker |
| BUSY (opsional) | D5 | Tidak dipakai | Tidak dipakai |



Jalur datanya disilang: TX modul menuju RX board, dan RX modul menuju TX board. Port serial hardware Uno di D0 dan D1 dipakai untuk meng-upload lewat USB dan untuk Serial Monitor, jadi modul kita sambungkan ke D10 (RX) dan D11 (TX) dengan SoftwareSerial. Resistor 1 kΩ yang dipasang seri dengan input RX modul bukan detail sepele. Chip DFPlayer bekerja dengan logika 3,3 V, sedangkan pin TX Uno mengeluarkan 5 V. Tanpa resistor, selisih itu mengalirkan arus lewat dioda pelindung input chip; arus tersebut membebani chip dan menimbulkan desis serta bunyi klik yang terdengar dari speaker selama komunikasi serial. Kalau kamu menghitungnya dengan hukum Ohm, kamu akan melihat bahwa 1 kΩ membatasi arus ini menjadi sekitar 1–2 mA, sementara sinyal 9600 baud tidak terpengaruh. Resistor yang jauh lebih besar seperti 10 kΩ bisa melemahkan sinyal dan memutus komunikasi. Output TX modul langsung disambungkan ke Uno, karena Uno membaca 3,3 V sebagai HIGH (ambang batasnya sekitar 3,0 V).
Menyiapkan kartu SD: FAT32, folder, dan penamaan 0001.mp3
DFPlayer Mini membaca kartu microSD sampai 32 GB yang diformat sebagai FAT16 atau FAT32. Kartu 64 GB ke atas dijual dengan format exFAT, yang tidak bisa dibaca modul; kartu 1–16 GB sudah lebih dari cukup untuk beberapa ratus lagu. Meng-encode MP3-mu di 128–192 kbps dan 44,1 kHz adalah pilihan paling aman, baik untuk kompatibilitas maupun kecepatan baca kartu. Modul mengenali file dari nomornya, bukan dari namanya, jadi nama folder dan file harus mengikuti skema tertentu sesuai fungsi yang kamu pakai untuk memutarnya:
| Lokasi di kartu | Contoh | Fungsi library | Aturan |
|---|---|---|---|
| Folder root | /0001.mp3, /0002.mp3 | play(1) | Diputar sesuai urutan file disalin ke kartu, bukan berdasarkan nama |
| Folder bernomor | /01/001.mp3 … /99/255.mp3 | playFolder(1, 1) | Nama folder 2 digit (01–99), nama file 3 digit (001–255) |
| Folder mp3 | /mp3/0001.mp3 | playMp3Folder(1) | Nama file 4 digit; file dicari berdasarkan nomor di namanya |
| Folder advert | /advert/0001.mp3 | advertise(1) | Menyela lagu yang sedang diputar dan melanjutkannya lagi setelah pengumuman selesai |
| Folder besar | /01/0001.mp3 … /15/3000.mp3 | playLargeFolder(1, 1) | Sampai 15 folder, 3000 file per folder, nama 4 digit |
- Format kartu sebagai FAT32 di komputermu (di Windows: klik kanan > Format; di macOS: Disk Utility > Erase > MS-DOS (FAT)).
- Buat folder bernama mp3 di root dan, kalau perlu, folder bernomor seperti 01 dan 02.
- Ganti nama file-mu menjadi 0001.mp3, 0002.mp3 (di folder bernomor: 001.mp3). Kamu boleh menambahkan keterangan setelah nomornya, misalnya 0001_hello.mp3; modul hanya melihat digit di depannya.
- Kalau file di root akan kamu putar dengan play(), salin file-nya satu per satu, secara berurutan; menyalin sekaligus bisa mengacak urutannya.
- Keluarkan kartu dengan aman lalu masukkan ke modul dalam keadaan daya mati; memasukkan atau mencabutnya selama modul menyala bisa merusak file.
Library DFRobotDFPlayerMini dan sketch uji pertama
- Di Arduino IDE, buka Library Manager, ketik DFRobotDFPlayerMini, lalu instal library dari DFRobot. Langkah instalasinya dijelaskan lengkap di Cara Instal Library Arduino.
- Salin minimal satu MP3 ke root kartu SD, masukkan kartu ke modul, lalu rakit rangkaian seperti di tabel.
- Upload sketch di bawah dan buka Serial Monitor di 115200 baud.
- Dalam beberapa detik kamu seharusnya melihat “DFPlayer Mini online.” dan jumlah file di kartu, lalu mendengar lagu pertama.
1#include <SoftwareSerial.h>
2#include <DFRobotDFPlayerMini.h>
3
4SoftwareSerial dfSerial(10, 11); // RX = D10 ← DFPlayer TX, TX = D11 → 1 kΩ → DFPlayer RX
5DFRobotDFPlayerMini player;
6
7void setup() {
8 Serial.begin(115200);
9 dfSerial.begin(9600); // DFPlayer her zaman 9600 baud / DFPlayer always uses 9600 baud
10 Serial.println(F("DFPlayer baslatiliyor / Starting DFPlayer..."));
11
12 if (!player.begin(dfSerial)) { // reset gönderir, kartı bekler / sends a reset, waits for the card
13 Serial.println(F("Unable to begin: kablolari ve SD karti kontrol et / check wiring and SD card"));
14 while (true) {} // burada dur / stop here
15 }
16 Serial.println(F("DFPlayer Mini online."));
17 Serial.print(F("Karttaki dosya / Files on card: "));
18 Serial.println(player.readFileCounts()); // gizli dosyalar da sayılır / hidden files are counted too
19
20 player.volume(20); // ses seviyesi 0-30 / volume 0-30
21 player.EQ(DFPLAYER_EQ_NORMAL); // ekolayzır: normal / equalizer: normal
22 player.play(1); // kökteki ilk dosya / first file in the root
23}
24
25void loop() {
26 if (player.available()) { // modülden bildirim geldi / a message arrived from the module
27 uint8_t type = player.readType();
28 int value = player.read();
29 if (type == DFPlayerPlayFinished) {
30 Serial.print(F("Parca bitti / Track finished: "));
31 Serial.println(value);
32 } else if (type == DFPlayerError) {
33 Serial.print(F("Hata kodu / Error code: "));
34 Serial.println(value); // kodların anlamı tabloda / meanings are in the table
35 } else if (type == DFPlayerCardRemoved) {
36 Serial.println(F("SD kart cikarildi / SD card removed"));
37 }
38 }
39}
40| Fungsi | Kegunaannya |
|---|---|
| begin(serial, isACK, doReset) | Memulai modul; secara default mengirim reset dan menunggu pesan bahwa kartu sudah siap |
| volume(0–30) | Mengatur volume; volumeUp() dan volumeDown() mengubahnya satu tingkat |
| EQ(DFPLAYER_EQ_POP) | Equalizer: NORMAL, POP, ROCK, JAZZ, CLASSIC, BASS |
| play(n) | Memutar file ke-n di root (sesuai urutan salin) |
| next() / previous() | Lagu berikutnya / sebelumnya |
| pause() / start() | Menjeda / melanjutkan dari posisi terakhir |
| stop() | Menghentikan pemutaran |
| loop(n) | Mengulang lagu n terus-menerus |
| enableLoopAll() / randomAll() | Memutar semua lagu secara berulang / secara acak |
| readState() / readVolume() / readFileCounts() | Menanyakan status, volume, dan jumlah file di kartu |
| available() / readType() / read() | Membaca pesan dari modul (lagu selesai, error, kartu dicabut) |
Volume, EQ, dan pengumuman berurutan dengan pin BUSY
Volume berkisar dari 0 sampai 30. Dengan speaker kecil, 15–20 sudah cukup untuk kebanyakan ruangan; di atas 25, terutama dengan catu daya yang lemah, suaranya bisa mulai pecah (clipping) dan modul bisa reset. Pengaturan EQ mengubah keseimbangan bass dan treble; di speaker kecil, mode BASS bisa membuat suara jadi keruh, jadi mulailah dengan NORMAL. Folder bernomor sangat berguna untuk proyek yang bisa bicara: taruh kata “Suhu” dan “derajat” di folder 01 serta angka dari 001.mp3 sampai 100.mp3 di folder 02, maka Arduino bisa mengucapkan angka sebagai sebuah kalimat. Cara paling andal untuk mengetahui bahwa sebuah file sudah selesai adalah pin BUSY: pin ini LOW selama modul memutar dan HIGH ketika diam. Sketch di bawah membaca BUSY di D5 dan memutar file satu per satu tanpa saling tumpang tindih:
1#include <SoftwareSerial.h>
2#include <DFRobotDFPlayerMini.h>
3
4SoftwareSerial dfSerial(10, 11); // RX = D10 ← DFPlayer TX, TX = D11 → 1 kΩ → DFPlayer RX
5DFRobotDFPlayerMini player;
6const byte BUSY_PIN = 5; // DFPlayer BUSY: çalarken LOW / LOW while playing
7
8// Klasör 01: 001.mp3 "Sıcaklık", 002.mp3 "derece" / folder 01: 001.mp3 "Temperature", 002.mp3 "degrees"
9// Klasör 02: 001.mp3 ... 100.mp3 = 1 ... 100 sayıları / folder 02: 001.mp3 ... 100.mp3 = numbers 1 ... 100
10
11void playAndWait(uint8_t folder, uint8_t file) {
12 player.playFolder(folder, file); // /01/001.mp3 gibi / e.g. /01/001.mp3
13 unsigned long start = millis();
14 while (digitalRead(BUSY_PIN) == HIGH && millis() - start < 1000) {} // çalma başlasın / wait for playback to start
15 while (digitalRead(BUSY_PIN) == LOW) {} // parça bitsin / wait for the track to end
16 delay(50);
17}
18
19void sayTemperature(int degrees) {
20 playAndWait(1, 1); // "Sıcaklık" / "Temperature"
21 if (degrees >= 1 && degrees <= 100) {
22 playAndWait(2, degrees); // sayıyı söyle / say the number
23 }
24 playAndWait(1, 2); // "derece" / "degrees"
25}
26
27void setup() {
28 pinMode(BUSY_PIN, INPUT);
29 Serial.begin(115200);
30 dfSerial.begin(9600);
31 if (!player.begin(dfSerial)) {
32 Serial.println(F("Unable to begin"));
33 while (true) {}
34 }
35 player.volume(22);
36 sayTemperature(23); // değer bir sensörden de gelebilir / the value can come from a sensor
37}
38
39void loop() {
40}
41playAndWait() pertama mengirim perintah, menunggu sampai 1 detik sampai BUSY menjadi LOW (modul butuh beberapa ratus milidetik untuk mulai memutar), lalu menunggu sampai lagunya selesai. File audionya bisa kamu rekam dengan suaramu sendiri atau kamu buat dengan alat text-to-speech (TTS); memotong bagian hening di awal dan akhir setiap file membuat pengumumannya mengalir lebih alami. Kalau kamu ingin menyela musik untuk peringatan singkat, pakai advertise(n): modul memutar pengumuman dari folder /advert lalu melanjutkan musik dari posisi terakhir. Perintah ini hanya berfungsi selama ada lagu yang diputar; kalau dipanggil ketika modul diam, hasilnya error.
Mengganti lagu dengan tombol dan mengatur volume dengan potensiometer
Sekarang ayo buat pemutar MP3 kita sendiri: tiga tombol berfungsi sebagai lagu sebelumnya, putar/jeda, dan lagu berikutnya, sementara sebuah potensiometer mengatur volume. Sambungkan tombol di antara D2, D3, dan D4 dengan GND; karena kita memakai resistor pull-up internal, tidak perlu resistor eksternal (alasannya dijelaskan di Cara Menghubungkan Push Button). Pin luar potensiometer menuju 5V dan GND, dan pin tengahnya menuju A0. Ketika sebuah lagu selesai, sketch otomatis lanjut ke lagu berikutnya.
1#include <SoftwareSerial.h>
2#include <DFRobotDFPlayerMini.h>
3
4SoftwareSerial dfSerial(10, 11); // RX = D10 ← DFPlayer TX, TX = D11 → 1 kΩ → DFPlayer RX
5DFRobotDFPlayerMini player;
6
7const byte BTN[3] = {2, 3, 4}; // önceki, oynat/duraklat, sonraki / previous, play/pause, next
8const byte POT_PIN = A0; // ses ayarı potu / volume potentiometer
9bool lastState[3] = {HIGH, HIGH, HIGH};
10unsigned long lastChange[3] = {0, 0, 0};
11bool paused = false;
12int lastRaw = -100; // ilk turda sesi mutlaka ayarla / always set the volume on the first pass
13unsigned long lastPotRead = 0;
14unsigned long lastFinish = 0;
15
16// Butona yeni basıldıysa true döner (50 ms sıçrama filtresi) / true on a new press (50 ms debounce)
17bool pressed(byte i) {
18 bool s = digitalRead(BTN[i]);
19 if (s != lastState[i] && millis() - lastChange[i] > 50) {
20 lastState[i] = s;
21 lastChange[i] = millis();
22 return s == LOW; // INPUT_PULLUP: basınca LOW / LOW when pressed
23 }
24 return false;
25}
26
27void setup() {
28 for (byte i = 0; i < 3; i++) pinMode(BTN[i], INPUT_PULLUP);
29 Serial.begin(115200);
30 dfSerial.begin(9600);
31 if (!player.begin(dfSerial)) {
32 Serial.println(F("Unable to begin"));
33 while (true) {}
34 }
35 player.play(1);
36}
37
38void loop() {
39 if (pressed(0)) { player.previous(); paused = false; }
40 if (pressed(2)) { player.next(); paused = false; }
41 if (pressed(1)) {
42 if (paused) player.start(); // kaldığı yerden devam / resume
43 else player.pause(); // duraklat / pause
44 paused = !paused;
45 }
46
47 if (millis() - lastPotRead > 100) { // potu saniyede 10 kez oku / read the pot 10 times per second
48 lastPotRead = millis();
49 int raw = analogRead(POT_PIN);
50 if (abs(raw - lastRaw) > 20) { // titremeyi yok say / ignore jitter
51 lastRaw = raw;
52 player.volume(map(raw, 0, 1023, 0, 30));
53 }
54 }
55
56 if (player.available() && player.readType() == DFPlayerPlayFinished) {
57 if (millis() - lastFinish > 1000) player.next(); // parça bitince sonrakine geç / go to the next track
58 lastFinish = millis(); // bazı modüller bitişi iki kez bildirir / some modules report the end twice
59 }
60}
61| Bagian kode | Fungsinya |
|---|---|
| pressed() | Hanya menangkap momen tombol ditekan dan mengabaikan pantulan dalam 50 ms; menahan tombol tetap hanya mengirim satu perintah |
| abs(raw - lastRaw) > 20 | Memperbarui volume hanya ketika ada perubahan yang jelas, sehingga goyangan kecil pada pembacaan potensiometer tidak membanjiri modul dengan perintah dan menimbulkan bunyi klik |
| map(raw, 0, 1023, 0, 30) | Mengubah nilai analog 0–1023 menjadi rentang volume DFPlayer 0–30 |
| paused | Mengingat status pemutaran sehingga tombol yang sama bisa menjeda sekaligus melanjutkan |
| DFPlayerPlayFinished | Pesan yang dikirim ketika lagu selesai; sketch pindah ke lagu berikutnya |
| millis() - lastFinish > 1000 | Sebagian modul clone melaporkan akhir lagu dua kali; pengecekan ini mencegah ada lagu yang terlewati |
Memilih speaker (3 W) dan amplifier eksternal
Amplifier bawaan DFPlayer (chip tipe 8002 di kebanyakan board) langsung menggerakkan speaker di bawah 3 W dengan impedansi 4 Ω atau 8 Ω. Keseimbangan terbaik didapat dari speaker 8 Ω, 1–3 W; speaker kecil 0,5 W juga bisa, tapi kewalahan di volume tinggi. Angka 3 W adalah batas atas amplifier dengan catu daya 5 V dan beban 4 Ω, pada titik ketika distorsi sudah jelas terdengar; daya bersih yang kamu dapat dalam pemakaian sehari-hari lebih rendah. Memasang speaker di dalam kotak, atau setidaknya di sebuah panel, terasa memperbaiki bass, karena suara dari depan dan belakang membran tidak lagi saling meniadakan. Di volume tinggi, modul bisa sesaat menarik beberapa ratus miliampere; pada Arduino yang diberi daya dari port USB komputer, ini bisa menyebabkan tegangan anjlok, desis, dan reset. Kalau kamu ingin daya lebih besar atau suara stereo, sambungkan output line DAC_L dan DAC_R ke amplifier eksternal:
| Jalur output | Koneksi | Kapan? |
|---|---|---|
| Amplifier bawaan | SPK_1 dan SPK_2 → speaker 4–8 Ω sampai 3 W | Proyek kecil seperti bel pintu, mainan, dan peringatan lisan |
| Headphone | DAC_L, DAC_R, dan GND → jack 3,5 mm | Didengarkan sendiri; mulai dari volume rendah |
| Modul amplifier PAM8403 | DAC_L, DAC_R, dan GND → input L, R, dan GND amplifier; amplifier bekerja di 5 V | Speaker portabel stereo 2 × 3 W bertenaga baterai |
| Amplifier PAM8610 atau TPA3116 | Output DAC → input amplifier; amplifier bekerja di 12 V | Daya lebih besar: 2 × 10 W ke atas |
| Speaker aktif (AUX) | DAC_L, DAC_R, dan GND → input AUX speaker aktif | Memakai speaker komputer yang sudah ada |
Cara menghilangkan desis, noise, dan bunyi klik
- Desis dan klik ketika mengirim perintah: Resistor 1 kΩ di jalur RX tidak ada. Pasang di antara pin TX Arduino dan pin RX modul.
- Desis atau dengung terus-menerus: Catu dayanya berisik atau terlalu lemah. Beri daya DFPlayer dari catu daya 5 V terpisah, tambahkan kapasitor di antara VCC dan GND, dan sambungkan semua GND menjadi satu.
- Bunyi “pop” ketika menyala: Asalnya dari perintah reset yang dikirim begin(). Kalau mengganggu, lewati reset dengan player.begin(dfSerial, true, false).
- Dengung dengan ESP32: Pulsa arus selama transmisi Wi-Fi masuk ke catu daya lalu dari sana ke audio. Tambahkan kapasitor di catu daya DFPlayer dan pakai catu daya terpisah kalau bisa.
- Suara pecah dan terdistorsi di volume tinggi: Speaker atau amplifier bekerja di batasnya. Turunkan volume ke sekitar 20–25, pilih speaker yang lebih efisien, atau beralih ke amplifier eksternal.
- Desis halus ketika tidak ada yang diputar: Ini noise bawaan amplifier di board dan tidak pernah hilang sepenuhnya di modul kecil. Di proyek yang butuh keheningan, menyambungkan output DAC ke amplifier eksternal yang bagus memberi hasil terbaik.
Error “Unable to begin” dan cara mengatasinya
Kalau Serial Monitor menampilkan Unable to begin: diikuti 1.Please recheck the connection! dan 2.Please insert the SD card!, berarti pengecekan begin() di contoh sketch library gagal. begin() mengirim perintah reset ke modul dan menunggu 2 detik untuk pesan “card online”; kalau pesan itu tidak datang, fungsinya mengembalikan false. Jadi penyebabnya bisa pengkabelan, kartu SD, catu daya, atau cara modul merespons. Telusuri dengan urutan ini:
| Kemungkinan penyebab | Cek dan solusi |
|---|---|
| TX dan RX tidak disilang | TX modul harus menuju D10 (RX SoftwareSerial) dan RX-nya menuju D11 (TX SoftwareSerial) lewat 1 kΩ; ini harus cocok dengan urutan (RX, TX) di SoftwareSerial(10, 11) |
| Tidak ada GND bersama | GND modul harus tersambung ke GND Arduino; kalau kamu memakai catu daya terpisah, satukan juga GND-nya |
| Kartu SD tidak terbaca | Apakah kartunya sudah dimasukkan, berformat FAT32, lebih kecil dari 32 GB, dan berisi minimal satu file audio? Format ulang atau coba kartu lain |
| Resistor salah | Jalur RX butuh 1 kΩ; nilai besar seperti 10 kΩ melemahkan sinyal |
| Daya tidak cukup | VCC seharusnya 4–5 V; lepas speaker sementara, ukur tegangannya dengan multimeter, dan tambahkan kapasitor |
| Baud rate salah | Harus dfSerial.begin(9600); jangan tertukar dengan kecepatan Serial Monitor (115200) |
| D0 dan D1 dipakai | Di Uno, port serial hardware dipakai bersama USB; pindahkan modul ke pin SoftwareSerial |
| Chip clone terlambat menjawab | Tambahkan delay(1000) sebelum begin(); kalau tidak membantu, pakai begin(dfSerial, true, false) untuk melewati waktu tunggu setelah reset |
| Kode DFPlayerError | Nama di library | Arti |
|---|---|---|
| 1 | Busy | Modul sibuk atau kartu tidak ditemukan (inisialisasi belum selesai) |
| 2 | Sleeping | Modul dalam mode sleep |
| 3 | SerialWrongStack | Data serial yang diterima rusak |
| 4 | CheckSumNotMatch | Checksum paket tidak cocok |
| 5 | FileIndexOut | Nomor lagu yang diminta berada di luar rentang yang ada di kartu |
| 6 | FileMismatch | File yang diminta tidak ditemukan; cek penamaannya |
| 7 | Advertise | Error advert, misalnya advertise() dipanggil ketika tidak ada yang diputar |
DFPlayer Mini dengan ESP32: mengendalikan MP3 dari halaman web
Di ESP32 kamu tidak butuh SoftwareSerial; salah satu dari tiga UART hardware-nya bisa ditempatkan di pin yang kamu pilih. Di sketch di bawah, UART2 berjalan di GPIO 16 (RX) dan GPIO 17 (TX), dan DFPlayer diberi daya dari pin 5V (VIN) board ESP32. Sinyal TX 3,3 V dari ESP32 langsung kompatibel dengan modul, tapi tetap pasang resistor 1 kΩ sebagai pelindung dari noise. Ke arah sebaliknya, DFRobot menyebutkan bahwa level logika modul adalah 3,3 V; meski begitu, tegangan yang lebih tinggi pernah terukur di jalur TX sebagian board clone yang bekerja di 5 V. Sebelum menyambungkan, ukur di antara TX dan GND dengan multimeter; kalau di atas 3,6 V, tambahkan pembagi tegangan 1 kΩ + 2 kΩ. Sketch ini terhubung ke jaringan rumahmu dan menyajikan halaman yang bisa kamu buka di ponsel; tombol-tombolnya mengganti lagu, menjeda, dan mengatur volume.
1#include <WiFi.h>
2#include <WebServer.h>
3#include <DFRobotDFPlayerMini.h>
4
5const char *WIFI_SSID = "WIFI_ADI"; // kendi ağ adın / your network name
6const char *WIFI_PASS = "WIFI_SIFRESI"; // kendi şifren / your password
7
8HardwareSerial dfSerial(2); // UART2
9DFRobotDFPlayerMini player;
10WebServer server(80);
11int volumeLevel = 15;
12
13const char PAGE[] = R"rawliteral(<!DOCTYPE html><html><head>
14<meta name="viewport" content="width=device-width,initial-scale=1"><title>ESP32 MP3</title>
15<style>body{font-family:sans-serif;text-align:center}button{font-size:22px;margin:6px;padding:10px 18px}</style>
16</head><body><h2>DFPlayer Mini</h2>
17<button onclick="c('prev')">Prev</button><button onclick="c('pause')">Pause</button>
18<button onclick="c('play')">Play</button><button onclick="c('next')">Next</button><br>
19<button onclick="c('down')">Vol -</button><button onclick="c('up')">Vol +</button>
20<p id="s"></p>
21<script>function c(x){fetch('/cmd?c='+x).then(r=>r.text()).then(t=>document.getElementById('s').innerText=t)}</script>
22</body></html>)rawliteral";
23
24void handleCmd() {
25 String c = server.arg("c");
26 if (c == "next") player.next();
27 else if (c == "prev") player.previous();
28 else if (c == "pause") player.pause();
29 else if (c == "play") player.start();
30 else if (c == "up" && volumeLevel < 30) player.volume(++volumeLevel);
31 else if (c == "down" && volumeLevel > 0) player.volume(--volumeLevel);
32 server.send(200, "text/plain", "Ses / Volume: " + String(volumeLevel));
33}
34
35void setup() {
36 Serial.begin(115200);
37 dfSerial.begin(9600, SERIAL_8N1, 16, 17); // RX = GPIO16 ← DFPlayer TX, TX = GPIO17 → 1 kΩ → DFPlayer RX
38 delay(1000); // modül kartı okusun / let the module read the card
39 if (!player.begin(dfSerial)) {
40 Serial.println("Unable to begin");
41 while (true) delay(10);
42 }
43 player.volume(volumeLevel);
44
45 WiFi.begin(WIFI_SSID, WIFI_PASS);
46 while (WiFi.status() != WL_CONNECTED) { // ağa bağlanana kadar bekle / wait for the network
47 delay(500);
48 Serial.print(".");
49 }
50 Serial.print("\nAdres / Address: http://");
51 Serial.println(WiFi.localIP());
52
53 server.on("/", []() { server.send(200, "text/html", PAGE); });
54 server.on("/cmd", handleCmd);
55 server.begin();
56 player.play(1);
57}
58
59void loop() {
60 server.handleClient(); // tarayıcı isteklerini işle / handle browser requests
61}
62Setelah meng-upload, ketik alamat yang tampil di Serial Monitor (misalnya 192.168.1.42) di browser ponselmu; ponsel dan ESP32 harus berada di jaringan Wi-Fi yang sama. Kalau tidak mau terhubung, ikuti langkah-langkah di ESP32 tidak mau terhubung ke Wi-Fi. Di board dengan modul ESP32-WROVER, GPIO 16 dan 17 dipakai untuk PSRAM internal, jadi pindahkan UART ke pin lain seperti 26 dan 27; yang perlu kamu ubah hanya nomor pin di baris dfSerial.begin(). Kalau ESP32 restart sendiri ketika speaker berbunyi keras, masalahnya ada di catu daya; lihat brownout ESP32 untuk detailnya.
DFPlayer Mini dengan Raspberry Pi Pico dan MicroPython (UART)
Di Raspberry Pi Pico, memakai protokol serial modul secara langsung itu mudah sekaligus mendidik, daripada mencari-cari library siap pakai. Setiap perintah adalah paket 10 byte: byte awal 0x7E, versi 0xFF, panjang 0x06, kode perintah, flag umpan balik (0 = tanpa konfirmasi), parameter dua byte, checksum dua byte, dan byte akhir 0xEF. Checksum-nya adalah negatif 16-bit dari jumlah enam byte mulai dari versi sampai byte parameter terakhir. Misalnya, paket yang memutar lagu pertama di root adalah 7E FF 06 03 00 00 01 FE F7 EF. Sebaliknya, modul mengirim pesan dengan kode 0x3D ketika lagu selesai, 0x3F ketika kartu siap, dan 0x40 ketika terjadi error. UART 3,3 V milik Pico langsung cocok dengan modul; peringatan tegangan TX dari bagian ESP32 juga berlaku di sini, karena pin Pico juga tidak tahan 5 V. Beri daya modul dari pin VBUS (USB 5 V) Pico.
| Perintah | Kode | Parameter |
|---|---|---|
| Lagu berikutnya / sebelumnya | 0x01 / 0x02 | Tidak ada |
| Putar lagu ke-n di root | 0x03 | 1–2999 |
| Volume | 0x06 | 0–30 |
| EQ | 0x07 | 0–5 |
| Reset | 0x0C | Tidak ada |
| Lanjutkan / jeda | 0x0D / 0x0E | Tidak ada |
| Putar dari folder | 0x0F | Byte atas folder (1–99), byte bawah file (1–255) |
| Putar dari folder mp3 | 0x12 | Nomor file (1 untuk 0001.mp3) |
| Pengumuman (advert) | 0x13 | Nomor file |
| Stop | 0x16 | Tidak ada |
| Lagu selesai (dikirim oleh modul) | 0x3D | Nomor lagu yang sudah selesai |
1from machine import UART, Pin
2import time
3
4# GP0 (UART0 TX) → 1 kΩ → DFPlayer RX, GP1 (UART0 RX) ← DFPlayer TX
5uart = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1))
6btn_next = Pin(14, Pin.IN, Pin.PULL_UP) # sonraki parça / next track
7btn_play = Pin(15, Pin.IN, Pin.PULL_UP) # oynat-duraklat / play-pause
8TRACKS = 5 # /mp3 klasöründeki dosya sayısı / number of files in /mp3
9
10def send(cmd, param=0):
11 # 10 baytlık komut paketi, onay istemeden / 10-byte command frame without ACK
12 frame = bytearray([0x7E, 0xFF, 0x06, cmd, 0x00, param >> 8, param & 0xFF, 0, 0, 0xEF])
13 checksum = -sum(frame[1:7]) & 0xFFFF # sağlama toplamı / checksum
14 frame[7] = checksum >> 8
15 frame[8] = checksum & 0xFF
16 uart.write(frame)
17 time.sleep_ms(30)
18
19buf = b""
20
21def events():
22 # gelen 10 baytlık bildirimlerin komut kodlarını döndür / return command codes of incoming messages
23 global buf
24 if uart.any():
25 buf += uart.read()
26 codes = []
27 while True:
28 start = buf.find(b"\x7e")
29 if start < 0:
30 buf = b""
31 break
32 if len(buf) - start < 10:
33 buf = buf[start:]
34 break
35 frame = buf[start:start + 10]
36 if frame[9] == 0xEF:
37 codes.append(frame[3])
38 buf = buf[start + 10:]
39 else:
40 buf = buf[start + 1:]
41 return codes
42
43def play_track(n):
44 send(0x12, n) # /mp3/000n.mp3 dosyasını çal / play /mp3/000n.mp3
45
46time.sleep(2) # modül kartı okusun / let the module read the card
47send(0x06, 18) # ses 18/30 / volume 18 of 30
48track = 1
49play_track(track)
50playing = True
51last_end = 0
52
53while True:
54 if btn_next.value() == 0:
55 track = track % TRACKS + 1 # son parçadan sonra başa dön / wrap after the last track
56 play_track(track)
57 playing = True
58 time.sleep_ms(300) # basit sıçrama önleme / simple debounce
59 if btn_play.value() == 0:
60 send(0x0E if playing else 0x0D) # 0x0E duraklat, 0x0D devam / 0x0E pause, 0x0D resume
61 playing = not playing
62 time.sleep_ms(300)
63 for code in events():
64 # 0x3D: SD karttaki parça bitti / 0x3D: track on the SD card finished
65 if code == 0x3D and time.ticks_diff(time.ticks_ms(), last_end) > 1000:
66 last_end = time.ticks_ms() # çift bildirimi yok say / ignore the duplicate message
67 track = track % TRACKS + 1
68 play_track(track)
69Kalau kode disimpan ke Pico sebagai main.py dengan Thonny, Pico akan berperilaku seperti pemutar MP3 setiap kali dinyalakan; kalau kamu baru mengenal MicroPython, lihat Dasar-Dasar MicroPython. Tombol di GP14 melompat ke lagu berikutnya dan tombol di GP15 menjeda dan melanjutkan; sisi lain setiap tombol menuju GND. Fungsi events() mengumpulkan byte yang masuk ke dalam buffer dan mengambil paket yang diawali 0x7E dan diakhiri 0xEF. Ketika pesan lagu selesai (0x3D) datang, kode lanjut ke file berikutnya dan kembali ke file pertama setelah file terakhir. Jangan lupa mengatur variabel TRACKS sesuai jumlah file di folder /mp3-mu.
Ide proyek DFPlayer Mini
- Bel pintu bermelodi: Bel pintu yang memutar nada acak ketika tombol ditekan dan mengecilkan volumenya di malam hari.
- Sistem penyambut: Sensor gerak PIR memicu ucapan selamat datang ketika ada orang yang datang.
- Kotak musik berbasis kartu: Setiap kartu RFID memutar folder yang berbeda; pemutar musik tanpa layar untuk anak-anak.
- Jam bicara: Dengan modul jam RTC, jam yang mengucapkan waktu atau memberi pengumuman di setiap pergantian jam.
- Pemutar MP3 dengan remote: Kendali lagu dan volume dengan penerima IR dan remote.
- Properti Halloween atau kotak jahil: HC-SR04 memutar suara seram ketika mendeteksi ada orang yang mendekat.
- Alarm dan peringatan lisan: Kalimat yang jelas seperti “Gas terdeteksi di dapur” sebagai pengganti bunyi bip ketika ada gas, banjir, atau pintu yang lupa ditutup.
- Pemutar MP3 dengan layar: Tampilkan nomor lagu dan volume di layar OLED.
Dengan kartu SD yang dinamai dengan benar, resistor 1 kΩ di jalur RX, dan catu daya 5 V yang stabil, DFPlayer Mini menambahkan suara sungguhan ke proyek Arduino-mu dalam hitungan menit. Kalau ada yang tidak beres, cek dulu kartu dan pengkabelannya, lalu catu dayanya; hampir semua masalah berasal dari salah satu dari tiga hal itu. Kalau kamu penasaran dengan dasar-dasar komunikasi serial, Komunikasi Serial UART adalah langkah berikutnya yang bagus. Di aplikasi BlueGrays kamu akan menemukan proyek suara seperti memutar melodi dengan buzzer, piano sederhana, bel pintu dengan sensor gerak, dan melodi ESP32, masing-masing dengan skema rangkaian dan kode langkah demi langkah, lalu kamu bisa memberinya suara sungguhan dengan DFPlayer Mini.
Pertanyaan umum
Kartu SD berukuran berapa yang didukung DFPlayer Mini?
DFPlayer Mini membaca kartu microSD sampai 32 GB yang diformat sebagai FAT16 atau FAT32. Kartu 64 GB ke atas datang dengan format exFAT, jadi modul tidak bisa melihatnya. Kartu 1–16 GB sudah lebih dari cukup untuk beberapa ratus MP3.
Kenapa DFPlayer Mini-ku tidak mengeluarkan suara?
Pertama pastikan kamu melihat “online” di Serial Monitor; kalau tidak, masalahnya ada di pengkabelan atau kartu SD. Kalau modul sudah mulai tapi tidak ada suara, cek apakah volumenya bukan 0, apakah speaker tersambung ke SPK_1 dan SPK_2, dan apakah nama file cocok dengan fungsi yang kamu panggil. Ketika LED di board menyala, modul memang sedang memutar.
Kenapa resistor 1k dipasang di pin RX DFPlayer Mini?
Chip modul bekerja di 3,3 V, sedangkan pin TX Arduino Uno mengeluarkan 5 V. Resistor 1 kΩ yang dipasang seri dengan jalur RX membatasi arus yang masuk ke chip dan mengurangi desis yang terdengar dari speaker selama komunikasi serial. Resistor ini juga disarankan di board 3,3 V seperti ESP32 dan Pico, sebagai pelindung dari noise.
Bisakah DFPlayer Mini bekerja tanpa Arduino?
Bisa. Kalau pin IO_1 dan IO_2 kamu sambungkan ke GND lewat tombol, tekan singkat mengganti lagu dan tekan lama mengatur volume. Tombol yang disambungkan ke pin ADKEY lewat resistor juga bisa memutar lagu tertentu. Dengan begitu kamu bisa membuat pemutar MP3 atau bel pintu hanya dengan baterai, speaker, dan beberapa tombol, tanpa perlu mikrokontroler.
Speaker apa yang bisa kusambungkan ke DFPlayer Mini?
Speaker 4 Ω atau 8 Ω dengan daya di bawah 3 W bisa langsung disambungkan ke pin SPK_1 dan SPK_2; speaker 8 Ω, 1–3 W memberi keseimbangan terbaik. Jangan pernah menyambungkan salah satu kabel speaker ke GND. Untuk suara yang lebih keras atau stereo, sambungkan output DAC_L dan DAC_R ke amplifier seperti PAM8403.
Kenapa DFPlayer Mini memutar file dengan urutan yang salah?
Fungsi play(n) tidak melihat nama file, tapi urutan file disalin ke kartu. Untuk memutar berdasarkan nama, beri nama file /mp3/0001.mp3 dan pakai playMp3Folder(), atau beri nama /01/001.mp3 dan pakai playFolder(). Kalau kamu menyiapkan kartu di Mac, hapus juga file tersembunyi ._ itu.
Proyek untuk dibuat setelah membaca ini
Lihat semua proyek
Menggunakan Buzzer
Pernah penasaran bagaimana bel pintu atau alarm mengeluarkan suaranya? Arduino membuat buzzer kecil berbunyi bip dengan jeda singkat: bip, jeda, bip, jeda. Kamu melihat bagaimana suara dibuat dengan l

Lagu Kebangsaan Turki dengan Buzzer
Tekan tombol dan buzzer kecil mulai memainkan Lagu Kebangsaan Turki, nada demi nada. Arduino memainkan setiap nada dengan tinggi dan panjang yang tepat, membawakan dua bait lagu kebangsaan dari awal s

Mengatur Frekuensi Buzzer
Kamu mengendalikan suara buzzer dengan empat tombol: satu memulai suara, satu membungkamnya, dan dua lainnya membuatnya lebih tinggi atau lebih rendah. Tahan tombol naik atau turun dan nadanya berubah

Memutar Melodi dengan Buzzer ESP32
Memainkan melodi sederhana (Twinkle Twinkle Little Star) dengan buzzer pasif. Kita memainkan nada dengan fungsi tone() dan noTone() seperti di Arduino; ESP32 bekerja dengan sintaks yang sama di Arduino Core 3.0+. Harus memakai buzzer pasif (buzzer aktif tidak bisa memainkan melodi).

Memainkan Melodi dengan Remote IR dan Buzzer
Buat kotak musik yang memainkan lagu dengan tombol remote TV. Penerima inframerah menangkap sinyal remote; satu tombol memainkan lagu video game yang ceria lewat buzzer, tombol lain lagu anak-anak yan

Piano Sederhana dengan Buzzer dan Tombol
Buat piano kecilmu sendiri dengan delapan tombol. Setiap tombol adalah satu nada, dari rendah ke tinggi: do, re, mi, fa, sol, la, si, dan do tinggi. Nada dimainkan lewat buzzer selama tombol ditahan d

Bel Pintu dan Lampu dengan Sensor Gerak
Ketika ada orang datang ke pintumu, kamu sudah tahu bahkan sebelum ia membunyikan bel. Begitu sensor gerak melihat seseorang, LED menyala dan buzzer memainkan bunyi bel tiga nada dari tinggi ke rendah
Artikel lainnya
Aplikasi BlueGrays
Rakit rangkaian ini langkah demi langkah di ponselmu
Skema pengkabelan, kode, dan daftar komponen dalam satu layar. 200+ proyek Arduino, ESP32, dan Pico siap dibuat.
Pindai dengan ponselmu
Arahkan kamera ke kode ini dan toko aplikasi di ponselmu akan terbuka.
atau buka toko aplikasi

