DFPlayer Mini Arduino: MP3 abspielen, SD-Karte und Lautsprecher
DFPlayer Mini am Arduino anschließen: 1-k-Widerstand an RX, SD-Karte und 0001.mp3-Benennung, Bibliothekscode, Taster, Lautsprecher, ESP32- und Pico-Beispiel.
Der DFPlayer Mini ist der günstigste und einfachste Weg, mit dem Arduino MP3s abzuspielen: Er dekodiert die Audiodateien auf einer microSD-Karte selbstständig, treibt mit seinem kleinen eingebauten Verstärker direkt einen Lautsprecher an und bekommt seine Befehle vom Arduino über eine serielle Verbindung mit nur zwei Leitungen. Anders als die Pieptöne eines Buzzers spielt er Lieder, Sprache, Türklingel-Melodien oder gesprochene Warnungen wie "Die Tür steht noch offen". Fast alle, die ihn zum ersten Mal anschließen, stoßen auf dieselben Probleme: Es kommt kein Ton, der Lautsprecher rauscht, die Dateien laufen in falscher Reihenfolge oder im seriellen Monitor steht "Unable to begin". Diese Anleitung löst jedes dieser Probleme und erklärt, woher es kommt.
Zuerst lernst du die Pins des Moduls kennen und erfährst, warum an die RX-Leitung ein 1-kΩ-Widerstand gehört. Danach siehst du, wie du die SD-Karte in FAT32 vorbereitest, die Dateien nach dem Schema 0001.mp3 und Ordner 01 benennst, mit der Bibliothek DFRobotDFPlayerMini den ersten Ton abspielst, Lautstärke und EQ einstellst, Titel per Taster wechselst und den passenden Lautsprecher oder externen Verstärker auswählst. Die letzten Abschnitte zeigen die schrittweise Lösung für den Fehler "Unable to begin", einen MP3-Player mit dem ESP32, der sich über eine Webseite steuern lässt, und ein MicroPython-Beispiel ohne Bibliothek für den Raspberry Pi Pico. Wenn dir ein Piepton oder eine einfache Melodie reicht, ist ein Buzzer die einfachere Wahl.

