DFPlayer Mini com Arduino: tocar MP3, cartão SD e alto-falante
Como usar o DFPlayer Mini com Arduino: o resistor de 1k no RX, cartão SD e nomes 0001.mp3, código com biblioteca, botões, alto-falante e exemplos para ESP32 e Pico.
O DFPlayer Mini é o jeito mais barato e fácil de tocar MP3 com Arduino: ele decodifica sozinho os arquivos de áudio de um cartão microSD, aciona um alto-falante diretamente com seu pequeno amplificador embutido e recebe comandos do Arduino por uma ligação serial de dois fios. Diferente dos bipes de um buzzer, ele toca músicas, falas, toques de campainha ou avisos falados como “A porta ainda está aberta”. A maioria das pessoas que o ligam pela primeira vez esbarra nos mesmos problemas: não sai som, o alto-falante chia, os arquivos tocam na ordem errada ou o Monitor Serial diz “Unable to begin”. Este guia resolve cada um deles e explica por que acontecem.
Primeiro você vai conhecer os pinos do módulo e por que um resistor de 1 kΩ vai na linha RX. Depois vai ver como preparar o cartão SD em FAT32, nomear os arquivos no esquema 0001.mp3 e de pastas 01, tocar seu primeiro som com a biblioteca DFRobotDFPlayerMini, ajustar o volume e o EQ, trocar de faixa com botões e escolher o alto-falante ou o amplificador externo certo. As últimas seções trazem a solução passo a passo do erro “Unable to begin”, um tocador de MP3 controlado por uma página web com o ESP32 e um exemplo em MicroPython sem biblioteca para o Raspberry Pi Pico. Se você só precisa de um bipe ou de uma melodia simples, um buzzer é a opção mais simples.

O que é o DFPlayer Mini e como ele funciona?
O DFPlayer Mini é um tocador de MP3 completo, formado por um chip decodificador de MP3, um DAC de 24 bits, um slot para cartão microSD e um pequeno amplificador mono. O Arduino só precisa enviar comandos curtos como “toque a faixa 3” ou “coloque o volume em 20”; ler o arquivo do cartão, decodificar o áudio comprimido e acionar o alto-falante são tarefas do módulo. É por isso que até um Arduino Uno com 2 KB de RAM consegue tocar música sem esforço. Os comandos são enviados a 9600 baud em pacotes de 10 bytes cada, e o módulo responde no mesmo formato quando uma faixa termina, quando um cartão é inserido ou retirado ou quando ocorre um erro. O chip da placa varia conforme o fabricante (YX5200-24SS, MH2024K-24SS, GD3200B e outros). Todos entendem os mesmos comandos, mas podem levar tempos diferentes para responder, um detalhe que vai importar mais adiante com o erro “Unable to begin”. O módulo pode ser controlado de três jeitos: pela porta serial (UART), pelos botões IO ou por uma escada de resistores ADKEY.
| Característica | Valor |
|---|---|
| Arquivos suportados | MP3, WAV, WMA |
| Taxas de amostragem | 8 / 11,025 / 12 / 16 / 22,05 / 24 / 32 / 44,1 / 48 kHz |
| DAC | 24 bits; faixa dinâmica de 90 dB, relação sinal-ruído de 85 dB |
| Armazenamento | Cartão microSD (TF) de até 32 GB, FAT16 ou FAT32; pen drives USB também são suportados |
| Capacidade de pastas | Até 100 pastas, 255 arquivos por pasta |
| Volume | 30 níveis (0–30) |
| Equalizador (EQ) | 6 modos: Normal, Pop, Rock, Jazz, Classic, Bass |
| Saída de alto-falante | Amplificador mono embutido, alto-falantes abaixo de 3 W |
| Saída de linha | DAC_L e DAC_R: estéreo, para fones ou amplificador externo |
| Alimentação | 3,2–5,0 V (tipicamente 4,2 V) |
| Corrente em espera | Cerca de 20 mA |
| Interface | UART, 9600 baud, 8N1 |
| Tamanho | 20 × 20 mm |
Pinagem do DFPlayer Mini
| Pino | Nome | Função |
|---|---|---|
| 1 | VCC | Entrada de alimentação, 3,2–5,0 V |
| 2 | RX | Entrada serial: vai no pino TX da placa por um resistor de 1 kΩ |
| 3 | TX | Saída serial: vai no pino RX da placa |
| 4 | DAC_R | Saída de linha do canal direito (fones ou amplificador) |
| 5 | DAC_L | Saída de linha do canal esquerdo (fones ou amplificador) |
| 6 e 8 | SPK_1, SPK_2 | Saída de alto-falante: os dois fios de um alto-falante abaixo de 3 W vão aqui |
| 7 | GND | Terra |
| 9 | IO_1 | Toque curto no GND: faixa anterior; toque longo: abaixa o volume |
| 10 | GND | Terra |
| 11 | IO_2 | Toque curto no GND: próxima faixa; toque longo: aumenta o volume |
| 12 | ADKEY1 | Entrada para vários botões por escada de resistores |
| 13 | ADKEY2 | Segunda entrada de escada de resistores |
| 14 | USB+ | D+ para pen drive USB |
| 15 | USB− | D− para pen drive USB |
| 16 | BUSY | LOW enquanto toca, HIGH quando parado |
Quando você usa a porta serial, só precisa dos pinos VCC, GND, RX, TX e de alto-falante. O pino BUSY diz se uma faixa terminou sem nenhum tráfego serial, e o pequeno LED da placa também acende durante a reprodução. Os pinos IO_1 e IO_2 permitem que o módulo funcione sem Arduino nenhum: com um botão entre cada pino e o GND, um toque curto muda a faixa e um toque longo ajusta o volume. Botões ligados aos pinos ADKEY por resistores de valores diferentes também podem tocar faixas específicas. Isso significa que uma bateria, um alto-falante e dois botões bastam para montar uma campainha ou um brinquedo falante sem microcontrolador. Os pinos USB+ e USB− servem para tocar de um pen drive em vez do cartão SD e ficam desconectados na maioria dos projetos.
Ligação do DFPlayer Mini com Arduino e o resistor de 1k no RX
| Pino do DFPlayer | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| VCC | 5V | 5V (VIN) | VBUS (5 V da USB, pino 40) |
| GND | GND | GND | GND |
| RX | D11 por um resistor de 1 kΩ | GPIO 17 (TX2) por um resistor de 1 kΩ | GP0 (TX da UART0) por um resistor de 1 kΩ |
| TX | D10 | GPIO 16 (RX2) | GP1 (RX da UART0) |
| SPK_1 e SPK_2 | Os dois fios do alto-falante | Os dois fios do alto-falante | Os dois fios do alto-falante |
| BUSY (opcional) | D5 | Não usado | Não usado |



