.
此篇為自己製作簡易的 藍芽 MP3 撥放器
需要材料如下
1. DFPlayer Mini : 用來對MP3檔案進行解碼並將訊號傳送至喇叭撥放
2. Arduino NANO: 用來對DFPlayer Mini進行通訊的 MCU
也可使用 UNO 或 MEGA 等 都可以
3. 喇叭 : 用來撥放音頻訊號
4. Micro SD(1GB or 2GB): 儲存 MP3檔案
5. 藍芽模組 HC05 / HC06 : 進行指令接收,將收到指令給MCU做動作
DFPlayer Mini 簡介
· DFPlayer Mini是一款小巧且價格低廉的MP3模組,可以直接接駁揚聲器。
· 模組配合供電電池、揚聲器、按鍵可以單獨使用,也可以通過串口控制,作為Arduino UNO或者是任何有串口的單片機的一個模組。
· 模組本身完美的集成了MP3、WAV、WMA的硬解碼。
· 同時軟體支援SD卡驅動,支援FAT16、FAT32檔案系統。
· 通過簡單的串口指令即可完成播放指定的音樂,以及如何播放音樂等功能,無需繁瑣的底層操作,使用方便,穩定可靠。
產品參數
· 支持取樣速率(KHz):8/11.025/12/16/22.05/24/32/44.1/48
· 24位元DAC輸出,動態範圍支援:90dB,信噪比支持:85dB
· 完全支持FAT16、FAT32檔案系統,最大支持32G的SD卡,支持32G的U盤、64M位元組
的 NORFLASH
· 多種控制模式可選。IO控制模式、串口模式、AD按鍵控制模式
· 廣播語插播功能,可以暫停正在播放的背景音樂。廣告播放完畢回到背景音繼續播放
· 音訊資料按資料夾排序,最多支援100個資料夾,每隔資料夾可以分配255首曲目
· 30級音量可調,6級EQ可調
接線示意圖
以下程式主要功能
使用藍芽接收撥放指令,將儲存在SD卡的MP3由 DFPlayer Mini 給喇叭撥放
注意 MP3 命名只能為數字 1 2 3 副檔名為 .mp3 例如: 1.mp3
MP3放置路徑為 SD\MP3\ SD卡的 MP3資料夾裡面
或是依照程式指定不同路徑
-
- #include "Arduino.h"
- #include "SoftwareSerial.h" // 採用SoftwareSerial程式庫
- #include "DFRobotDFPlayerMini.h" // 採用DFRobotDFPlayerMini程式庫
-
- SoftwareSerial mySoftwareSerial(2, 3);
- //mySoftwareSerial(RX, TX),宣告軟體序列傳輸埠
-
- SoftwareSerial BT(10, 11);
- // mySoftwareSerial(RX, TX), 宣告軟體序列傳輸埠
-
- DFRobotDFPlayerMini myDFPlayer; //宣告MP3 Player
- void printDetail(uint8_t type, int value); //印出詳情
-
- // the setup function runs once when you press reset or power the board
- void setup()
- {
- Serial.begin(9600); // 定義Serial Baud
- mySoftwareSerial.begin(9600); // 定義mySoftwareSerial baud
-
- Serial.println(F("DFRobot DFPlayer Mini Demo"));
- Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
- bool is_init_success = myDFPlayer.begin(mySoftwareSerial);
- BT.begin(9600);
- if (is_init_success == false) // 如果DFPlayer Mini回應不正確.
- { //Use softwareSerial to communicate with mp3.
- BT.println(F("Unable to begin:"));
- BT.println(F("1.Please recheck the connection!"));
- BT.println(F("2.Please insert the SD card!"));
- while (true);
- }
-
- BT.println(F("DFPlayer Mini online."));
- // 如果DFPlayer Mini回應正確.印出"DFPlayer Mini online."
-
- myDFPlayer.setTimeOut(500); // 設定通訊逾時為500ms
-
- //----Set volume----
- myDFPlayer.volume(20); // 設定音量, 範圍0~30.
-
- //----Set different EQ---- // 設定EQ(等化器 Equalizer)
- myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);
-
- //----Set device we use SD as default---- // 設定SD卡
- myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);
-
- //----Mp3 control---- // 設定MP3參數
- // myDFPlayer.sleep(); //sleep
- // myDFPlayer.reset(); //Reset the module
- myDFPlayer.enableDAC(); //Enable On-chip DAC
- }
-
- // the loop function runs over and over again until power down or reset
- char val;
- String recieveData = "";
- void loop()
- {
- if (myDFPlayer.available()) // 監視MP3有沒有回應
- { // 有的話印出詳情
- printDetail(myDFPlayer.readType(), myDFPlayer.read());
- //Print the detail message from DFPlayer to handle different errors and states.
- }
-
- while(BT.available())
- {
- val=BT.read(); //每次接收一個字元
-
- if(val == '\n')
- {
- Serial.println(recieveData);
- if(recieveData == "add\r")
- {
- myDFPlayer.volumeUp(); // 增加音量
- BT.println("volumeUp"); // clear buffer
- BT.read(); // clear buffer
- recieveData = "";
- }
- else if(recieveData == "sub\r")
- {
- myDFPlayer.volumeDown(); // 降低音量
- BT.println("volumeDown"); // clear buffer
- BT.read(); // clear buffer
- recieveData = "";
- }
- else if(recieveData == "POP\r")
- {
- myDFPlayer.EQ(DFPLAYER_EQ_POP);
- BT.println("POP MODE"); // clear buffer
- BT.read(); // clear buffer
- recieveData = "";
- }
- else if(recieveData == "ROCK\r")
- {
- myDFPlayer.EQ(DFPLAYER_EQ_ROCK);
- BT.println("ROCK MODE"); // clear buffer
- BT.read(); // clear buffer
- recieveData = "";
- }
- else if(recieveData == "JAZZ\r")
- {
- myDFPlayer.EQ(DFPLAYER_EQ_JAZZ);
- BT.println("JAZZ MODE"); // clear buffer
- BT.read(); // clear buffer
- recieveData = "";
- }
- else if(recieveData == "CLASSIC\r")
- {
- myDFPlayer.EQ(DFPLAYER_EQ_CLASSIC);
- BT.println("CLASSIC MODE"); // clear buffer
- BT.read(); // clear buffer
- recieveData = "";
- }
- else if(recieveData == "BASS\r")
- {
- myDFPlayer.EQ(DFPLAYER_EQ_BASS);
- BT.println("BASS MODE"); // clear buffer
- BT.read(); // clear buffer
- recieveData = "";
- }
- else if(recieveData == "Stop\r")
- {
- myDFPlayer.pause();
- BT.println("Stop"); // clear buffer
- BT.read(); // clear buffer
- recieveData = "";
- }
- else if(recieveData == "Start\r")
- {
- myDFPlayer.start();
- BT.println("Start"); // clear buffer
- BT.read(); // clear buffer
- recieveData = "";
- }
- else if(recieveData == "loopon\r")
- {
- myDFPlayer.enableLoop();
- BT.println("loop on"); // clear buffer
- BT.read(); // clear buffer
- recieveData = "";
- }
- else if(recieveData == "loopoff\r")
- {
- myDFPlayer.disableLoop(); //disable loop.
- BT.println("loop off"); // clear buffer
- BT.read(); // clear buffer
- recieveData = "";
- }
- else if(recieveData == "random\r")
- {
- myDFPlayer.randomAll(); //Random play all the mp3.
- BT.println("Random Mode"); // clear buffer
- BT.read(); // clear buffer
- recieveData = "";
- }
- else
- {
- int index = 1;
- for(int i = 1 ; i <= 255 ; i++)
- {
- if(i == recieveData.toInt())
- {
- myDFPlayer.play(index);
- BT.println(index); // clear buffer
- while(BT.available())
- {
- BT.read(); // clear buffer
- }
- recieveData = "";
- break;
- }
- index++;
- }
- recieveData = "";
- }
- break;
- }
- else
- {
- recieveData += val; //字元組成字串
- }
- delay(1);
- }
-
-
- }
-
-
- 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 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;
- }
- }
藍芽傳送指令及撥放運行畫面與實際執行演示
先進行音量 跟模式調整後(等化器) 撥放 Eclipse.mp3
撥放曲目2 Parallel World
相關 Arduino 創作