Was ist der DFPlayer Mini und wie funktioniert er?
Der DFPlayer Mini ist ein eigenständiger MP3-Player aus einem MP3-Decoder-Chip, einem 24-Bit-DAC, einem microSD-Kartensteckplatz und einem kleinen Mono-Verstärker. Der Arduino muss nur kurze Befehle wie "spiele Titel 3" oder "stelle die Lautstärke auf 20" schicken; die Datei von der Karte lesen, den komprimierten Ton dekodieren und den Lautsprecher antreiben erledigt das Modul. Deshalb kann sogar ein Arduino Uno mit 2 KB RAM mühelos Musik abspielen. Die Befehle werden mit 9600 Baud in Paketen zu je 10 Byte übertragen, und das Modul meldet sich im gleichen Format, wenn ein Titel endet, eine Karte eingesteckt oder entfernt wird oder ein Fehler auftritt. Der Chip auf der Platine hängt vom Hersteller ab (YX5200-24SS, MH2024K-24SS, GD3200B und andere). Alle verstehen dieselben Befehle, antworten aber unterschiedlich schnell; dieses Detail wird später beim Fehler "Unable to begin" wichtig. Steuern lässt sich das Modul auf drei Arten: über die serielle Schnittstelle (UART), mit den IO-Tastern oder über eine ADKEY-Widerstandskette.
| Eigenschaft | Wert |
|---|---|
| Unterstützte Dateien | MP3, WAV, WMA |
| Abtastraten | 8 / 11,025 / 12 / 16 / 22,05 / 24 / 32 / 44,1 / 48 kHz |
| DAC | 24 Bit; 90 dB Dynamikumfang, 85 dB Signal-Rausch-Abstand |
| Speicher | microSD-Karte (TF) bis 32 GB, FAT16 oder FAT32; USB-Sticks werden ebenfalls unterstützt |
| Ordnerkapazität | Bis zu 100 Ordner, 255 Dateien pro Ordner |
| Lautstärke | 30 Stufen (0–30) |
| Equalizer (EQ) | 6 Modi: Normal, Pop, Rock, Jazz, Classic, Bass |
| Lautsprecherausgang | Eingebauter Mono-Verstärker, Lautsprecher unter 3 W |
| Line-Ausgang | DAC_L und DAC_R: Stereo, für Kopfhörer oder externen Verstärker |
| Versorgung | 3,2–5,0 V (typisch 4,2 V) |
| Ruhestrom | Etwa 20 mA |
| Schnittstelle | UART, 9600 Baud, 8N1 |
| Größe | 20 × 20 mm |
DFPlayer Mini Pinbelegung
| Pin | Name | Funktion |
|---|---|---|
| 1 | VCC | Spannungseingang, 3,2–5,0 V |
| 2 | RX | Serieller Eingang: über einen 1-kΩ-Widerstand an den TX-Pin des Boards |
| 3 | TX | Serieller Ausgang: an den RX-Pin des Boards |
| 4 | DAC_R | Line-Ausgang rechter Kanal (Kopfhörer oder Verstärker) |
| 5 | DAC_L | Line-Ausgang linker Kanal (Kopfhörer oder Verstärker) |
| 6 und 8 | SPK_1, SPK_2 | Lautsprecherausgang: Hier kommen die beiden Anschlüsse eines Lautsprechers unter 3 W hin |
| 7 | GND | Masse |
| 9 | IO_1 | Kurz gegen GND: vorheriger Titel; lang: leiser |
| 10 | GND | Masse |
| 11 | IO_2 | Kurz gegen GND: nächster Titel; lang: lauter |
| 12 | ADKEY1 | Eingang für mehrere Taster über eine Widerstandskette |
| 13 | ADKEY2 | Zweiter Eingang für eine Widerstandskette |
| 14 | USB+ | D+ für einen USB-Stick |
| 15 | USB− | D− für einen USB-Stick |
| 16 | BUSY | LOW während der Wiedergabe, HIGH im Leerlauf |
Bei Steuerung über die serielle Schnittstelle brauchst du nur VCC, GND, RX, TX und die Lautsprecherpins. Der BUSY-Pin verrät dir ohne serielle Kommunikation, ob ein Titel zu Ende ist, und auch die kleine LED auf der Platine leuchtet während der Wiedergabe. Die Pins IO_1 und IO_2 machen das Modul sogar ohne Arduino nutzbar: Mit je einem Taster zwischen Pin und GND wechselt ein kurzer Druck den Titel und ein langer Druck ändert die Lautstärke. Taster, die über Widerstände mit unterschiedlichen Werten an den ADKEY-Pins hängen, können außerdem bestimmte Titel starten. So genügen eine Batterie, ein Lautsprecher und zwei Taster für eine Türklingel oder ein sprechendes Spielzeug ganz ohne Mikrocontroller. Die Pins USB+ und USB− dienen zum Abspielen von einem USB-Stick statt der SD-Karte und bleiben in den meisten Projekten frei.
DFPlayer Mini am Arduino anschließen: der 1-k-Widerstand an RX
| DFPlayer-Pin | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| VCC | 5V | 5V (VIN) | VBUS (USB 5 V, Pin 40) |
| GND | GND | GND | GND |
| RX | D11 über einen 1-kΩ-Widerstand | GPIO 17 (TX2) über einen 1-kΩ-Widerstand | GP0 (UART0 TX) über einen 1-kΩ-Widerstand |
| TX | D10 | GPIO 16 (RX2) | GP1 (UART0 RX) |
| SPK_1 und SPK_2 | Die beiden Lautsprecheranschlüsse | Die beiden Lautsprecheranschlüsse | Die beiden Lautsprecheranschlüsse |
| BUSY (optional) | D5 | Nicht verwendet | Nicht verwendet |



