DFPlayer Mini MP3 Player und IR-Fernbedienung

Hallo,
ich habe hier einen Sketch, bei dem durch Drücken der IR-Fernbedienungstaste 1 eine LED "IMMER_AN" eingeschaltet und beim nochmaligen Drücken der selben Taste die LED wieder aus geht. Das klappt auch wunderbar.

Nach dem gleichen Prinzip möchte ich gerne mit Taste 2 einen MP3-Player steuern.
Bisher habe ich es nur hinbekommen den MP3-Player zu starten.
Meine Arduino-Kenntnisse sind leider sehr bescheiden, so dass ich an dieser Stelle einfach nicht weiter komme.

#include "Arduino.h"                            //MP3-Player
#include "SoftwareSerial.h"                     //MP3-Player
#include "DFRobotDFPlayerMini.h"                //MP3-Player
#include "IRremote.h"                           //IR-Fernbedienung

SoftwareSerial mySoftwareSerial(10, 11); //PIN 10 = TX; PIN 11 = RX     //MP3-Player
DFRobotDFPlayerMini myDFPlayer;                                         //MP3-Player
void printDetail(uint8_t type, int value);                              //MP3-Player

int RECV_PIN = 9;                                                             //IR-Fernbedienung
IRrecv irrecv(RECV_PIN);                                                      //IR-Fernbedienung
decode_results results;                                                       //IR-Fernbedienung
int IMMER_AN_Status = 0;   //Definiere denn Status von IMMER_AN (an/aus)      //IR-Fernbedienung
int IMMER_AN = 13;          // immer an


void setup() 
{
mySoftwareSerial.begin(9600);                                                                    //MP3-Player                
  Serial.begin(115200);                                                                          //MP3-Player
  
  Serial.println();                                                                              //MP3-Player
  Serial.println(F("DFRobot DFPlayer Mini Demo"));                                               //MP3-Player
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));                         //MP3-Player
  
  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.      //MP3-Player
    Serial.println(F("Unable to begin:"));                                                       //MP3-Player
    Serial.println(F("1.Please recheck the connection!"));                                       //MP3-Player
    Serial.println(F("2.Please insert the SD card!"));                                           //MP3-Player  
    while(true){                                                                                 //MP3-Player
      delay(0); // Code to compatible with ESP8266 watch dog.                                    //MP3-Player
    }
  }
  Serial.println(F("DFPlayer Mini online."));                                                    //MP3-Player
  
  myDFPlayer.volume(20);  //Set volume value. From 0 to 30                                       //MP3-Player
  
  pinMode(9, OUTPUT);                     //IR-Fernbedienung
  pinMode(IMMER_AN, OUTPUT);
  
  irrecv.enableIRIn();                      //IR-Fernbedienung
}


void loop() 
{
if (irrecv.decode(&results)) {                                                                     //IR-Fernbedienung
Serial.println(results.value, DEC);                                                                //IR-Fernbedienung  
switch(results.value){                                                                             //IR-Fernbedienung
   case (16753245) :        //Wenn 1 gedrückt wurde,                                               //IR-Fernbedienung
                            //überprüfe ob IMMER_AN an oder aus ist                                //IR-Fernbedienung
if (IMMER_AN_Status == 0){digitalWrite(IMMER_AN, HIGH); IMMER_AN_Status++;}  //Wenn aus, dann an   //IR-Fernbedienung
else {digitalWrite(IMMER_AN, LOW); IMMER_AN_Status--;}                       //Wenn an, dann aus   //IR-Fernbedienung
delay(1); break;                                                                                   //IR-Fernbedienung NEU
   case (16736925) :        //Wenn 2 gedrückt wurde,                                               //IR-Fernbedienung NEU
myDFPlayer.loop(1);         //dann MP3-Datei "1" in Schleife abspielen                             //IR-Fernbedienung NEU
delay(1); break;default: delay(1);}                                                                //IR-Fernbedienung NEU

irrecv.resume();                                                                                   //IR-Fernbedienung 
}                                                                                                  //IR-Fernbedienung
}

Dann sieh dir das Datenblatt des DFplayers mal an.
Du kannst den DFplayer wunderbar über die serielle Schnittstelle die du ja auch schon eingebunden hast, steuern.

Hallo Dieter,
danke für deine schnelle Antwort.
Oh, ha! :o Datenblatt? serielle Schnittstelle? :o
Ich glaub, ich bin raus :confused:

Bei der LED-Steuerung wird ja abgefragt, wie der Status der LED ist.
Wenn LED AN ist, soll durch Drücken der Taste 1 die LED AUS gehen.
Wenn LED AUS ist, soll durch Drücken der Taste 1 die LED AN gehen.

