以下是基于ESP32和DFPlayer Mini的蓝牙音乐播放器代码示例,ESP32通过蓝牙接收命令,控制DFPlayer Mini播放音频文件,并控制音量。

#include <SoftwareSerial.h>
#include <DFRobotDFPlayerMini.h>
#include <BluetoothSerial.h>

// 蓝牙模块
BluetoothSerial SerialBT;

// DFPlayer Mini 控制引脚
#define DFPLAYER_RX  16
#define DFPLAYER_TX  17
SoftwareSerial mySoftwareSerial(DFPLAYER_RX, DFPLAYER_TX);
DFRobotDFPlayerMini myDFPlayer;

// 控制按钮
#define PLAY_BUTTON_PIN  12
#define PAUSE_BUTTON_PIN 14
#define VOL_UP_PIN        13
#define VOL_DOWN_PIN      15

void setup() {
  // 初始化串口
  Serial.begin(115200);
  SerialBT.begin("ESP32_Bluetooth");  // 初始化蓝牙串口
  
  // 初始化DFPlayer Mini
  mySoftwareSerial.begin(9600);
  if (!myDFPlayer.begin(mySoftwareSerial)) {
    Serial.println("DFPlayer Mini not detected!");
    while (true);
  }
  Serial.println("DFPlayer Mini online.");

  // 初始化控制按钮
  pinMode(PLAY_BUTTON_PIN, INPUT_PULLUP);
  pinMode(PAUSE_BUTTON_PIN, INPUT_PULLUP);
  pinMode(VOL_UP_PIN, INPUT_PULLUP);
  pinMode(VOL_DOWN_PIN, INPUT_PULLUP);

  // 播放器初始化设置
  myDFPlayer.volume(15);  // 设置音量(0-30)
  myDFPlayer.play(1);     // 播放第一首歌
}

void loop() {
  // 监听蓝牙指令
  if (SerialBT.available()) {
    String btData = SerialBT.readString();
    Serial.println("Received: " + btData);

    // 根据蓝牙指令执行控制
    if (btData == "PLAY") {
      myDFPlayer.play();
    }
    if (btData == "PAUSE") {
      myDFPlayer.pause();
    }
    if (btData == "NEXT") {
      myDFPlayer.next();
    }
    if (btData == "PREV") {
      myDFPlayer.previous();
    }
    if (btData == "VOL_UP") {
      int volume = myDFPlayer.readVolume();
      if (volume < 30) {
        myDFPlayer.volume(volume + 1);
      }
    }
    if (btData == "VOL_DOWN") {
      int volume = myDFPlayer.readVolume();
      if (volume > 0) {
        myDFPlayer.volume(volume - 1);
      }
    }
  }

  // 检测按钮控制
  if (digitalRead(PLAY_BUTTON_PIN) == LOW) {
    myDFPlayer.play();
    delay(500);  // 防止抖动
  }
  
  if (digitalRead(PAUSE_BUTTON_PIN) == LOW) {
    myDFPlayer.pause();
    delay(500);  // 防止抖动
  }
  
  if (digitalRead(VOL_UP_PIN) == LOW) {
    int volume = myDFPlayer.readVolume();
    if (volume < 30) {
      myDFPlayer.volume(volume + 1);
    }
    delay(500);  // 防止抖动
  }

  if (digitalRead(VOL_DOWN_PIN) == LOW) {
    int volume = myDFPlayer.readVolume();
    if (volume > 0) {
      myDFPlayer.volume(volume - 1);
    }
    delay(500);  // 防止抖动
  }
}

代码解释

  • 蓝牙控制:ESP32通过BluetoothSerial库接收蓝牙指令,控制音乐播放、暂停、音量调节等。
  • DFPlayer Mini控制:通过SoftwareSerial与DFPlayer Mini进行通信,控制播放、暂停、音量、歌曲切换等。
  • 按钮控制:通过接入按钮来控制播放、暂停、音量增减等功能。
  • 蓝牙数据解析:接收到蓝牙指令后,根据指令执行相应的操作,例如播放、暂停、切歌、调节音量等。