Die Datenleitungen werden gekreuzt: TX des Moduls geht an RX des Boards und RX des Moduls an TX des Boards. Die Hardware-Schnittstelle des Uno an D0 und D1 wird für den Upload per USB und den seriellen Monitor gebraucht, deshalb schließen wir das Modul mit SoftwareSerial an D10 (RX) und D11 (TX) an. Der 1-kΩ-Widerstand in Reihe mit dem RX-Eingang des Moduls ist kein unwichtiges Detail. Der Chip des DFPlayer arbeitet mit 3,3-V-Logik, der TX-Pin des Uno liefert dagegen 5 V. Ohne Widerstand fließt wegen der Differenz Strom durch die Schutzdioden am Eingang des Chips; dieser Strom belastet den Chip und verursacht das Rauschen und Knacken, das du während der seriellen Kommunikation im Lautsprecher hörst. Rechnest du mit dem ohmschen Gesetz nach, siehst du, dass 1 kΩ diesen Strom auf etwa 1–2 mA begrenzt, während das 9600-Baud-Signal davon unberührt bleibt. Ein viel größerer Widerstand wie 10 kΩ kann das Signal so schwächen, dass die Kommunikation abbricht. Den TX-Ausgang des Moduls verbindest du direkt mit dem Uno, denn der Uno erkennt 3,3 V als HIGH (die Schwelle liegt bei etwa 3,0 V).
SD-Karte vorbereiten: FAT32, Ordner und 0001.mp3-Benennung
Der DFPlayer Mini liest microSD-Karten bis 32 GB mit dem Dateisystem FAT16 oder FAT32. Karten ab 64 GB sind ab Werk mit exFAT formatiert, und das kann das Modul nicht lesen; für ein paar hundert Titel reicht eine Karte mit 1–16 GB völlig aus. MP3s mit 128–192 kbit/s und 44,1 kHz sind die sicherste Wahl für Kompatibilität und Lesegeschwindigkeit. Das Modul erkennt Dateien an ihrer Nummer, nicht am Namen; je nachdem, mit welcher Funktion du abspielst, müssen Ordner- und Dateinamen einem bestimmten Schema folgen:
| Ort auf der Karte | Beispiel | Bibliotheksfunktion | Regel |
|---|---|---|---|
| Hauptverzeichnis | /0001.mp3, /0002.mp3 | play(1) | Spielt in der Reihenfolge, in der die Dateien auf die Karte kopiert wurden, nicht nach Namen |
| Nummerierte Ordner | /01/001.mp3 … /99/255.mp3 | playFolder(1, 1) | Ordnername 2-stellig (01–99), Dateiname 3-stellig (001–255) |
| Ordner mp3 | /mp3/0001.mp3 | playMp3Folder(1) | Dateiname 4-stellig; die Datei wird über die Nummer im Namen gefunden |
| Ordner advert | /advert/0001.mp3 | advertise(1) | Unterbricht den laufenden Titel und setzt ihn nach der Durchsage fort |
| Große Ordner | /01/0001.mp3 … /15/3000.mp3 | playLargeFolder(1, 1) | Höchstens 15 Ordner, 3000 Dateien pro Ordner, 4-stellige Namen |
- Formatiere die Karte am Computer mit FAT32 (unter Windows: Rechtsklick > Formatieren; unter macOS: Festplattendienstprogramm > Löschen > MS-DOS (FAT)).
- Lege im Hauptverzeichnis einen Ordner namens mp3 und bei Bedarf nummerierte Ordner wie 01 und 02 an.
- Benenne die Dateien in 0001.mp3, 0002.mp3 um (in nummerierten Ordnern 001.mp3). Hinter der Nummer darfst du eine Beschreibung anhängen, etwa 0001_hallo.mp3; das Modul achtet nur auf die Ziffern am Anfang.
- Wenn du die Dateien im Hauptverzeichnis mit play() abspielen willst, kopiere sie einzeln und der Reihe nach; beim Kopieren aller Dateien auf einmal kann die Reihenfolge durcheinandergeraten.
- Wirf die Karte sicher aus und stecke sie im stromlosen Zustand ins Modul; Ein- und Ausstecken im Betrieb kann Dateien beschädigen.
Die Bibliothek DFRobotDFPlayerMini und ein erster Test-Sketch
- Öffne in der Arduino IDE den Bibliotheksverwalter, gib DFRobotDFPlayerMini ein und installiere die Bibliothek von DFRobot. Die Installation im Detail erklärt der Artikel Bibliothek in Arduino hinzufügen.
- Kopiere mindestens eine MP3 ins Hauptverzeichnis der SD-Karte, stecke die Karte ins Modul und baue die Schaltung wie in der Tabelle auf.
- Lade den folgenden Sketch hoch und öffne den seriellen Monitor mit 115200 Baud.
- Nach wenigen Sekunden solltest du "DFPlayer Mini online." und die Anzahl der Dateien auf der Karte sehen und dann den ersten Titel hören.
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| Funktion | Was sie macht |
|---|---|
| begin(seriell, isACK, doReset) | Startet das Modul; sendet standardmäßig einen Reset und wartet auf die Meldung, dass die Karte bereit ist |
| volume(0–30) | Stellt die Lautstärke ein; volumeUp() und volumeDown() ändern sie um eine Stufe |
| EQ(DFPLAYER_EQ_POP) | Equalizer: NORMAL, POP, ROCK, JAZZ, CLASSIC, BASS |
| play(n) | Spielt die n-te Datei im Hauptverzeichnis (in Kopierreihenfolge) |
| next() / previous() | Nächster / vorheriger Titel |
| pause() / start() | Pausiert / setzt an der gleichen Stelle fort |
| stop() | Beendet die Wiedergabe |
| loop(n) | Wiederholt Titel n ununterbrochen |
| enableLoopAll() / randomAll() | Spielt alle Titel in Schleife / in zufälliger Reihenfolge |
| readState() / readVolume() / readFileCounts() | Fragt Status, Lautstärke und Anzahl der Dateien auf der Karte ab |
| available() / readType() / read() | Liest Meldungen des Moduls (Titel zu Ende, Fehler, Karte entfernt) |
Lautstärke, EQ und Ansagen nacheinander mit dem BUSY-Pin
Die Lautstärke reicht von 0 bis 30. Mit einem kleinen Lautsprecher genügt 15–20 für die meisten Räume; über 25 kann der Ton, besonders bei schwacher Versorgung, verzerren (Clipping) und das Modul neu starten. Der EQ verändert das Verhältnis von Bässen und Höhen; bei kleinen Lautsprechern klingt der BASS-Modus schnell dumpf, fang daher mit NORMAL an. Nummerierte Ordner sind für sprechende Projekte sehr praktisch: Legst du die Wörter "Temperatur" und "Grad" in Ordner 01 und die Zahlen von 001.mp3 bis 100.mp3 in Ordner 02, kann der Arduino Zahlen als ganzen Satz sprechen. Am zuverlässigsten erkennst du das Ende einer Datei am BUSY-Pin: Er ist LOW, solange das Modul spielt, und HIGH im Leerlauf. Der folgende Sketch liest BUSY an D5 und spielt die Dateien nacheinander ab, ohne dass sie sich überlagern:
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() sendet zuerst den Befehl, wartet bis zu 1 Sekunde, bis BUSY auf LOW geht (das Modul braucht ein paar hundert Millisekunden, bis die Wiedergabe startet), und wartet dann, bis der Titel zu Ende ist. Die Audiodateien kannst du mit deiner eigenen Stimme aufnehmen oder mit einem Text-to-Speech-Werkzeug (TTS) erzeugen; schneidest du die Stille am Anfang und Ende jeder Datei ab, klingt die Ansage flüssiger. Willst du die Musik für einen kurzen Hinweis unterbrechen, nimm advertise(n): Das Modul spielt die Durchsage aus dem Ordner /advert und setzt die Musik danach an derselben Stelle fort. Dieser Befehl funktioniert nur, während ein Titel läuft; im Leerlauf aufgerufen, liefert er einen Fehler.
Titel per Taster wechseln und Lautstärke mit einem Potentiometer einstellen
Jetzt bauen wir unseren eigenen MP3-Player: Drei Taster übernehmen vorheriger Titel, Wiedergabe/Pause und nächster Titel, und ein Potentiometer regelt die Lautstärke. Schließe die Taster zwischen D2, D3 bzw. D4 und GND an; da wir die internen Pull-up-Widerstände nutzen, brauchst du keine externen Widerstände (warum, erklärt der Artikel Taster am Arduino anschließen). Die äußeren Anschlüsse des Potentiometers kommen an 5V und GND, der mittlere an A0. Wenn ein Titel endet, springt der Sketch automatisch zum nächsten.
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| Codeteil | Wofür? |
|---|---|
| pressed() | Erkennt nur den Moment des Drückens und ignoriert Prellen innerhalb von 50 ms; auch gedrückt gehalten wird nur ein Befehl gesendet |
| abs(raw - lastRaw) > 20 | Ändert die Lautstärke nur bei deutlichen Änderungen, damit kleines Zittern des Poti-Werts das Modul nicht mit Befehlen flutet und Knacken verursacht |
| map(raw, 0, 1023, 0, 30) | Rechnet den Analogwert 0–1023 in den Lautstärkebereich 0–30 des DFPlayer um |
| paused | Merkt sich den Wiedergabezustand, damit derselbe Taster pausieren und fortsetzen kann |
| DFPlayerPlayFinished | Die Meldung am Ende eines Titels; der Sketch springt zum nächsten Titel |
| millis() - lastFinish > 1000 | Manche Klon-Module melden das Titelende doppelt; diese Prüfung verhindert, dass ein Titel übersprungen wird |
Lautsprecher auswählen (3 W) und externer Verstärker
Der eingebaute Verstärker des DFPlayer (auf den meisten Platinen ein Chip vom Typ 8002) treibt einen Lautsprecher unter 3 W mit 4 Ω oder 8 Ω Impedanz direkt an. Am ausgewogensten klingt ein 8-Ω-Lautsprecher mit 1–3 W; kleine 0,5-W-Lautsprecher funktionieren auch, kommen bei hoher Lautstärke aber an ihre Grenzen. Die 3 W sind die Obergrenze des Verstärkers bei 5 V und 4 Ω Last, an der die Verzerrung deutlich wird; die saubere Leistung im Alltag liegt darunter. Baust du den Lautsprecher in ein Gehäuse oder wenigstens in eine Platte ein, werden die Bässe spürbar kräftiger, weil sich der Schall von Vorder- und Rückseite der Membran nicht mehr gegenseitig auslöscht. Bei hoher Lautstärke kann das Modul kurzzeitig einige hundert Milliampere ziehen; bei einem Arduino am USB-Anschluss des Computers führt das zu Spannungseinbrüchen, Rauschen und Neustarts. Für mehr Leistung oder Stereoton verbindest du die Line-Ausgänge DAC_L und DAC_R mit einem externen Verstärker:
| Ausgangsweg | Anschluss | Wann? |
|---|---|---|
| Eingebauter Verstärker | SPK_1 und SPK_2 → Lautsprecher 4–8 Ω bis 3 W | Kleine Projekte wie Türklingel, Spielzeug oder Sprachhinweise |
| Kopfhörer | DAC_L, DAC_R und GND → 3,5-mm-Klinkenbuchse | Persönliches Hören; mit niedriger Lautstärke beginnen |
| Verstärkermodul PAM8403 | DAC_L, DAC_R und GND → Eingänge L, R und GND des Verstärkers; Versorgung mit 5 V | 2 × 3 W Stereo, tragbarer Lautsprecher mit Akku |
| Verstärker PAM8610 oder TPA3116 | DAC-Ausgänge → Verstärkereingang; Versorgung mit 12 V | Mehr Leistung: 2 × 10 W und mehr |
| Aktivlautsprecher (AUX) | DAC_L, DAC_R und GND → AUX-Eingang des Aktivlautsprechers | Einen vorhandenen PC-Lautsprecher nutzen |
Rauschen, Störgeräusche und Knacken beseitigen
- Rauschen und Knacken beim Senden von Befehlen: Der 1-kΩ-Widerstand an der RX-Leitung fehlt. Setze ihn zwischen den TX-Pin des Arduino und den RX-Pin des Moduls.
- Dauerhaftes Rauschen oder Brummen: Die Versorgung ist verrauscht oder zu schwach. Versorge den DFPlayer aus einer separaten 5-V-Quelle, setze einen Kondensator zwischen VCC und GND und verbinde alle Massen.
- Ein "Plopp" beim Einschalten: Er kommt vom Reset-Befehl, den begin() sendet. Stört er dich, überspringe den Reset mit player.begin(dfSerial, true, false).
- Summen am ESP32: Die Stromimpulse beim WLAN-Senden gelangen in die Versorgung und von dort in den Ton. Setze einen Kondensator in die Versorgung des DFPlayer und nutze wenn möglich eine eigene Quelle.
- Kratziger, verzerrter Ton bei hoher Lautstärke: Lautsprecher oder Verstärker arbeiten am Limit. Senke die Lautstärke auf etwa 20–25, wähle einen effizienteren Lautsprecher oder wechsle zu einem externen Verstärker.
- Leichtes Rauschen ohne Wiedergabe: Das ist das Eigenrauschen des Verstärkers auf der Platine und verschwindet bei kleinen Modulen nie ganz. Wo Stille wichtig ist, erreichst du das beste Ergebnis, wenn du den DAC-Ausgang an einen guten externen Verstärker anschließt.
Der Fehler "Unable to begin" und seine Lösung
Zeigt der serielle Monitor Unable to begin: und danach die Zeilen 1.Please recheck the connection! und 2.Please insert the SD card!, ist die Prüfung von begin() im Beispiel-Sketch der Bibliothek fehlgeschlagen. begin() schickt dem Modul einen Reset-Befehl und wartet 2 Sekunden auf die Meldung "Karte bereit" (card online); kommt sie nicht, liefert die Funktion false. Die Ursache kann also die Verdrahtung, die SD-Karte, die Versorgung oder das Antwortverhalten des Moduls sein. Geh die Punkte in dieser Reihenfolge durch:
| Mögliche Ursache | Prüfung und Lösung |
|---|---|
| TX und RX nicht gekreuzt | TX des Moduls muss an D10 (SoftwareSerial RX), RX des Moduls über 1 kΩ an D11 (SoftwareSerial TX); das muss zur Reihenfolge (RX, TX) in SoftwareSerial(10, 11) passen |
| Keine gemeinsame Masse | GND des Moduls muss mit GND des Arduino verbunden sein; auch bei separater Versorgung die Massen verbinden |
| SD-Karte wird nicht gelesen | Steckt die Karte, ist sie FAT32, kleiner als 32 GB und enthält mindestens eine Audiodatei? Formatiere sie neu oder probiere eine andere Karte |
| Falscher Widerstand | An die RX-Leitung gehört 1 kΩ; große Werte wie 10 kΩ schwächen das Signal |
| Zu schwache Versorgung | An VCC sollten 4–5 V anliegen; klemme den Lautsprecher vorübergehend ab, miss die Spannung mit dem Multimeter und setze einen Kondensator |
| Falsche Baudrate | Es muss dfSerial.begin(9600) sein; nicht mit der Geschwindigkeit des seriellen Monitors (115200) verwechseln |
| D0 und D1 belegt | Beim Uno teilt sich die Hardware-Schnittstelle die Leitungen mit USB; schließe das Modul an die SoftwareSerial-Pins an |
| Klon-Chip antwortet zu spät | Füge vor begin() ein delay(1000) ein; hilft das nicht, überspringe mit begin(dfSerial, true, false) das Warten nach dem Reset |
| DFPlayerError-Code | Name in der Bibliothek | Bedeutung |
|---|---|---|
| 1 | Busy | Modul beschäftigt oder Karte nicht gefunden (Initialisierung nicht abgeschlossen) |
| 2 | Sleeping | Modul ist im Schlafmodus |
| 3 | SerialWrongStack | Fehlerhafte serielle Daten empfangen |
| 4 | CheckSumNotMatch | Die Prüfsumme des Pakets stimmt nicht |
| 5 | FileIndexOut | Die angeforderte Titelnummer liegt außerhalb des Bereichs auf der Karte |
| 6 | FileMismatch | Die angeforderte Datei wurde nicht gefunden; prüfe die Benennung |
| 7 | Advertise | Fehler bei einer Durchsage (advert), etwa advertise() ohne laufende Wiedergabe |
DFPlayer Mini mit dem ESP32: MP3s über eine Webseite steuern
Beim ESP32 brauchst du kein SoftwareSerial; jede seiner drei Hardware-UARTs lässt sich auf die Pins deiner Wahl legen. Im folgenden Sketch läuft UART2 an GPIO 16 (RX) und GPIO 17 (TX), und der DFPlayer wird über den 5V-Pin (VIN) des ESP32-Boards versorgt. Das 3,3-V-TX-Signal des ESP32 passt direkt zum Modul, den 1-kΩ-Widerstand solltest du als Schutz vor Störungen aber trotzdem einsetzen. In der Gegenrichtung gibt DFRobot einen Logikpegel von 3,3 V für das Modul an; bei manchen Klon-Platinen wurde an der TX-Leitung bei 5-V-Versorgung jedoch eine höhere Spannung gemessen. Miss vor dem Anschließen zwischen TX und GND mit dem Multimeter; liegt der Wert über 3,6 V, setze einen Spannungsteiler aus 1 kΩ und 2 kΩ dazwischen. Der Sketch verbindet sich mit deinem Heimnetz und stellt eine Seite bereit, die du am Handy öffnen kannst; ihre Schaltflächen wechseln den Titel, pausieren und regeln die Lautstärke.
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}
62Gib nach dem Hochladen die im seriellen Monitor angezeigte Adresse (zum Beispiel 192.168.1.42) im Browser deines Handys ein; Handy und ESP32 müssen im selben WLAN sein. Klappt die Verbindung nicht, hilft der Artikel ESP32 verbindet sich nicht mit dem WLAN. Auf Boards mit ESP32-WROVER-Modul sind GPIO 16 und 17 für den internen PSRAM reserviert; leg die UART dann auf andere Pins wie 26 und 27, indem du einfach die Pinnummern in der Zeile dfSerial.begin() änderst. Startet der ESP32 von selbst neu, während der Lautsprecher laut spielt, liegt es an der Versorgung; Details findest du im Artikel ESP32 Brownout.
DFPlayer Mini mit dem Raspberry Pi Pico und MicroPython (UART)
Beim Raspberry Pi Pico ist es einfach und lehrreich zugleich, das serielle Protokoll des Moduls direkt zu nutzen, statt nach einer fertigen Bibliothek zu suchen. Jeder Befehl ist ein 10-Byte-Paket: Startbyte 0x7E, Version 0xFF, Länge 0x06, Befehlscode, Rückmeldung (0 = keine Bestätigung), zwei Byte Parameter, zwei Byte Prüfsumme und Endbyte 0xEF. Die Prüfsumme ist der 16-Bit-Negativwert der Summe der sechs Bytes von der Version bis zum letzten Parameterbyte. Das Paket, das den ersten Titel im Hauptverzeichnis spielt, lautet zum Beispiel 7E FF 06 03 00 00 01 FE F7 EF. Das Modul sendet seinerseits Meldungen mit dem Code 0x3D, wenn ein Titel endet, 0x3F, wenn die Karte bereit ist, und 0x40 bei einem Fehler. Die 3,3-V-UART des Pico passt direkt zum Modul; der Hinweis zur TX-Spannung aus dem ESP32-Abschnitt gilt auch hier, denn auch die Pins des Pico sind nicht 5-V-tolerant. Versorge das Modul über den VBUS-Pin (USB 5 V) des Pico.
| Befehl | Code | Parameter |
|---|---|---|
| Nächster / vorheriger Titel | 0x01 / 0x02 | Keiner |
| n-ten Titel im Hauptverzeichnis spielen | 0x03 | 1–2999 |
| Lautstärke | 0x06 | 0–30 |
| EQ | 0x07 | 0–5 |
| Reset | 0x0C | Keiner |
| Fortsetzen / Pause | 0x0D / 0x0E | Keiner |
| Aus einem Ordner spielen | 0x0F | Oberes Byte Ordner (1–99), unteres Byte Datei (1–255) |
| Aus dem Ordner mp3 spielen | 0x12 | Dateinummer (1 für 0001.mp3) |
| Durchsage (advert) | 0x13 | Dateinummer |
| Stopp | 0x16 | Keiner |
| Titel beendet (vom Modul gesendet) | 0x3D | Nummer des beendeten Titels |
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)
69Speicherst du den Code mit Thonny als main.py auf dem Pico, arbeitet er nach jedem Einschalten wie ein MP3-Player; bist du neu bei MicroPython, wirf einen Blick in den Artikel MicroPython-Grundlagen. Der Taster an GP14 springt zum nächsten Titel, der Taster an GP15 pausiert und setzt fort; der andere Anschluss jedes Tasters geht an GND. Die Funktion events() sammelt eingehende Bytes in einem Puffer und filtert die Pakete heraus, die mit 0x7E beginnen und mit 0xEF enden. Trifft die Meldung "Titel beendet" (0x3D) ein, wechselt der Code zur nächsten Datei und beginnt nach der letzten wieder von vorn. Vergiss nicht, die Variable TRACKS an die Anzahl der Dateien in deinem Ordner /mp3 anzupassen.
Projektideen mit dem DFPlayer Mini
- Melodie-Türklingel: Eine Klingel, die beim Drücken eine zufällige Melodie spielt und nachts leiser wird.
- Begrüßungssystem: Ein PIR-Bewegungsmelder löst eine Begrüßung aus, wenn jemand kommt.
- Musikbox mit Karten: Jede RFID-Karte spielt einen anderen Ordner ab; ein Musikplayer ohne Bildschirm für Kinder.
- Sprechende Uhr: Mit einem RTC-Uhrmodul eine Uhr, die die Zeit ansagt oder jede volle Stunde meldet.
- MP3-Player mit Fernbedienung: Titel und Lautstärke per IR-Empfänger und Fernbedienung steuern.
- Halloween-Deko oder Scherzkiste: Ein HC-SR04 spielt ein gruseliges Geräusch, sobald sich jemand nähert.
- Gesprochene Alarme und Hinweise: Verständliche Sätze wie "Gas in der Küche erkannt" statt eines Pieptons bei Gas, Wasser oder einer offenen Tür.
- MP3-Player mit Display: Zeige Titelnummer und Lautstärke auf einem OLED-Display an.
Mit einer richtig benannten SD-Karte, dem 1-kΩ-Widerstand an der RX-Leitung und einer stabilen 5-V-Versorgung bringt der DFPlayer Mini in wenigen Minuten echten Klang in deine Arduino-Projekte. Läuft etwas schief, prüfe zuerst Karte und Verdrahtung und dann die Versorgung; fast alle Fehler stecken in einem dieser drei Punkte. Wenn dich die Grundlagen der seriellen Kommunikation interessieren, ist der Artikel Serielle Kommunikation mit UART ein guter nächster Schritt. In der BlueGrays-App findest du Klangprojekte wie Melodien mit dem Buzzer, ein einfaches Klavier, eine Türklingel mit Bewegungsmelder und ESP32-Melodien, jeweils mit Schaltplan und Schritt-für-Schritt-Code, und kannst ihnen danach mit dem DFPlayer Mini echten Klang geben.
Häufige Fragen
Wie groß darf die SD-Karte beim DFPlayer Mini sein?
Der DFPlayer Mini liest microSD-Karten bis 32 GB mit FAT16 oder FAT32. Karten ab 64 GB sind mit exFAT formatiert und werden vom Modul nicht erkannt. Für ein paar hundert MP3s reicht eine Karte mit 1–16 GB völlig aus.
Warum gibt mein DFPlayer Mini keinen Ton aus?
Prüfe zuerst, ob im seriellen Monitor "online" erscheint; falls nicht, liegt es an der Verdrahtung oder der SD-Karte. Startet das Modul, bleibt aber stumm, kontrolliere, ob die Lautstärke nicht auf 0 steht, der Lautsprecher an SPK_1 und SPK_2 hängt und die Dateinamen zur aufgerufenen Funktion passen. Leuchtet die LED auf der Platine, spielt das Modul tatsächlich.
Warum kommt beim DFPlayer Mini ein 1-k-Widerstand an den RX-Pin?
Der Chip des Moduls arbeitet mit 3,3 V, der TX-Pin des Arduino Uno liefert aber 5 V. Ein 1-kΩ-Widerstand in Reihe mit der RX-Leitung begrenzt den Strom in den Chip und verringert das Rauschen im Lautsprecher während der seriellen Kommunikation. Auch an 3,3-V-Boards wie ESP32 und Pico wird er als Schutz gegen Störungen empfohlen.
Funktioniert der DFPlayer Mini ohne Arduino?
Ja. Verbindest du IO_1 und IO_2 über je einen Taster mit GND, wechselt ein kurzer Druck den Titel und ein langer Druck ändert die Lautstärke. Taster, die über Widerstände an den ADKEY-Pins hängen, können außerdem bestimmte Titel abspielen. So baust du mit Batterie, Lautsprecher und ein paar Tastern einen MP3-Player oder eine Klingel ganz ohne Mikrocontroller.
Welchen Lautsprecher kann ich an den DFPlayer Mini anschließen?
An SPK_1 und SPK_2 kommt direkt ein Lautsprecher mit 4 Ω oder 8 Ω und weniger als 3 W; am ausgewogensten klingen 8-Ω-Lautsprecher mit 1–3 W. Verbinde keinen der beiden Lautsprecheranschlüsse mit GND. Für mehr Lautstärke oder Stereo schließt du DAC_L und DAC_R an einen Verstärker wie den PAM8403 an.
Warum spielt der DFPlayer Mini die Dateien in falscher Reihenfolge?
Die Funktion play(n) richtet sich nicht nach dem Dateinamen, sondern nach der Reihenfolge, in der die Dateien auf die Karte kopiert wurden. Um nach Namen abzuspielen, benenne die Dateien als /mp3/0001.mp3 und nutze playMp3Folder() oder als /01/001.mp3 und nutze playFolder(). Hast du die Karte am Mac vorbereitet, entferne auch die versteckten ._-Dateien.
Projekte, die du danach bauen kannst
Alle Projekte ansehen
Verwendung des Summers
Hast du dich mal gefragt, wie eine Türklingel oder ein Alarm seinen Ton erzeugt? Der Arduino lässt einen kleinen Summer in kurzen Abständen piepen: piep, Pause, piep, Pause. Du siehst, wie Strom zu Kl

