DFPlayer Mini是一款小巧且价格低廉的MP3模块,其特点如下:
功能与集成:
该模块可以直接接驳扬声器,通过简单的串口指令即可完成播放指定的音乐,无需繁琐的底层操作,使用方便且稳定可靠。
模块本身集成了MP3、WAV、WMA的硬解码,支持动态范围达90dB的24位DAC输出,以及信噪比支持为85dB,从而确保高质量的音频输出。
存储与文件系统:
DFPlayer Mini模块支持FAT16和FAT32文件系统,最大可以支持32G的TF卡,以及32G的U盘和64M字节的NORFLASH,为用户提供了充足的存储空间。
它可以播放来自SD卡或U盘上的音频文件,支持多种音频格式,满足用户多样化的音频需求。
控制与操作:
DFPlayer Mini提供了多种控制模式,包括IO控制模式、串口模式以及AD按键控制模式,使得用户可以根据自己的需求选择合适的控制方式。
此外,它还具有广播语插播功能,可以在播放背景音乐的同时插入广告或其他语音信息,并且广告播放完毕后能自动回到背景音乐继续播放。
音频数据还可以按文件夹排序,最多支持100个文件夹,每个文件夹可以分配255首曲目,为用户提供了极大的灵活性。
音量和EQ(均衡器)也可以进行多级调节,其中音量支持30级可调,EQ支持6级可调,使得用户可以根据自己的喜好和环境调整音频效果。
再上个官方照片,真漂亮:
以上是外观实物图。
引脚定义:
接线示意图:
实际我的接线图:
我的配件与杜绑连接:
看到我用电阻搭的桥,我就想笑,飞的太有意思了,与官方的照片一对比,我拍的照片感觉就太弱了。
代码:
// 引入Arduino核心库 #include "Arduino.h" // 引入DFPlayer Mini的库 #include "DFRobotDFPlayerMini.h" // 如果定义了ARDUINO_AVR_UNO(Arduino Uno)或ESP8266,则使用软件串行通信 #if (defined(ARDUINO_AVR_UNO) || defined(ESP8266)) #include <SoftwareSerial.h> // 引入软件串行库 SoftwareSerial softSerial(/*rx =*/4, /*tx =*/5); // 初始化软件串行端口,接收引脚为4,发送引脚为5 #define FPSerial softSerial // 定义一个宏FPSerial代表softSerial,用于代码中的串行通信 #else #define FPSerial Serial1 // 对于其他Arduino板,使用硬件串行端口Serial1 #endif // 创建一个DFPlayer Mini对象 DFRobotDFPlayerMini myDFPlayer; // 声明一个打印DFPlayer状态的函数(具体实现在代码中没有给出) void printDetail(uint8_t type, int value); // setup()函数,Arduino程序启动时运行一次 void setup() { #if (defined ESP32) // 如果定义了ESP32 FPSerial.begin(9600, SERIAL_8N1, /*rx =*/D3, /*tx =*/D2); // 初始化串行通信,波特率为9600,数据位8,无奇偶校验,1个停止位,接收引脚为D3,发送引脚为D2 #else FPSerial.begin(9600); // 对于其他Arduino板,初始化串行通信,波特率为9600 #endif // 初始化硬件串行端口,波特率为115200,用于调试输出 Serial.begin(115200); // 输出调试信息到硬件串行端口 Serial.println(); Serial.println(F("DFRobot DFPlayer Mini Demo")); Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)")); // 尝试使用串行端口与DFPlayer Mini建立通信,并检查是否成功 if (!myDFPlayer.begin(FPSerial, /*isACK = */true, /*doReset = */true)) { // 如果通信失败,则输出错误信息 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){ delay(0); // 兼容ESP8266的看门狗 } } // 如果通信成功,则输出DFPlayer Mini已在线的信息 Serial.println(F("DFPlayer Mini online.")); // 设置音量值为10,音量值的范围是0到30 myDFPlayer.volume(10); // 播放列表中的第一首MP3文件(索引为1) myDFPlayer.play(1); } // loop()函数,Arduino程序的主循环,会不断重复执行 void loop() { // 定义一个静态变量timer,用于记录上一次播放下一首MP3的时间 static unsigned long timer = millis(); // 如果当前时间与上一次播放下一首MP3的时间之差大于3000毫秒(即3秒) if (millis() - timer > 3000) { // 更新timer为当前时间 timer = millis(); // 播放下一首MP3 myDFPlayer.next(); } // 如果DFPlayer Mini有可用的状态或错误信息 if (myDFPlayer.available()) { // 打印DFPlayer Mini的状态或错误信息 printDetail(myDFPlayer.readType(), myDFPlayer.read()); } } void printDetail(uint8_t type, int value){ // 根据DFPlayer返回的类型来打印不同的信息 switch (type) { // 如果超时 case TimeOut: Serial.println(F("Time Out!")); // 打印"Time Out!" break; // 如果堆栈错误 case WrongStack: Serial.println(F("Stack Wrong!")); // 打印"Stack Wrong!" break; // 如果SD卡已插入 case DFPlayerCardInserted: Serial.println(F("Card Inserted!")); // 打印"Card Inserted!" break; // 如果SD卡已移除 case DFPlayerCardRemoved: Serial.println(F("Card Removed!")); // 打印"Card Removed!" break; // 如果SD卡在线 case DFPlayerCardOnline: Serial.println(F("Card Online!")); // 打印"Card Online!" break; // 如果USB已插入 case DFPlayerUSBInserted: Serial.println("USB Inserted!"); // 打印"USB Inserted!" break; // 如果USB已移除 case DFPlayerUSBRemoved: Serial.println("USB Removed!"); // 打印"USB Removed!" break; // 如果某首MP3播放完毕 case DFPlayerPlayFinished: Serial.print(F("Number:")); // 打印"Number:" Serial.print(value); // 打印播放完毕的MP3的编号 Serial.println(F(" Play Finished!")); // 打印" Play Finished!" break; // 如果DFPlayer发生错误 case DFPlayerError: Serial.print(F("DFPlayerError:")); // 打印"DFPlayerError:" // 根据具体的错误值来打印错误信息 switch (value) { // 如果忙,即SD卡未找到 case Busy: Serial.println(F("Card not found")); // 打印"Card not found" break; // 如果DFPlayer处于睡眠状态 case Sleeping: Serial.println(F("Sleeping")); // 打印"Sleeping" break; // 如果接收到的数据堆栈错误 case SerialWrongStack: Serial.println(F("Get Wrong Stack")); // 打印"Get Wrong Stack" break; // 如果校验和不匹配 case CheckSumNotMatch: Serial.println(F("Check Sum Not Match")); // 打印"Check Sum Not Match" break; // 如果文件索引超出范围 case FileIndexOut: Serial.println(F("File Index Out of Bound")); // 打印"File Index Out of Bound" break; // 如果找不到文件 case FileMismatch: Serial.println(F("Cannot Find File")); // 打印"Cannot Find File" break; // 如果处于广告模式 case Advertise: Serial.println(F("In Advertise")); // 打印"In Advertise" break; // 其他错误情况 default: break; } break; // 其他未定义的类型 default: break; } }
总结:这个模块不要看他小,推起这个4R3W的喇叭也是蛮爽的,电流声都要贴到耳朵上去听才听的到,总的来说非常的值,官方给的示例也是非常的详细,里面的介绍也讲的细致。