As linhas de dados são cruzadas: o TX do módulo vai no RX da placa, e o RX dele vai no TX da placa. A porta serial de hardware do Uno, em D0 e D1, é usada para carregar o código pela USB e para o Monitor Serial, então ligamos o módulo em D10 (RX) e D11 (TX) com SoftwareSerial. O resistor de 1 kΩ em série com a entrada RX do módulo não é um detalhe menor. O chip do DFPlayer trabalha com lógica de 3,3 V, enquanto o pino TX do Uno fornece 5 V. Sem o resistor, a diferença empurra corrente pelos diodos de proteção da entrada do chip; essa corrente força o chip e causa o chiado e os cliques que você ouve no alto-falante durante a comunicação serial. Se você fizer a conta com a lei de Ohm, verá que 1 kΩ limita essa corrente a cerca de 1–2 mA, enquanto o sinal de 9600 baud não é afetado. Um resistor muito maior, como 10 kΩ, pode enfraquecer o sinal e quebrar a comunicação. A saída TX do módulo vai direto no Uno, porque o Uno lê 3,3 V como HIGH (o limite é de cerca de 3,0 V).
Preparando o cartão SD: FAT32, pastas e nomes 0001.mp3
O DFPlayer Mini lê cartões microSD de até 32 GB formatados em FAT16 ou FAT32. Cartões de 64 GB ou mais vêm formatados em exFAT, que o módulo não lê; um cartão de 1–16 GB é mais que suficiente para algumas centenas de faixas. Codificar os seus MP3 a 128–192 kbps e 44,1 kHz é a escolha mais segura tanto para compatibilidade quanto para a velocidade de leitura do cartão. O módulo identifica os arquivos por número, não por nome, então os nomes de pastas e arquivos precisam seguir um esquema específico conforme a função que você usar para tocá-los:
| Local no cartão | Exemplo | Função da biblioteca | Regra |
|---|---|---|---|
| Pasta raiz | /0001.mp3, /0002.mp3 | play(1) | Toca na ordem em que os arquivos foram copiados para o cartão, não pelo nome |
| Pastas numeradas | /01/001.mp3 … /99/255.mp3 | playFolder(1, 1) | Nome da pasta com 2 dígitos (01–99), nome do arquivo com 3 dígitos (001–255) |
| Pasta mp3 | /mp3/0001.mp3 | playMp3Folder(1) | Nome do arquivo com 4 dígitos; o arquivo é encontrado pelo número no nome |
| Pasta advert | /advert/0001.mp3 | advertise(1) | Interrompe a faixa atual e a retoma quando o anúncio termina |
| Pastas grandes | /01/0001.mp3 … /15/3000.mp3 | playLargeFolder(1, 1) | Até 15 pastas, 3000 arquivos por pasta, nomes com 4 dígitos |
- Formate o cartão em FAT32 no computador (no Windows: botão direito > Formatar; no macOS: Utilitário de Disco > Apagar > MS-DOS (FAT)).
- Crie na raiz uma pasta chamada mp3 e, se precisar, pastas numeradas como 01 e 02.
- Renomeie os arquivos como 0001.mp3, 0002.mp3 (nas pastas numeradas: 001.mp3). Você pode acrescentar uma descrição depois do número, como 0001_hello.mp3; o módulo só olha os dígitos iniciais.
- Se for tocar os arquivos da raiz com play(), copie-os um de cada vez, em ordem; uma cópia em lote pode bagunçar a ordem.
- Ejete o cartão com segurança e coloque-o no módulo com a alimentação desligada; colocar ou tirar com o módulo funcionando pode corromper os arquivos.
A biblioteca DFRobotDFPlayerMini e um primeiro sketch de teste
- No Arduino IDE, abra o Gerenciador de Bibliotecas, digite DFRobotDFPlayerMini e instale a biblioteca da DFRobot. Os passos de instalação estão explicados em detalhes em Como instalar uma biblioteca no Arduino.
- Copie pelo menos um MP3 para a raiz do cartão SD, coloque o cartão no módulo e monte o circuito como mostra a tabela.
- Carregue o sketch abaixo e abra o Monitor Serial a 115200 baud.
- Em poucos segundos você deve ver “DFPlayer Mini online.” e o número de arquivos do cartão e, em seguida, ouvir a primeira faixa.
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| Função | O que faz |
|---|---|
| begin(serial, isACK, doReset) | Inicia o módulo; por padrão, envia um reset e espera a mensagem de que o cartão está pronto |
| volume(0–30) | Ajusta o volume; volumeUp() e volumeDown() mudam um nível |
| EQ(DFPLAYER_EQ_POP) | Equalizador: NORMAL, POP, ROCK, JAZZ, CLASSIC, BASS |
| play(n) | Toca o n-ésimo arquivo da raiz (na ordem de cópia) |
| next() / previous() | Próxima / faixa anterior |
| pause() / start() | Pausa / retoma de onde parou |
| stop() | Para a reprodução |
| loop(n) | Repete a faixa n sem parar |
| enableLoopAll() / randomAll() | Toca todas as faixas em loop / em ordem aleatória |
| readState() / readVolume() / readFileCounts() | Consulta o status, o volume e o número de arquivos no cartão |
| available() / readType() / read() | Lê as mensagens do módulo (faixa terminou, erro, cartão retirado) |
Volume, EQ e anúncios em sequência com o pino BUSY
O volume vai de 0 a 30. Com um alto-falante pequeno, 15–20 basta para a maioria dos cômodos; acima de 25, principalmente com uma fonte fraca, o som pode começar a distorcer (clipping) e o módulo pode reiniciar. A configuração de EQ muda o equilíbrio entre graves e agudos; em alto-falantes pequenos, o modo BASS pode deixar o som embolado, então comece pelo NORMAL. As pastas numeradas são muito práticas para projetos falantes: coloque as palavras “Temperatura” e “graus” na pasta 01 e os números de 001.mp3 a 100.mp3 na pasta 02, e o Arduino consegue falar números como uma frase. O jeito mais confiável de saber que um arquivo terminou é o pino BUSY: ele fica em LOW enquanto o módulo toca e em HIGH quando está parado. O sketch abaixo lê o BUSY no D5 e toca os arquivos um depois do outro, sem sobreposição:
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}
41O playAndWait() primeiro envia o comando, espera até 1 segundo o BUSY ir para LOW (o módulo leva algumas centenas de milissegundos para começar a tocar) e depois espera até a faixa terminar. Você pode gravar os arquivos de áudio com a própria voz ou gerá-los com uma ferramenta de texto para fala (TTS); cortar o silêncio do começo e do fim de cada arquivo deixa o anúncio mais natural. Se você quer interromper a música para um aviso curto, use advertise(n): o módulo toca o anúncio da pasta /advert e depois retoma a música de onde parou. Esse comando só funciona enquanto uma faixa está tocando; chamado com o módulo parado, ele retorna um erro.
Trocando de faixa com botões e ajustando o volume com um potenciômetro
Agora vamos montar nosso próprio tocador de MP3: três botões fazem faixa anterior, tocar/pausar e próxima faixa, e um potenciômetro ajusta o volume. Ligue os botões entre D2, D3 e D4 e o GND; como usamos os resistores de pull-up internos, não é preciso resistor externo (o motivo está explicado em Como ligar um botão). Os pinos das pontas do potenciômetro vão no 5V e no GND, e o pino do meio vai no A0. Quando uma faixa termina, o sketch passa automaticamente para a próxima.
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| Parte do código | Para que serve |
|---|---|
| pressed() | Pega só o momento em que um botão é apertado e ignora repiques em 50 ms; segurar o botão continua enviando um único comando |
| abs(raw - lastRaw) > 20 | Só atualiza o volume em mudanças claras, para que pequenas variações na leitura do potenciômetro não inundem o módulo de comandos e causem cliques |
| map(raw, 0, 1023, 0, 30) | Converte o valor analógico de 0–1023 para a faixa de volume de 0–30 do DFPlayer |
| paused | Lembra o estado da reprodução para que o mesmo botão possa pausar e retomar |
| DFPlayerPlayFinished | A mensagem enviada quando uma faixa termina; o sketch passa para a próxima faixa |
| millis() - lastFinish > 1000 | Alguns módulos clone informam o fim de uma faixa duas vezes; essa verificação impede que uma faixa seja pulada |
Escolhendo um alto-falante (3 W) e um amplificador externo
O amplificador do próprio DFPlayer (um chip do tipo 8002 na maioria das placas) aciona diretamente um alto-falante abaixo de 3 W com impedância de 4 Ω ou 8 Ω. O melhor equilíbrio vem de um alto-falante de 8 Ω e 1–3 W; alto-falantes pequenos de 0,5 W também funcionam, mas sofrem com volume alto. O número de 3 W é o limite superior do amplificador com alimentação de 5 V e carga de 4 Ω, no ponto em que a distorção fica evidente; a potência limpa que você obtém no uso do dia a dia é menor. Montar o alto-falante em uma caixa, ou pelo menos em um painel, melhora bastante os graves, porque o som da frente e o de trás do cone deixam de se anular. Com volume alto, o módulo pode puxar por um instante algumas centenas de miliampères; em um Arduino alimentado pela porta USB de um computador, isso pode causar quedas de tensão, chiado e reinícios. Se você quer mais potência ou som estéreo, ligue as saídas de linha DAC_L e DAC_R a um amplificador externo:
| Caminho de saída | Ligação | Quando? |
|---|---|---|
| Amplificador embutido | SPK_1 e SPK_2 → alto-falante de 4–8 Ω de até 3 W | Projetos pequenos como campainhas, brinquedos e avisos falados |
| Fones de ouvido | DAC_L, DAC_R e GND → conector P2 de 3,5 mm | Escuta individual; comece com volume baixo |
| Módulo amplificador PAM8403 | DAC_L, DAC_R e GND → entradas L, R e GND do amplificador; o amplificador funciona com 5 V | Caixa de som portátil estéreo de 2 × 3 W alimentada por bateria |
| Amplificador PAM8610 ou TPA3116 | Saídas DAC → entrada do amplificador; o amplificador funciona com 12 V | Mais potência: 2 × 10 W ou mais |
| Caixa de som amplificada (AUX) | DAC_L, DAC_R e GND → entrada AUX da caixa amplificada | Aproveitar uma caixa de som de computador que você já tem |
Como se livrar de chiado, ruído e cliques
- Chiado e cliques ao enviar comandos: falta o resistor de 1 kΩ na linha RX. Coloque-o entre o pino TX do Arduino e o pino RX do módulo.
- Chiado ou zumbido constante: a fonte tem ruído ou é fraca demais. Alimente o DFPlayer com uma fonte de 5 V separada, coloque um capacitor entre VCC e GND e ligue todos os GNDs juntos.
- Um “pop” ao ligar: vem do comando de reset enviado pelo begin(). Se incomodar, pule o reset com player.begin(dfSerial, true, false).
- Zumbido com o ESP32: os pulsos de corrente durante a transmissão Wi-Fi entram na alimentação e, dali, no áudio. Coloque um capacitor na alimentação do DFPlayer e, se puder, use uma fonte separada.
- Som rachado e distorcido com volume alto: o alto-falante ou o amplificador está trabalhando no limite. Baixe o volume para cerca de 20–25, escolha um alto-falante mais eficiente ou passe para um amplificador externo.
- Chiado fraco quando nada está tocando: é o ruído do próprio amplificador da placa e nunca some por completo em módulos pequenos. Em projetos em que o silêncio importa, ligar a saída DAC a um bom amplificador externo dá o melhor resultado.
O erro “Unable to begin” e como resolvê-lo
Se o Monitor Serial mostrar Unable to begin: seguido de 1.Please recheck the connection! e 2.Please insert the SD card!, a verificação do begin() no sketch de exemplo da biblioteca falhou. O begin() envia ao módulo um comando de reset e espera 2 segundos pela mensagem de “cartão on-line”; se a mensagem não chegar, ele retorna false. Então a causa pode ser a ligação, o cartão SD, a alimentação ou o jeito como o módulo responde. Vá investigando nesta ordem:
| Causa possível | Verificação e solução |
|---|---|
| TX e RX não cruzados | O TX do módulo precisa ir no D10 (RX da SoftwareSerial) e o RX dele no D11 (TX da SoftwareSerial) por 1 kΩ; isso tem que combinar com a ordem (RX, TX) de SoftwareSerial(10, 11) |
| Sem GND comum | O GND do módulo precisa estar ligado ao GND do Arduino; se você usa uma fonte separada, una os GNDs também |
| Cartão SD não lido | O cartão está inserido, em FAT32, menor que 32 GB e tem pelo menos um arquivo de áudio? Formate de novo ou teste outro cartão |
| Resistor errado | A linha RX precisa de 1 kΩ; valores grandes como 10 kΩ enfraquecem o sinal |
| Alimentação insuficiente | O VCC deve ter 4–5 V; desconecte o alto-falante temporariamente, meça a tensão com um multímetro e coloque um capacitor |
| Baud rate errado | Tem que ser dfSerial.begin(9600); não confunda com a velocidade do Monitor Serial (115200) |
| D0 e D1 usados | No Uno, a porta serial de hardware é compartilhada com a USB; mude o módulo para os pinos da SoftwareSerial |
| Chip clone responde tarde | Coloque um delay(1000) antes do begin(); se não ajudar, use begin(dfSerial, true, false) para pular a espera depois do reset |
| Código de DFPlayerError | Nome na biblioteca | Significado |
|---|---|---|
| 1 | Busy | Módulo ocupado ou cartão não encontrado (inicialização não concluída) |
| 2 | Sleeping | O módulo está em modo sleep |
| 3 | SerialWrongStack | Dados seriais corrompidos recebidos |
| 4 | CheckSumNotMatch | O checksum do pacote não bateu |
| 5 | FileIndexOut | O número de faixa pedido está fora da faixa existente no cartão |
| 6 | FileMismatch | O arquivo pedido não foi encontrado; confira os nomes |
| 7 | Advertise | Erro de anúncio, por exemplo advertise() chamado quando nada está tocando |
DFPlayer Mini com ESP32: controlando MP3 por uma página web
No ESP32 você não precisa de SoftwareSerial; qualquer uma das três UARTs de hardware dele pode ser atribuída aos pinos que você escolher. No sketch abaixo, a UART2 funciona no GPIO 16 (RX) e no GPIO 17 (TX), e o DFPlayer é alimentado pelo pino 5V (VIN) da placa ESP32. O sinal TX de 3,3 V do ESP32 é diretamente compatível com o módulo, mas mantenha o resistor de 1 kΩ mesmo assim, como proteção contra ruído. No sentido contrário, a DFRobot informa que o nível lógico do módulo é de 3,3 V; mesmo assim, já foi medida uma tensão maior na linha TX de algumas placas clone funcionando com 5 V. Antes de ligar, meça entre TX e GND com um multímetro; se passar de 3,6 V, acrescente um divisor de tensão de 1 kΩ + 2 kΩ. O sketch entra na rede da sua casa e serve uma página que você pode abrir no celular; os botões dela trocam de faixa, pausam e ajustam o 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}
62Depois de carregar, digite no navegador do celular o endereço mostrado no Monitor Serial (por exemplo, 192.168.1.42); o celular e o ESP32 precisam estar na mesma rede Wi-Fi. Se não conectar, siga os passos de ESP32 não conecta ao Wi-Fi. Nas placas com módulo ESP32-WROVER, os GPIO 16 e 17 são reservados para a PSRAM interna, então mude a UART para outros pinos, como o 26 e o 27; você só precisa mudar os números dos pinos na linha dfSerial.begin(). Se o ESP32 reiniciar sozinho enquanto o alto-falante toca alto, o problema é a alimentação; veja brownout no ESP32 para os detalhes.
DFPlayer Mini com Raspberry Pi Pico e MicroPython (UART)
No Raspberry Pi Pico, usar diretamente o protocolo serial do módulo, em vez de caçar uma biblioteca pronta, é fácil e didático. Cada comando é um pacote de 10 bytes: o byte de início 0x7E, a versão 0xFF, o comprimento 0x06, o código do comando, a flag de retorno (0 = sem confirmação), um parâmetro de dois bytes, um checksum de dois bytes e o byte de fim 0xEF. O checksum é o negativo de 16 bits da soma dos seis bytes da versão até o último byte do parâmetro. Por exemplo, o pacote que toca a primeira faixa da raiz é 7E FF 06 03 00 00 01 FE F7 EF. O módulo, por sua vez, envia mensagens com o código 0x3D quando uma faixa termina, 0x3F quando o cartão está pronto e 0x40 quando ocorre um erro. A UART de 3,3 V do Pico combina diretamente com o módulo; o aviso sobre a tensão do TX da seção do ESP32 vale aqui também, porque os pinos do Pico também não toleram 5 V. Alimente o módulo pelo pino VBUS (5 V da USB) do Pico.
| Comando | Código | Parâmetro |
|---|---|---|
| Próxima / faixa anterior | 0x01 / 0x02 | Nenhum |
| Tocar a n-ésima faixa da raiz | 0x03 | 1–2999 |
| Volume | 0x06 | 0–30 |
| EQ | 0x07 | 0–5 |
| Reset | 0x0C | Nenhum |
| Retomar / pausar | 0x0D / 0x0E | Nenhum |
| Tocar de uma pasta | 0x0F | Byte alto: pasta (1–99), byte baixo: arquivo (1–255) |
| Tocar da pasta mp3 | 0x12 | Número do arquivo (1 para 0001.mp3) |
| Anúncio (advert) | 0x13 | Número do arquivo |
| Parar | 0x16 | Nenhum |
| Faixa terminou (enviado pelo módulo) | 0x3D | Número da faixa que terminou |
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)
69Se você salvar o código no Pico como main.py com o Thonny, o Pico se comporta como um tocador de MP3 toda vez que é ligado; se está começando no MicroPython, dê uma olhada em fundamentos do MicroPython. O botão no GP14 pula para a próxima faixa e o botão no GP15 pausa e retoma; o outro lado de cada botão vai no GND. A função events() junta os bytes que chegam em um buffer e extrai os pacotes que começam com 0x7E e terminam com 0xEF. Quando chega uma mensagem de faixa terminada (0x3D), o código passa para o próximo arquivo e volta ao primeiro depois do último. Não se esqueça de ajustar a variável TRACKS para o número de arquivos da sua pasta /mp3.
Ideias de projetos com o DFPlayer Mini
- Campainha com melodia: uma campainha que toca uma música aleatória quando o botão é apertado e abaixa o volume à noite.
- Sistema de boas-vindas: um sensor de movimento PIR dispara uma saudação quando alguém chega.
- Caixa de música com cartões: cada cartão RFID toca uma pasta diferente; um tocador de música sem tela para crianças.
- Relógio falante: com um módulo de relógio RTC, um relógio que fala a hora ou avisa a cada hora cheia.
- Tocador de MP3 com controle remoto: controle de faixa e de volume com um receptor IR + controle remoto.
- Decoração de Halloween ou caixa de pegadinha: um HC-SR04 toca um som assustador quando detecta alguém se aproximando.
- Alarmes e alertas falados: frases claras como “Gás detectado na cozinha” em vez de um bipe quando há gás, vazamento de água ou uma porta aberta.
- Tocador de MP3 com display: mostre o número da faixa e o volume em um display OLED de 0,96 polegada.
Com um cartão SD com os nomes certos, o resistor de 1 kΩ na linha RX e uma fonte de 5 V firme, o DFPlayer Mini acrescenta som de verdade aos seus projetos com Arduino em minutos. Se algo der errado, confira primeiro o cartão e a ligação, depois a alimentação; quase todo problema vem de um desses três. Se você tem curiosidade sobre o básico da comunicação serial, comunicação serial UART é um bom próximo passo. No app BlueGrays você encontra projetos de som como tocar melodias com buzzer, um piano simples, uma campainha com sensor de movimento e melodias com ESP32, cada um com esquemas do circuito e código passo a passo, e depois pode dar a eles som de verdade com o DFPlayer Mini.
Perguntas frequentes
Qual tamanho de cartão SD o DFPlayer Mini suporta?
O DFPlayer Mini lê cartões microSD de até 32 GB formatados em FAT16 ou FAT32. Cartões de 64 GB ou mais vêm formatados em exFAT, então o módulo não os enxerga. Um cartão de 1–16 GB é mais que suficiente para algumas centenas de MP3.
Por que meu DFPlayer Mini não toca nenhum som?
Primeiro confira se aparece “online” no Monitor Serial; se não aparecer, o problema é a ligação ou o cartão SD. Se o módulo inicia, mas não há som, confira se o volume não está em 0, se o alto-falante está ligado no SPK_1 e no SPK_2 e se os nomes dos arquivos combinam com a função que você chama. Quando o LED da placa acende, o módulo está mesmo tocando.
Por que se coloca um resistor de 1k no pino RX do DFPlayer Mini?
O chip do módulo trabalha em 3,3 V, enquanto o pino TX do Arduino Uno fornece 5 V. Um resistor de 1 kΩ em série com a linha RX limita a corrente que entra no chip e reduz o chiado ouvido no alto-falante durante a comunicação serial. Ele também é recomendado em placas de 3,3 V como o ESP32 e o Pico, como proteção contra ruído.
O DFPlayer Mini funciona sem Arduino?
Sim. Se você ligar os pinos IO_1 e IO_2 ao GND por botões, um toque curto muda a faixa e um toque longo ajusta o volume. Botões ligados aos pinos ADKEY por resistores também podem tocar faixas específicas. Assim, dá para montar um tocador de MP3 ou uma campainha só com uma bateria, um alto-falante e alguns botões, sem precisar de microcontrolador.
Que alto-falante posso ligar no DFPlayer Mini?
Um alto-falante de 4 Ω ou 8 Ω abaixo de 3 W se liga direto nos pinos SPK_1 e SPK_2; alto-falantes de 8 Ω e 1–3 W dão o melhor equilíbrio. Nunca ligue nenhum dos fios do alto-falante no GND. Para som mais alto ou estéreo, ligue as saídas DAC_L e DAC_R a um amplificador como o PAM8403.
Por que o DFPlayer Mini toca os arquivos na ordem errada?
A função play(n) não olha o nome do arquivo, e sim a ordem em que os arquivos foram copiados para o cartão. Para tocar pelo nome, nomeie os arquivos como /mp3/0001.mp3 e use playMp3Folder(), ou como /01/001.mp3 e use playFolder(). Se você preparou o cartão em um Mac, remova também os arquivos ocultos ._.
Projetos para montar depois desta leitura
Ver todos os projetos
Uso do buzzer
Já se perguntou como uma campainha ou um alarme produz som? O Arduino faz um pequeno buzzer emitir bipes em intervalos curtos: bipe, pausa, bipe, pausa. Você vê como a eletricidade produz som e dá o p