Türkische Nationalhymne mit Summer
Drückst du den Knopf, spielt ein kleiner Summer die türkische Nationalhymne, Note für Note. Der Arduino spielt jede Note in der richtigen Höhe und Länge, trägt zwei Strophen der Hymne von Anfang bis E

Frequenzeinstellung mit Buzzer
Mit vier Knöpfen steuerst du den Ton eines Summers: Einer startet den Ton, einer macht ihn stumm, die anderen beiden machen ihn höher oder tiefer. Hältst du den Plus- oder Minusknopf gedrückt, ändert

ESP32 Melodie-Wiedergabe mit Buzzer
Spielen einer einfachen Melodie (Twinkle Twinkle Little Star) mit einem passiven Buzzer. Wir spielen die Noten mit den Funktionen tone() und noTone() wie in Arduino - die gleiche Syntax funktioniert mit ESP32 Arduino Core 3.0+. Es muss ein passiver Buzzer verwendet werden (ein aktiver Buzzer spielt keine Melodie).

Melodien abspielen mit IR-Fernbedienung und Summer
Bau eine Spieluhr, die mit den Tasten einer Fernbedienung Melodien spielt. Ein Infrarotempfänger fängt das Signal der Fernbedienung auf; eine Taste spielt über den Summer eine flotte Videospielmelodie

