Projekt DFMp3player Mini

Hallo, ich möchte für meine Sohn eine Spiel bauen. Ich möchte mit Tastern unterschiedliche MP3`s abspielen. Klappt auch alles soweit ganz gut. Jetzt habe ich das Problem, das ein Taster lange Zeit gedrückt wird (Digitaler Eingang=High). Das Lied fängt nach ca. 1 Sekunde immer wieder neu an zu spielen, bis der Taster los gelassen wird. Lasse ich den Taster los, dann spielt der Titel ganz normal bis zum Ende, oder ein anderer Taster wird gedrückt und ein anderer Titel fängt an zu spielen.

Ich habe nur basis Kenntnisse

Sketch und Bilder folgen Morgen

Grüße Patrick

Ich tippe auf Fehler im Sketch.
Du musst nicht auf HIGH abfragen sondern die Flanke auswerten.

Das ist kein Problem.
Merke Dir einfach, das die Taste gedrückt ist:

const byte taste = 5;    // erklärt sich selbst
bool lastTaste = HIGH;   // Merker, ob Taste bereits gerückt ist

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  pinMode(taste, INPUT_PULLUP);
}

void loop()
{
  if (digitalRead(taste) == LOW)
  {
    if (lastTaste == HIGH)
    {
      // Hier merken, das Titel gespielt werden soll
      lastTaste = LOW;
      Serial.println(F("Taste gedrückt - Sperre gesetzt"));
    }
  }
  else
  {
    lastTaste = HIGH;
    Serial.println(F("Taste losgelassen - Sperre gelöscht"));
  }
}

Hallo, vielen dank. Ich bin echt überrascht wie schnell ihr geantwortet habt.

Hier mein Sketch, ihr habt recht da fehlt sicher einiges :-(. Ist jemand so freundlich und würde mir für mein Aufbau ein Beispiel zur Verfügung stellen. Meine Stärke liegt eher in der Mechanik.

#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
//---------------------------------------------------
SoftwareSerial mysoftwareSerial(10, 11);
DFRobotDFPlayerMini myDFPlayer;
//===========================================================
void setup()
{
pinMode(2,INPUT); pinMode(3,INPUT); pinMode(4,INPUT);
pinMode(5,INPUT); pinMode(6,INPUT); pinMode(7,INPUT);
pinMode(8,INPUT); pinMode(9,INPUT);
pinMode(12,INPUT); pinMode(12,INPUT);
//---------------------------------------------------
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.volume(15); //Set volume value. From 0 to 30
myDFPlayer.pause(); //Play the first mp3
myDFPlayer.EQ(DFPLAYER_EQ_POP);
}
//===========================================================
void loop()
{

if(digitalRead(4) == HIGH) myDFPlayer.play(1); {
delay(0);
}

if(digitalRead(5) == HIGH) myDFPlayer.play(2);{

}

if(digitalRead(6) == HIGH) myDFPlayer.play(3);{
delay(0);

}

if(digitalRead(7) == HIGH) myDFPlayer.play(4);{
delay(0);
}

if(digitalRead(8) == HIGH) myDFPlayer.play(5);{
delay(0);
}

if(digitalRead(9) == HIGH) myDFPlayer.play(6);{
delay(0);
}

if(digitalRead(2) == HIGH) myDFPlayer.play(7);{
delay(0);
}

if(digitalRead(3) == HIGH) myDFPlayer.play(8);{
delay(0);
}

if(digitalRead(13) == HIGH) myDFPlayer.volumeUp();
if(digitalRead(12) == HIGH) myDFPlayer.volumeDown();

//---------------------------------------------------

}

Das Beispiel hast du doch schon erhalten.

Würde mit Codetags besser aussehen.

13 wäre richtig.

Schon mal über INPUT_PULLUP nachgedacht?

Schon mal über eine Tastaturmatrix für mehr Titel nachgedacht?

Du könntest BUSY vom Plaver auswerten.

Hallo,
Du könntest die Eingänge mittels eines Array verarbeiten. Dann mittels eine Schleife abfragen und über den Schleifenzähler den Titel bestimmen.

myDFPlayer.play(i);

Wenn einer der Taster gedrückt ist lässt sich so mit nur einem Merker die Flanke erkennen.
BUSY abfragen ist auch eine gute Idee, allerdings wird es dann schwer einen laufenden Titel zu ändern.

Heinz

Hallo Heinz,

ich bin was die Programmierung angeht absoluter Anfänger und muss zugeben das ich leider nur Bahnhof verstehe. Kannst du mir bei dem Aufbau Stück für Stück helfen. Ich muss das bis Anfang nächster Woche zu laufen kriegen. Gerne auch per Teams oder Skype. Gerne zeige ich mich auch erkenntlich für den Aufwand.

Gruß Patrick

Ja.
Hiermit, - basierend auf meinem ins blaue geschriebene von gestern, kannst Du mal anfangen.

Ganz langsam.
Du kommst schon noch dahin, das Dir noch mehr einfällt :wink:
[EDIT!]
Im elseZweig fehlte was - hab ich noch mit reinkopiert
[/EDIT!]

// Forensketch basiert auf https://forum.arduino.cc/t/projekt-dfmp3player-mini/904529/4
// Unter Berücksichtigung von https://forum.arduino.cc/t/projekt-dfmp3player-mini/904529 und 
// https://forum.arduino.cc/t/projekt-dfmp3player-mini/904529/3 sowie aktueller Kenntnisstand
// Ungetestet - kompiliert fehlerfrei
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
//---------------------------------------------------
SoftwareSerial mysoftwareSerial(10, 11);
DFRobotDFPlayerMini myDFPlayer;
//===========================================================
void setup()
{
  pinMode(2, INPUT); pinMode(3, INPUT); pinMode(4, INPUT);
  pinMode(5, INPUT); pinMode(6, INPUT); pinMode(7, INPUT);
  pinMode(8, INPUT); pinMode(9, INPUT);
  pinMode(12, INPUT); pinMode(12, INPUT);
  //---------------------------------------------------
  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.volume(15); //Set volume value. From 0 to 30
  myDFPlayer.pause(); //Play the first mp3
  myDFPlayer.EQ(DFPLAYER_EQ_POP);
}
//===========================================================
void loop()
{
  static bool tasteGedrueckt = false;
  if (tasteGedrueckt == false)
  {
    if (digitalRead(4) == HIGH)
    {
      tasteGedrueckt = true;
      myDFPlayer.play(1);
    }
    else if (digitalRead(5) == HIGH)
    {
      tasteGedrueckt = true;
      myDFPlayer.play(2);
    }
    else if (digitalRead(6) == HIGH)
    {
      tasteGedrueckt = true;
      myDFPlayer.play(3);
    }
    else if (digitalRead(7) == HIGH)
    {
      tasteGedrueckt = true;
      myDFPlayer.play(4);
    }
    else if (digitalRead(8) == HIGH)
    {
      tasteGedrueckt = true;
      myDFPlayer.play(5);
    }
    else if (digitalRead(9) == HIGH)
    {
      tasteGedrueckt = true;
      myDFPlayer.play(6);
    }
    else if (digitalRead(2) == HIGH)
    {
      tasteGedrueckt = true;
      myDFPlayer.play(7);
    }
    else if (digitalRead(3) == HIGH)
    {
      tasteGedrueckt = true;
      myDFPlayer.play(8);
    }
  }
  else
  {
    tasteGedrueckt = false;
    for (byte i = 2; i < 8; i++)
    {
      if (digitalRead(i) == HIGH)
        tasteGedrueckt = true;
    }
  }  if (digitalRead(13) == HIGH) myDFPlayer.volumeUp();
  else if (digitalRead(12) == HIGH) myDFPlayer.volumeDown();
  //---------------------------------------------------
}

Das geht besser, aber einem Mechaniker Bedingungen vorzulegen halte ich für Erfolg versprechend. :slight_smile:

1 Like

Der Geburtstag von meinem Sohn ist gerettet :-). Wärst du so freundlich mir Kommentare zu den Schritten einzufügen? Dann kann ich das Versuchen nachzuvollziehen.

Der Mechaniker ist besser im Bereich CNC und Zerspanung :slight_smile:

Vielen DAnk

Wärest Du bereit das wenigstens ein wenig runtergekürzt mitzulernen?

Ja klar, ich möchte hier lernen und besser werden

Las mir kurze Zeit. - ich bau mal was.

Hier klappt es nicht, alle anderen funktionieren

Ja, weil ich einen zuwenig abfrage.
Kommt im nachfolgenden Code.....

Hab ich mal gemacht. Schon ein weinig umgebaut.
Alle Kommentare im Code.
Bitte einmal durch und versuchen zu verstehen, warum das so ist.
Frage, wenn Du Fragen hast.
Bitte nicht alle einzeln :wink:

Wenn Du das durch hast und mir sagst, wo Du eine Möglichkeit vermutest durch einfaches zählen abzukürzen, kommt eine verkürzte Variante.
:wink:

#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
//---------------------------------------------------
SoftwareSerial mysoftwareSerial(10, 11);
DFRobotDFPlayerMini myDFPlayer;

// InputPins unbedingt bezeichnen - wie die heissen ist egal,
// es sollte aus dem Namen herauszulesen sein, was der Pin macht
// Jeder Pin soll eine Funktion ausführen, so ist das relativ einfach:
// Ein PIN kann sich nicht verändern. Darum wird er const!
// Ein byte ist die kleinste Größe wo eine PinNummer rein passt
// Wenn Du jetzt den PIN änderst, ist er im ganzenProgramm geändert
// Du brauchst also nicht weiter suchen.... - Vergleiche mit Deinem Code ;)
const byte titel1Pin = 4;  // Hier ist sortiert nach den Titeln
const byte titel2Pin = 5;
const byte titel3Pin = 6;
const byte titel4Pin = 7;
const byte titel5Pin = 8;
const byte titel6Pin = 9;
const byte titel7Pin = 2;
const byte titel8Pin = 3;

const byte volumeUpPin = 12;  // das sollte klar sein
const byte volumeDownPin = 13;

// Das geht eindeutig besser - wenn Du das durch hast und verstanden,
// mach ich das kürzer - aber erstmal Grundlagen.

void setup()
{
  // Hier siehst Du, wie die Variablen verwendet werden
  // Das ist aber aufwendig und schreibintensiv
  // inkl. Fehlermöglichkeiten.
  pinMode(titel1Pin, INPUT); pinMode(titel2Pin, INPUT); pinMode(titel3Pin, INPUT);
  pinMode(titel4Pin, INPUT); pinMode(titel5Pin, INPUT); pinMode(titel6Pin, INPUT);
  pinMode(titel7Pin, INPUT); pinMode(titel8Pin, INPUT);
  pinMode(volumeUpPin, INPUT); pinMode(volumeDownPin, INPUT);
  //---------------------------------------------------
  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.volume(15); //Set volume value. From 0 to 30
  myDFPlayer.pause(); //Play the first mp3
  myDFPlayer.EQ(DFPLAYER_EQ_POP);
}
//===========================================================
void loop()
{
  // Die Variable tasteGedrueckt ist ein Merker, ob ein Tastendruck ausgelöst wurde
  // static bedeutet, das der Inhalt der Variable erhalten bleibt,
  // bis die Funktion erneut aufgerufen wird
  static bool tasteGedrueckt = false;
  if (tasteGedrueckt == false)                     // Wenn MERKER nicht ausgelöst ...
  {
    if (digitalRead(titel1Pin) == HIGH)            // frage jede einzelne Taste ab
    {
      tasteGedrueckt = true;                       // wenn Taste gedrückt merke es
      myDFPlayer.play(1);                          // und spiele den Titel
    }
    else if (digitalRead(titel2Pin) == HIGH)       // - das geht jetzt so weiter
    {
      tasteGedrueckt = true;
      myDFPlayer.play(2);
    }
    else if (digitalRead(titel3Pin) == HIGH)
    {
      tasteGedrueckt = true;
      myDFPlayer.play(3);
    }
    else if (digitalRead(titel4Pin) == HIGH)
    {
      tasteGedrueckt = true;
      myDFPlayer.play(4);
    }
    else if (digitalRead(titel5Pin) == HIGH)
    {
      tasteGedrueckt = true;
      myDFPlayer.play(5);
    }
    else if (digitalRead(titel6Pin) == HIGH)
    {
      tasteGedrueckt = true;
      myDFPlayer.play(6);
    }
    else if (digitalRead(titel7Pin) == HIGH)
    {
      tasteGedrueckt = true;
      myDFPlayer.play(7);
    }
    else if (digitalRead(titel8Pin) == HIGH)
    {
      tasteGedrueckt = true;
      myDFPlayer.play(8);
    }
  }
  else                                                // ... MERKER ausgelöst (siehe oben!)
  {
    tasteGedrueckt = false;                           // dann initialisiere erstmal mit false
    for (byte i = titel7Pin; i < titel6Pin; i++)      // frage alle Tasten durch (Achtung! FALLE - das erklär ich später)
    {
      if (digitalRead(i) == HIGH)                     // Wenn eine der Tasten gedrückt ist
        tasteGedrueckt = true;                        // wird der Merker wieder gesetzt
    }
  }
  // Hier habe ich schon mal getauscht.
  // Grund: Wenn DOWN gedrückt ist, wird UP nicht mehr abgefragt
  // Wenn beide Tasten gedrückt sind, wird es IMMER leiser - nie lauter
  if (digitalRead(volumeDownPin) == HIGH) myDFPlayer.volumeDown();
    else if (digitalRead(volumeUpPin) == HIGH) myDFPlayer.volumeUp();
}
1 Like

Hallo,
das wäre jetzt mein Vorschlag. Das mit dem einen Merker muss ich zurück nehmen , ein Array solle es aber tun :wink:

nicht getestet.

#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
//---------------------------------------------------
SoftwareSerial mysoftwareSerial(10, 11);
DFRobotDFPlayerMini myDFPlayer;

const byte btnpin[] {2, 3, 4, 5, 6, 7, 8, 9};
const byte btnvolup = 12;
const byte btnvoldown = 13;
const byte max = sizeof(btnpin) / sizeof(btnpin[0]);
bool merker[max];
//===========================================================
void setup() {
  for ( byte i = 0; i < max; i++) {
    pinMode(btnpin[i], INPUT);
  }
  pinMode(btnvolup, INPUT);
  pinMode(btnvoldown, INPUT);
  //---------------------------------------------------
  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.volume(15); //Set volume value. From 0 to 30
  myDFPlayer.pause(); //Play the first mp3
  myDFPlayer.EQ(DFPLAYER_EQ_POP);
}
//===========================================================
void loop()
{

  for (byte i = 0; i < max; i++) {
    if (digitalRead(btnpin[i]) == HIGH && merker[i] == false) {
      merker[i] = true;
      myDFPlayer.play(i + 1);
      Serial.print("play Titel ");Serial.println(i);
    }
  }
  for (byte i = 0; i < max; i++) { //reset merker 
    if (digitalRead(btnpin[i]) == LOW) merker[i] = false;
  }



  if (digitalRead(btnvolup) == HIGH) myDFPlayer.volumeUp();
  if (digitalRead(btnvoldown) == HIGH) myDFPlayer.volumeDown();

  //---------------------------------------------------

}
1 Like

Ich danke dir und werde jetzt Schritt für Schritt lesen und versuchen alles nachzuvollziehen. Deine Hilfsbereitschaft ist wirklich super. Ich gebe dir Morgen ein Feedback in wie weit ich alles verstanden habe.

Schönen Abend

Auch dein Sketch werde ich testen

so'n bissl vorgegriffen :wink:

Warum?
Es reicht doch zu wissen das keine oder eine Taste gedrückt ist :wink: