Soundboard Projekt (DFPlayer Mini)

Hallo!

Ich habe mich in einem anderen Topic grundlegend zu meinem Vorhaben beraten lassen und mir einen Arduino Strong sowie ein DFPlayer Mini Baord geordert. Jetzt habe ich versucht den Code nachzuvollziehen und einen Beispielcode so ergänzt dass folgende Funktionen möglich sind (Datein sind im Anhang zu finden):

9 Knöpfe zur seperaten ansteuerung einzelner Mp3 Files, nach dem Lied soll die Widergabe stoppen.
1 Poti zur Lautstärke regulierung
1 Knopf mit dem wahrlos eine Mp3 File abspielt wird die auf der SD Karte deponiert ist, nach der Wiedergabe wird die nächste zufällige Datei abgespielt. Erneutes drücken des Tasters spielt die nächste zufällige Datei ab.

Nun meine Fragen:

  • Ist die Programierung so richtig um keine zusätzlichen Widerstände für die Taster verwenden zu müssen?
  • Muss der Poti einen bestimmten Wert haben und wird das mit der Rechnung in der Funktion so funktionieren oder muss ich mir da etwas anderes einfallen lassen?
  • Habe ich richtig Verstanden dass ich die Verbindung vom Arduino zum DFPlayer auf Pin 10 und 11 definiert habe?
  • Funktioniert meine Random Funktion wie oben beschrieben und brauche ich die "next" Funktion überhaupt oder könnte ich die auch weglassen? Meine überlegung ist ob nicht durch die Random Funktion eh schon zufällig ein Track gestartet wird, so dass ich doppelt skippe??? Ich kann das ja leider noch nicht selber überprüfen :slight_smile: Außerem frage ich mich was passiert wenn ich die random Taste gedrückt habe und danach einen der 9 anderen Knöpfe? Stopt der Player dann immer noch wie gewollt nach der spezifisch gewälten Mp3? Wenn ich den code richtig interpretiert habe sollte das so sein oder?

Dann habe ich noch eine Frage zur Hardware: ich würde gerne wissen ob es Sinn macht den DFPlayer am 3,3v Anschluß des Arduino Strong zu betreiben. Dieser ist mit 150mA angegeben. Reicht das für den DF Player oder sollte ich den lieber ebenfalls an meiner 5V Spannungsquelle anklemmen?

Und zu guter letzt habe ich dieses Modul erworben:
https://www.ebay.de/i/391932138378 (in der Mono 5v Version) Ich würde es ebenfalls gerne in mein Soundboard integrieren. Nun stelle ich mir die Frage ob ich einfach beide Module parallel an dem gleichen Lautsprecher betreiben kann oder ob es da Interferenzen gibt? Ggf. werde ich auch einen 3poligen Schalter verbauen bei dem ich zwischen "Soundboard", "Aus" und "Bluetooth" umschalten kann um möglichst wenig Stromverbrauch zu haben...

Ich freue mich auf eure Antworten

DFRobotDFPlayerMini.cpp (9.56 KB)

DFRobotDFPlayerMini.h (3.68 KB)

soundboard.ino (10.8 KB)

Was ist ein "Arduino Strong "?
Grüße Uwe

Setze deine Sketche bitte in Code-Tags, Schaltfläche </> oben links im Editorfenster.
Dann können die auch auf mobilen Geräten gelesen werden.
Und dein Link funktioniert nicht.

uwefed:
Was ist ein "Arduino Strong "?

Die falsche Bezeichnung füe spezielle Nanos oder ProMinis, aber unter diesen Suchbegriffen findet man interessante Platinen.

Ich habe ihn drauf gebracht, da m. E. für sein Projekt geeignet.

berndschroed:
Und zu guter letzt habe ich dieses Modul erworben:

Habe mir die URL jetzt am PC angesehen.

Hast du geprüft, ob dieses Board auch mit Arduino kompatibel ist ?

Und NEIN, du kannst nicht einfach 2 Boards parallel am Lautsprecher betreiben.
Da sterben vermutlich beide Boards.
Und ich sehe da keinen Lautsprecher-Ausgang, auch die Beschreibung ist sehr undeutlich.

Und es ist besser, wenn du den DFPlayer an einer eigenen 5 Volt Versorgung betreibst.
Anders kann es sein, dass du Störungen durch den Controller bekommst.

HotSystems:
Und ich sehe da keinen Lautsprecher-Ausgang, auch die Beschreibung ist sehr undeutlich.

Ich sehe "Left channel" und "Right channel", könnten Line-Ausgänge sein.

