这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【换取手持数字示波器】+DFPlayerMini模块推喇叭示例分享

共2条 1/1 1 跳转至

【换取手持数字示波器】+DFPlayerMini模块推喇叭示例分享

工程师
2024-04-09 19:34:37   被打赏 50 分(兑奖)     打赏

DFPlayer Mini是一款小巧且价格低廉的MP3模块,其特点如下:

  1. 功能与集成:

  • 该模块可以直接接驳扬声器,通过简单的串口指令即可完成播放指定的音乐,无需繁琐的底层操作,使用方便且稳定可靠。

  • 模块本身集成了MP3、WAV、WMA的硬解码,支持动态范围达90dB的24位DAC输出,以及信噪比支持为85dB,从而确保高质量的音频输出。

  1. 存储与文件系统:

  • DFPlayer Mini模块支持FAT16和FAT32文件系统,最大可以支持32G的TF卡,以及32G的U盘和64M字节的NORFLASH,为用户提供了充足的存储空间。

  • 它可以播放来自SD卡或U盘上的音频文件,支持多种音频格式,满足用户多样化的音频需求。

  1. 控制与操作:

  • DFPlayer Mini提供了多种控制模式,包括IO控制模式、串口模式以及AD按键控制模式,使得用户可以根据自己的需求选择合适的控制方式。

  • 此外,它还具有广播语插播功能,可以在播放背景音乐的同时插入广告或其他语音信息,并且广告播放完毕后能自动回到背景音乐继续播放。

  • 音频数据还可以按文件夹排序,最多支持100个文件夹,每个文件夹可以分配255首曲目,为用户提供了极大的灵活性。

  • 音量和EQ(均衡器)也可以进行多级调节,其中音量支持30级可调,EQ支持6级可调,使得用户可以根据自己的喜好和环境调整音频效果。

再上个官方照片,真漂亮:

image.png

以上是外观实物图。

引脚定义:

image.pngimage.png

接线示意图:

image.png

实际我的接线图:

我的配件与杜绑连接:
看到我用电阻搭的桥,我就想笑,飞的太有意思了,与官方的照片一对比,我拍的照片感觉就太弱了。

image.png


代码:

// 引入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的喇叭也是蛮爽的,电流声都要贴到耳朵上去听才听的到,总的来说非常的值,官方给的示例也是非常的详细,里面的介绍也讲的细致。




高工
2024-04-09 20:10:56     打赏
2楼

感谢分享


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]