Was ich gerne noch zusätzlich hätte, wäre:
Wenn MP3-Player AN ist, soll durch Drücken der Taste 2 der MP3-Player AUS gehen
und
wenn MP3-Player AUS ist, soll durch Drücken der Taste 2 der MP3-Player AN gehen.

Wie müsste der Programmcode hierfür aussehen?

Wenn du dir die Beispiele in der DFPlayer-Library ansiehst, da findestdu schonmal vieles, was du brauchst.
Weiteres in den Beispielen zu IRRemote.
Das musst du nur entsprechend deinen Wünschen zusammen setzen.

Hi

Du prüfst, ob die entsprechende Taste gerade jetzt gedrückt ist, davor nicht gedrückt war und ob der letzte 'Zustand' länger als 20ms her ist.
Wenn auch die letzte Prüfung wahr wird, hast Du einen bestehenden Tastendruck oder ein bestehendes Lösen der Taste.
Nun schaust Du nach, ob der Player gerade läuft oder die LEDs gerade an sind - diesen Wert 'drehst Du um' und schickst Den zu LED und Player - je nachdem, Wer jetzt gerade gemeint war.

Eigentlich ganz einfach - zumindest geschwätzt.

Zeige uns, daß Du an einer Lösung interessiert bist, zeige uns, wie Du dieses Problem lösen möchtest - bei Fehlschlägen, in Denen man Deinen Willen erkennen kann, werden wir Dir bestimmt helfend unter die Arme greifen.

Überlege Dir Deinen Weg und überlege Dir direkt, wie Du Diesen z.B. Deiner Mutter erklären würdest - wenn Sie Ihn versteht (also den Weg), hast Du Ihn so weit runtergebrochen, daß man Ihn lösen kann oder bei Fehlern Diese leicht eingrenzen kann.

Dabei spielt es kaum eine Rolle, wie firm Deine Mutter in der Materie drin ist (also nix gegen die Frau Mutter!) - die Rolle spielen Deine Überlegungen, die Probleme laienverständlich aufzubrechen, wodurch Du auch selber bereits viele Probleme selber erkennst und mit Deinem Wissen selber ausmerzen kannst.

Siehe dazu auch 'Rubberduck Debugging' - Klick zur deutschen Version.

MfG

Habe den Programm Code abgeändert.
Wenn der Player die MP3-Datei 1 in Schleife abspielt, dann deaktiviere das Abspielen.
Ansonsten spiele die MP3-Datei 1 in Schleife ab.

case (16736925) :                                        //Taste 2 ist gedrückt
if (myDFPlayer.loop(1)){myDFPlayer.disableLoop()}  
else {myDFPlayer.loop(1)}                              
delay(1); break;default: delay(1);}   


Es erscheint allerdings diese Fehlermeldung:
could not convert 'myDFPlayer.DFRobotDFPlayerMini::loop(1)' from 'void' to 'bool'

pussy123:

if (myDFPlayer.loop(1)){myDFPlayer.disableLoop()}

Der Fehler liegt vermutlich in dieser Anweisung.

Prüfe doch einfach mal in der Library wie die Anweisung auszusehen hat.

"Prüfe doch einfach mal in der Library wie die Anweisung auszusehen hat."

Also mit Library meinst du DFRobotDFPlayerMini.h?
Wie kann man sich diese ansehen?

Ich habe die Befehle "myDFPlayer.loop(1)" und "myDFPlayer.disableLoop()" im Beispiel "DFRobotDFPlayerMini --> "FullFunction" gefunden.

Aber irgendwie beißen sich die beiden Befehle, wenn sie zusammen in einer if-Anweisung stehen.

pussy123:
Also mit Library meinst du DFRobotDFPlayerMini.h?
Wie kann man sich diese ansehen?

Mit dem Editor Deiner Wahl. Ich empfehle Notepad++.

Gruß Tommy

pussy123:
"Prüfe doch einfach mal in der Library wie die Anweisung auszusehen hat."

Also mit Library meinst du DFRobotDFPlayerMini.h?
Wie kann man sich diese ansehen?

Ich habe die Befehle "myDFPlayer.loop(1)" und "myDFPlayer.disableLoop()" im Beispiel "DFRobotDFPlayerMini --> "FullFunction" gefunden.

Aber irgendwie beißen sich die beiden Befehle, wenn sie zusammen in einer if-Anweisung stehen.

Ja, die meine ich.

Dann solltest du die Anweisungen (nicht Befehle) so schreiben, wie sie im Beispiel vorgegeben sind.
Natürlich für deine Anwendung entsprechend angepasst.