Der Arduino könnte "Mute" bedienen und den Lautsprecher per Relais umschalten.

agmue:
Ich sehe "Left channel" und "Right channel", könnten Line-Ausgänge sein.

Der Arduino könnte "Mute" bedienen und den Lautsprecher per Relais umschalten.

Das mit undeutlich bezog ich auf eine fehlende Angabe der Lautsprecherimpedanz und Leistung.
Sowas sollte schon dabei sein.

Daher vermute ich, wie du, es ist nur ein Line-Ausgang.

Und per Relais umschalten ist bei Batterie bzw. Akku-Betrieb nicht so angesagt.

Hi

Gibt bistabile Relais - Das soll nicht das Problem werden - da akut wohl nur Eines davon gebraucht wird, sollte der Preis auch eher egal sein, selbst, wenn das Relais nen Euro mehr kostet.

MfG

Also irgendwie komme ich mit dem Foum und dem verlinken noch nicht so ganz zurecht.....

Der Code ist leider zu lang (9000 Zeichen), den Link im ersten Post habe ich (hoffentlich) gefixed.

Außerdem habt ihr Recht! Ich habe das falsche Modul gekauft. Ich wollte eigentlich eins mit Verstärker aber in Mono haben und dann habe ich vor lauter Produkten doch das falsche gekauft. Der DFPlayer hat ja leider auch kein Line in soweit ich das sehen konnte oder?

berndschroed:
Außerdem habt ihr Recht! Ich habe das falsche Modul gekauft. Ich wollte eigentlich eins mit Verstärker aber in Mono haben und dann habe ich vor lauter Produkten doch das falsche gekauft. Der DFPlayer hat ja leider auch kein Line in soweit ich das sehen konnte oder?

Nein, der hat kein Line in.
Da musst du dir evtl. einen zusätzlichen Verstärker zulegen.

Ich habe meinen Code mal etwas gekürzt (Knopf 3-8) weil der ja mehr oder weniger identisch ist

#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

//Tasten und Regler
const int button1 = 0; //Pin 0 wird als button1 definiert
const int button2 = 1; //Pin 1 wird als button2 definiert
.
.
.
const int button9 = 8; //Pin 8 wird als button9 definiert
const int randomButton = 9; //Pin 9 wird als randomButton definiert
const int volumePin = A0; //Der analogen Pin A1 wird als  volumePin definiert (hier ist ein Potentiometer zu Lautstärke regelung angeschlossen)

int button1State = 0; //Status des Eingangs 0.
int button2State = 0; //Status des Eingangs 1.
.
.
.
int button9State = 0; //Status des Eingangs 8.
int randomButtonState = 0; //Status des Eingangs 9.
int volume = 0; ///Status des analogen Eingangs A1.

SoftwareSerial mySoftwareSerial(10, 11); // Verbindung zum DFPlayer Mini (RX, TX)
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

