想讓你的 Arduino 專案發出聲音嗎?無論是 語音報時、機器人對話、智慧門警警報器,還是 自製音樂播放器,DFPlayer Mini 都是性價比最高、使用最廣泛的 MP3 音頻模組。
雖然 DFPlayer Mini 功能強大且價格親民,但許多新手在初次使用時常因為 「SD 卡檔案命名不對」 或 「Serial 連線未加降壓電阻」 而導致無法播音。本篇文章將手把手帶你掌握正確的硬體接線、SD 卡目錄設置與完整的 Arduino 程式碼!
什麼是 DFPlayer Mini MP3 模組?
DFPlayer Mini 是一款小巧且功能強大的 MP3 播放模組,具備以下核心特色:
硬體解碼: 支援 MP3 與 WAV 音頻硬體解碼。
高相容性: 支援 FAT16 與 FAT32 檔案系統,最高可支援 32GB Micro SD(TF)卡。
內建功放(Amplifier): 內建 單聲道功放,可以直接連接 或 的小喇叭單體,無需額外擴音電路。
多管道控制: 支援 UART 序列埠指令控制(適用 Arduino / ESP32)以及 AD 鍵盤獨立控制(無需 MCU 即可播放)。
音質調整: 支援 30 階音量調節與 10 階 EQ 音效調整。
關鍵踩坑點:Micro SD 卡格式化與檔案命名規範
DFPlayer Mini 對 Micro SD 卡的 檔案夾與檔名架構 要求非常嚴格,若未依規範設置將無法順利播放!
1. SD 卡格式化
請使用電腦將 Micro SD 卡格式化為 FAT32 格式(請勿使用 NTFS 或 exFAT)。
2. 資料夾與 MP3 檔名命名規則(重要!)
在 Micro SD 卡的 根目錄下 建立名為
mp3的資料夾。將 MP3 音頻檔案放入
mp3資料夾內。檔名必須開頭為 4 位數字(例如:
0001.mp3、0002.mp3、0003.mp3)。
實驗所需硬體材料
進行本實作前,請先準備以下電子零件(點擊連結可直接前往商城選購):
Arduino Uno R3 開發板 x 1
DFPlayer Mini MP3 播放模組 x 1
Micro SD 卡(32GB 以下,已格式化為 FAT32)x 1
小喇叭單體 x 1
色碼電阻 x 1(強烈建議:用於 TX/RX 通訊降噪保護)
麵包板與杜邦跳線若干
🛍️ 準備好你的硬體工具了嗎?
推薦選購:點擊連結可直接前往商城選購
▼購買Arduino MP3音樂播放套件:
Mini MP3 Player模組接腳說明:
序列串列埠 – 通訊格式:
透過串列埠傳送給mini mp3 player 模組的指令,必須將baud rate通訊速度設定在9600,通訊格式會有9個參數,總共有10個字節(checksum佔兩個字節),可參考以程式 execute_CMD()這段函式的內容,透過陣列方式,經由串列埠傳送10個字節給mini mp3 player 模組。
通訊指令CMD說明:
Arduino IDE 程式庫安裝
請先將下列函式庫下載,然後再匯入安裝。
MP3_Player函式庫 : 載點
安裝方式:在 Arduino 整合環境功能表點選 草稿碼 / 匯入程式庫 / 加入.ZIP程式庫…
完整 Arduino 程式碼範例
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);
# define ACTIVATED LOW
int buttonPause = 3;
int buttonPrevious = 4;
int buttonNext = 5;
int buttonVolume = A0;
boolean isPlaying = false;
void setup () {
Serial.begin(115200);
mySoftwareSerial.begin(9600);
delay(300);
pinMode(buttonPause, INPUT);
digitalWrite(buttonPause,HIGH);
pinMode(buttonNext, INPUT);
digitalWrite(buttonNext,HIGH);
pinMode(buttonPrevious, INPUT);
digitalWrite(buttonPrevious,HIGH);
Serial.println("Entry...");
Serial.println();
Serial.println(F("Initializing Player "));
if (!myDFPlayer.begin(mySoftwareSerial)) { //Use softwareSerial to communicate with mp3.
Serial.println(F("Unable to begin:"));
Serial.println(F("1.Please recheck the connection!"));
Serial.println(F("2.Please insert the SD card!"));
while(true);
}
Serial.println(F("MP3 Player online."));
myDFPlayer.setTimeOut(500); //Set serial communictaion time out 500ms
myDFPlayer.setTimeOut(500); //Set serial communictaion time out 500ms
myDFPlayer.volume(10); //Set volume value (0~30).
myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);
myDFPlayer.start();
myDFPlayer.enableLoopAll();
}
void loop () {
if (digitalRead(buttonPause) == ACTIVATED) //暫停播放按鍵
{
if(isPlaying)
{
myDFPlayer.pause();
isPlaying = false;
}else
{
isPlaying = true;
myDFPlayer.start();
}
}
if (digitalRead(buttonNext) == ACTIVATED) //切換下一首按鍵
{
if(isPlaying)
{
myDFPlayer.next();
}
}
if (digitalRead(buttonPrevious) == ACTIVATED) //切換前一首按鍵
{
if(isPlaying)
{
myDFPlayer.previous();
}
}
int Volume = analogRead(buttonVolume) / 34.1;
myDFPlayer.volume(Volume); //設定指定音量. From 0 to 30
if (myDFPlayer.available()) {
printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states.
}
delay(300);
}
void printDetail(uint8_t type, int value){
switch (type) {
case TimeOut:
Serial.println(F("Time Out!"));
break;
case WrongStack:
Serial.println(F("Stack Wrong!"));
break;
case DFPlayerCardInserted:
Serial.println(F("Card Inserted!"));
break;
case DFPlayerCardRemoved:
Serial.println(F("Card Removed!"));
break;
case DFPlayerCardOnline:
Serial.println(F("Card Online!"));
break;
case DFPlayerUSBInserted:
Serial.println("USB Inserted!");
break;
case DFPlayerUSBRemoved:
Serial.println("USB Removed!");
break;
case DFPlayerPlayFinished:
Serial.print(F("Number:"));
Serial.print(value);
Serial.println(F(" Play Finished!"));
break;
case DFPlayerError:
Serial.print(F("DFPlayerError:"));
switch (value) {
case Busy:
Serial.println(F("Card not found"));
break;
case Sleeping:
Serial.println(F("Sleeping"));
break;
case SerialWrongStack:
Serial.println(F("Get Wrong Stack"));
break;
case CheckSumNotMatch:
Serial.println(F("Check Sum Not Match"));
break;
case FileIndexOut:
Serial.println(F("File Index Out of Bound"));
break;
case FileMismatch:
Serial.println(F("Cannot Find File"));
break;
case Advertise:
Serial.println(F("In Advertise"));
break;
default:
break;
}
break;
default:
break;
}
}
常見問題與除錯指南
注意-1:音樂檔案長度小於1秒以下是無法播放。
注意-2:所有音樂檔案一定要放在SD卡的根目錄「mp3」 資料夾裏。
注意-3:音樂檔案名稱一定要使用4 個字以上,名稱應該命名一個四位數字開始,如
- 0001.mp3
- 0002_Adele – Oh My God.mp3
- 0003.mp3
- 0004Greys Anatomy Soundtrack.mp3
注意-4:Arduino控制Mini MP3 Player模組時,喇叭若有雜音出現,則需要在Arduino TX與MP3模組的RX之間連一個1k電阻。因為MP3模塊工作電壓應該是3.3V,而主控板傳入電壓為5V,因此需要1K左右電阻分壓。
注意-5:如果您使用 Mac OS 電腦複製 mp3檔案,系統將自動添加隱藏文件,例如:“._0001.mp3”作為索引,此檔案將會被視為有效檔案被運作。 因此,您可以在終端中運行以下命令來消除這些文件。 進入
SD卡目錄
- cd /Volumes/<SD卡 名稱>
列出目錄底下的目錄與檔案
- ls -al
刪除「._0001.mp3 」檔案目錄
- rm -rf ._0001.mp3
參考資料:
延伸學習與推薦教學