Hino nacional da Turquia com buzzer
Pressione o botão e um pequeno buzzer começa a tocar o hino nacional da Turquia, nota por nota. O Arduino toca cada nota na altura e na duração certas, executando duas estrofes do hino do início ao fi

Ajuste de frequência com buzzer
Você controla o som de um buzzer com quatro botões: um inicia o som, outro o interrompe e os outros dois o deixam mais agudo ou mais grave. Mantenha pressionado o botão de aumentar ou diminuir, e o to

Melodia com buzzer e ESP32
Toque uma melodia simples (Brilha, brilha, estrelinha) com um buzzer passivo. Usamos as funções tone() e noTone() para tocar as notas, como no Arduino. A mesma sintaxe funciona com ESP32 Arduino Core 3.0+. É preciso usar um buzzer passivo, pois o ativo não toca melodias.

Tocar melodias com receptor IR, controle remoto e buzzer
Monte uma caixinha de música que toca melodias com os botões de um controle de TV. Um receptor infravermelho capta o sinal do controle; um botão faz o buzzer tocar uma música animada de videogame, out

Piano simples com buzzer e botões
Monte seu próprio piano com oito botões. Cada botão corresponde a uma nota, da mais grave à mais aguda: dó, ré, mi, fá, sol, lá, si e dó agudo. A nota toca no buzzer enquanto você mantém o botão press

Campainha e luz com sensor de movimento
Quando alguém se aproxima da sua porta, você fica sabendo antes mesmo de a pessoa tocar a campainha. Assim que o sensor detecta alguém, o LED acende e o buzzer toca uma melodia de três notas, da mais
Mais artigos
App BlueGrays
Monte este circuito passo a passo pelo celular
Esquema do circuito, código e lista de componentes em uma só tela. Mais de 200 projetos com Arduino, ESP32 e Pico prontos para montar.
Escaneie com seu celular
Aponte a câmera para o código para abrir a loja de aplicativos do seu celular.
ou abrir a loja