void setup()
{
  mySoftwareSerial.begin(9600);
  Serial.begin(115200);

  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));

  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("DFPlayer Mini online."));

  myDFPlayer.setTimeOut(500); //Set serial communictaion time out 500ms

  //----Set volume----
  myDFPlayer.volume(16);  //Set volume value (0~30).
  myDFPlayer.volumeUp(); //Volume Up
  myDFPlayer.volumeDown(); //Volume Down

  //----Set different EQ----
  myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);
  //  myDFPlayer.EQ(DFPLAYER_EQ_POP);
  //  myDFPlayer.EQ(DFPLAYER_EQ_ROCK);
  //  myDFPlayer.EQ(DFPLAYER_EQ_JAZZ);
  //  myDFPlayer.EQ(DFPLAYER_EQ_CLASSIC);
  //  myDFPlayer.EQ(DFPLAYER_EQ_BASS);

  //----Set device we use SD as default----
  //  myDFPlayer.outputDevice(DFPLAYER_DEVICE_U_DISK);
  myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);
  //  myDFPlayer.outputDevice(DFPLAYER_DEVICE_AUX);
  //  myDFPlayer.outputDevice(DFPLAYER_DEVICE_SLEEP);
  //  myDFPlayer.outputDevice(DFPLAYER_DEVICE_FLASH);

  //----Mp3 control----
  //  myDFPlayer.sleep();     //sleep
  //  myDFPlayer.reset();     //Reset the module
  //  myDFPlayer.enableDAC();  //Enable On-chip DAC
  //  myDFPlayer.disableDAC();  //Disable On-chip DAC
  //  myDFPlayer.outputSetting(true, 15); //output setting, enable the output and set the gain to 15

  //----Mp3 play----
  myDFPlayer.next();  //Play next mp3
  delay(1000);
  myDFPlayer.previous();  //Play previous mp3
  delay(1000);
  myDFPlayer.play(1);  //Play the first mp3
  delay(1000);
  myDFPlayer.loop(1);  //Loop the first mp3
  delay(1000);
  myDFPlayer.pause();  //pause the mp3
  delay(1000);
  myDFPlayer.start();  //start the mp3 from the pause
  delay(1000);
  myDFPlayer.playFolder(15, 4);  //play specific mp3 in SD:/15/004.mp3; Folder Name(1~99); File Name(1~255)
  delay(1000);
  myDFPlayer.enableLoopAll(); //loop all mp3 files.
  delay(1000);
  myDFPlayer.disableLoopAll(); //stop loop all mp3 files.
  delay(1000);
  myDFPlayer.playMp3Folder(4); //play specific mp3 in SD:/MP3/0004.mp3; File Name(0~65535)
  delay(1000);
  myDFPlayer.advertise(3); //advertise specific mp3 in SD:/ADVERT/0003.mp3; File Name(0~65535)
  delay(1000);
  myDFPlayer.stopAdvertise(); //stop advertise
  delay(1000);
  myDFPlayer.playLargeFolder(2, 999); //play specific mp3 in SD:/02/004.mp3; Folder Name(1~10); File Name(1~1000)
  delay(1000);
  myDFPlayer.loopFolder(5); //loop all mp3 files in folder SD:/05.
  delay(1000);
  myDFPlayer.randomAll(); //Random play all the mp3.
  delay(1000);
  myDFPlayer.enableLoop(); //enable loop.
  delay(1000);
  myDFPlayer.disableLoop(); //disable loop.
  delay(1000);

  //----Read imformation----
  Serial.println(myDFPlayer.readState()); //read mp3 state
  Serial.println(myDFPlayer.readVolume()); //read current volume
  Serial.println(myDFPlayer.readEQ()); //read EQ setting
  Serial.println(myDFPlayer.readFileCounts()); //read all file counts in SD card
  Serial.println(myDFPlayer.readCurrentFileNumber()); //read current play file number
  Serial.println(myDFPlayer.readFileCountsInFolder(3)); //read fill counts in folder SD:/03

  pinMode(button1, INPUT);         // Der Pin0 wird als Eingang initialisiert.
  digitalWrite(button1, HIGH);     // aktiviert den Pull- Up- Widerstand für button1
  pinMode(button2, INPUT);         // Der Pin1 wird als Eingang initialisiert.
  digitalWrite(button2, HIGH);     // aktiviert den Pull- Up- Widerstand für button2
.
.
.
  digitalWrite(button9, HIGH);     // aktiviert den Pull- Up- Widerstand für button9
  pinMode(randomButton, INPUT);    // Der Pin9 wird als Eingang initialisiert.
  digitalWrite(randomButton, HIGH); // aktiviert den Pull- Up- Widerstand für randomButton
}

void loop()
{
  button1State = digitalRead(button1);
  if (button1State == LOW) {
    myDFPlayer.playFolder(1, 1);    //Spielt Datei SD:/buttons/001.mp3 beim drücken von Taster 1
  }
  button2State = digitalRead(button2);
  if (button2State == LOW) {
    myDFPlayer.playFolder(1, 2);    //Spielt Datei SD:/buttons/002.mp3 beim drücken von Taster 1
  }
.
.
.
  if (button8State == LOW) {
    myDFPlayer.playFolder(1, 8);    //Spielt Datei SD:/buttons/008.mp3 beim drücken von Taster 1
  }
  button9State = digitalRead(button9);
  if (button9State == LOW) {
    myDFPlayer.playFolder(1, 9);    //Spielt Datei SD:/buttons/008.mp3 beim drücken von Taster 1
  }
  randomButtonState = digitalRead(randomButton);
  if (randomButtonState == LOW) {
    myDFPlayer.randomAll();           //spiele alle Mp3s zufällig ab.
    myDFPlayer.next();                //nächste mp3 abspielen
  }
  if (myDFPlayer.available()) {
    printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states.
  }
  volume = analogRead(volumePin);    // Widersrtand des Potentiometers auslesen
  myDFPlayer.volume(volume / 1023 * 30); //Wiederstand für den Wertebereich des DFPlayer (1-30) umrechnen und übergeben
}

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;
  }
}