Einfaches Klavier mit Summer und Taste
Bau dir mit acht Tastern dein eigenes kleines Klavier. Jeder Taster ist ein Ton, von tief nach hoch: do, re, mi, fa, so, la, ti und das hohe do. Solange du drückst, erklingt der Ton aus dem Summer, be

Mehter-Marsch mit Arduino
Mit diesem Projekt können Sie die Mehter-Hymne in einer Endlosschleife abspielen, indem Sie nur einen Arduino Uno, einen Summer und Jumper-Kabel verwenden. Einfach die Verbindungen herstellen und den Code einfügen.

Türklingel und Licht mit Bewegungssensor
Kommt jemand an deine Tür, weißt du es, bevor er klingelt. Sobald der Bewegungsmelder jemanden bemerkt, leuchtet die LED und der Summer spielt einen Gong aus drei Tönen, von hoch nach tief; ist die Me
Weitere Artikel
BlueGrays-App
Diese Schaltung Schritt für Schritt auf dem Handy nachbauen
Schaltplan, Code und Teileliste auf einem Bildschirm. Über 160 Arduino-, ESP32- und Pico-Projekte zum Nachbauen.
Mit dem Handy scannen
Richte die Kamera auf den Code, dann öffnet sich der App-Store deines Handys.
oder im Store öffnen

