Soundinstallation mit MP3-Player YX5300; Reset per Taster; GELÖST!

Na denn, dann haben wir es ja schon fast.
Anmerkung zur Klarstellung: Wir meinen das delay() am Ende der loop, nicht das kurze im setup().

Versuch erstmal selbst - es ist jetzt wirklich nicht mehr schwer.

Der Buzzer ist an Pin 9 angeschlossen und schaltet nach GND (d.h. wenn gedrückt, liegt LOW Pegel an Pin 9). Daher ist das hier aus #4 schon richtig:

const int Taster = 9;
... 
  pinMode (Taster, INPUT_PULLUP);
...
  if (digitalRead(Taster) == LOW)

Da die Pins nicht über 255 zählen, nehmen wir lieber const byte Taster = 9;

Was soll nun in loop() genau passieren:

  • Zunächst mal nix - das MP3 soll ja erst auf Tastendruck gestartet werden
  • Also testen, ob der Buzzer gedrückt wurde.
  • Falls ja: MP3 abspielen, ansonsten nix tun.

Da die Library leider kein "isPlaying" bietet, würde ein wiederholter Druck während des Abspielens vermutlich das (einzige) MP3 auf der SD-Karte wieder von vorn abspielen.

Das sollte für den Anfang reichen - die evtl. nötige Tastenentprellung und Verriegelung über die Laufzeit des Stücks (Dein Versuch mit timestore) kriegen wir später auch noch gebacken.

@my_xy_projekt Wie Du wünscht. Ich wollte hervorheben und die Warnfarbe rot nicht verwenden.

Wie kommt man eigentlich an den Inhalt der library, also kann die Befehle sehen, die einem zur Verfügung steehen?

Das geht (in diesem Fall) so:
Mit dem Link "Read the documentation" in der Arduino-Referenz wirst Du auf Github geleitet. Da stehen alle Dateien der Library. Im Verzeichnis src findest Du die Header-Datei SerialMP3Player.h - die definiert das Ding.

class SerialMP3Player{

   public:

Alles was an Funktionen (und ganz selten auch Variablen) zwischen public und private steht kannst Du verwenden.

Anmerkung: Die Datei findest Du natürlich auch in Deinem Sketchbook unter Libraries im entsprechenden Unterverzeichnis schon auf Deiner Festplatte. Da ich die aber nicht installieren wollte, bin ich halt über Github gegangen.

Wo genau finde ich den Link "Read the doocumentation?" und wo ist die Arduino Referenz?

Okay, ich habe sie gefunden: SerialMP3Player/SerialMP3Player.h at master · salvadorrueda/SerialMP3Player (github.com)

Das ist gut zu wissen:) Danke!!!

Okay und in der "SerialMP3Player.h"- Bibliothek ist die "SoftwareSerial.h"- Bibliothek auch schon eingebunden, jetzt verstehe bzw. sehe ich es.

#include <SerialMP3Player.h>

/******************************************************************************
  Simple SerialMP3Player "Hello World" example of YX5300 chip.

  Copy the "hello.mp3" file to an empty SD card
  Connect the Serial MP3 Player to the Arduino board
    GND → GND
    VCC → 5V
    TX → pin 10
    RX → pin 11

  After compile and upload the code you must hear “Hello world” over and over.


  This example code is in the public domain.

  https://github.com/salvadorrueda/ArduinoSerialMP3Player

  by Salvador Rueda
 *******************************************************************************/

#include "SerialMP3Player.h" // Einbinden der "SerialMP3Player.h- Bibliothek

const byte Taster = 9;
unsigned long timestore;    // variabler Speicher für Zeit
bool TasterStatus ;         // Variable für Tasterstatus
#define TX 11               // TX wird als Pin 11 definiert // die Pins auf dem MP3 Player- Modul schein vertauscht zu sein, denn TX de YX5300 Moduls liegt an Pin 10 an...
#define RX 10               // RX wird als Pin 10 definiert //...und RX des YX5300- Moduls liegt an Pin 11 an

SerialMP3Player mp3(RX, TX);

void setup() {
  pinMode (Taster, INPUT_PULLUP);
  Serial.begin(9600);     // starte die serielle Schnittstelle
  mp3.begin(9600);        // starte die mp3-Kommunikation
  delay(500);             // Wartezeit für den Anfang

  mp3.sendCommand(CMD_SEL_DEV, 0, 2);   //Auswählen der sd-card
  delay(500);             // Wartezeit für den Anfang
}

// the loop function runs over and over again forever
void loop() {
  if (digitalRead(Taster) == LOW)
  {
    mp3.play();
  }
}

Damit habe ich das Alles umgesetzt, oder?

Du hast mich aber falsch verstanden;).
Ich will, dass die mp3. Datei nach dem Starten des Arduino Uno im Loop dauerhaft durchläuft und man bei Drücken des Tasters auf den Start der mp3.Datei zurückspringt.

  • ist also nicht gewünscht.

Die .mp3- Datei springt nach einem weiteren Drücken des Tasters mit dem Sketch in #27 aber nicht zum Anfang zurück, warum?

Ooops.

Jein. Du sendest in jedem Durchlauf der loop()-Funktion ein neues play() an den MP3-Spieler solange der Buzzer gedrückt ist. Einmal würde reichen (Flankenerkennung: Merker setzen und erst neu starten nachdem der Buzzer wieder losgelassen wurde).

Da mich kurz gewundert hat, warum der Player das mitmacht und warum er nicht neu startet, habe ich nochmal genauer in die Lib geschaut und drei Sachen gefunden:

Es gibt doch eine Antwort, ob das Ding spielt und zwar in Textform mit der Funktion String decodeMP3Answer();. Die Verwendung der String-Klasse gefällt mir nicht. Das liefert u,A,

" -> Completed play num N"
" -> Status: stopped"
" -> Status: playing"
" -> Status: paused"

Vielleicht muss man vorher mit qPlaying() oder qStatus() eine Antwort anfordern. Das ist nicht dokumentiert.

Und das zweite (ich finde unschöne) ist:

#3:

Ich habe so ein Modul leider nicht und kann es nicht ausprobieren.
Es gibt eine Funktion playSL(n) - ob die das n-te File in Dauerschleife abspielt oder n Dateien nacheinander weiß ich leider nicht. Ausprobieren!

Hallo,

Ich habe heute das Setup in diesem Gehäuse hier verbaut. Es soll dauerhaft im Außenbereich unter der Friseurhaube Platz finden. Von oben bekommt es keinen Regen ab. Glaubt Ihr, dass Wasser in dem Gehäuse kondensieren könnte und dem Setup Schaden könnte, oder haltet Ihr das für unwahrscheinlich? Ich werde es einfach mal ausprobieren und in einiger Zeit schreiben wie es gelaufen ist.

Ich musste die male Pin - Enden der Jumper- Kabel, die in den female Pins des Arduino Uno einstecken, umbiegen, damit das Setup mit geschlossenem Deckel ins Gehäuse passt. Damit sich die umgebogenen, leicht freiliegenden male Pin- Enden der Jumper- Kabel nicht berühren, habe ich die Pinbelegung etwas verändert, hier ist der aktuelle Plan des Setups:

#include <SerialMP3Player.h>

/******************************************************************************
  Simple SerialMP3Player "Hello World" example of YX5300 chip.

  Copy the "hello.mp3" file to an empty SD card
  Connect the Serial MP3 Player to the Arduino board
    GND → GND
    VCC → 5V
    TX → pin 10
    RX → pin 11

  After compile and upload the code you must hear “Hello world” over and over.


  This example code is in the public domain.

  https://github.com/salvadorrueda/ArduinoSerialMP3Player

  by Salvador Rueda
 *******************************************************************************/

#include "SerialMP3Player.h" // Einbinden der "SerialMP3Player.h- Bibliothek

const byte Taster = 6;
bool Tasterstatus ;         // Variable für Tasterstatus
#define TX 10               // TX wird als Pin 11 definiert // die Pins auf dem MP3 Player- Modul schein vertauscht zu sein, denn TX de YX5300 Moduls liegt an Pin 10 an...
#define RX 8               // RX wird als Pin 10 definiert //...und RX des YX5300- Moduls liegt an Pin 11 an

SerialMP3Player mp3(RX, TX);

void setup() {
  pinMode (Taster, INPUT_PULLUP);
  bool Tasterstatus = false;
  Serial.begin(9600);     // starte die serielle Schnittstelle
  mp3.begin(9600);        // starte die mp3-Kommunikation
  delay(500);             // Wartezeit für den Anfang

  mp3.sendCommand(CMD_SEL_DEV, 0, 2);   //Auswählen der sd-card
  delay(500);             // Wartezeit für den Anfang
}

// the loop function runs over and over again forever
void loop() {
  if (digitalRead(Taster) == LOW)
  {
    Tasterstatus = true;
  }
  if (digitalRead(Taster) == HIGH)
  {
    Tasterstatus = false;
  }
  if (Tasterstatus == true)
  {
    mp3.play();
  }
}

meinst Du so?

Eigentlich ist mir ja egal ob das Ding läuft. Schließlich will ich ja, dass meine mp3.Datei dauerhaft im Loop läuft und sie durch Drücken des Tasters lediglich auf den Anfang zurück setzen / neu starten.

Ich würde gerne mal ausprobieren wie sich ein anderer Befehl verhält, anstelle des

mp3.play();

In der Bibliothek habe ich den Befehl
#define CMD_PLAY_SLOOP 0X08 // Single loop play.
gefunden. Wenn ich diesen Single loop play- Befehl am Anfang des void loop()- Teils des Sketches bringen würde und dann beim Drücken des Tasters diesen Single loop play- Befehl wiederholen würde, dann hätte das ja auch meinen gewünschten Effekt:
Die mp3. Datei soll im Loop abgespielt werden und beim Drücken des Tasters wieder auf den Anfang springen / zurückgesetzt werden.

Leider habe ich keine Ahnung wie ich den Befehl:
#define CMD_PLAY_SLOOP 0X08 // Single loop play.
im Sketch anwende...
kann mir da bitte jemand helfen?

Ich hätte das ein wenig anders gemacht.
Eine Kabeldurchführung genommen, alle Kabel rein Verschraubung mit Silikon gefüllt und zugeschraubt.
Meine Empfehlung:
Such mal nach den kleinen Päckchen mit den Kügelchen, die sich in Taschen, Schuhen, etc. nach dem Kauf befinden.
Das Suchwort ist Silicagel.
Davon einige mit rein.

Okay das mache ich!

Und das nächste Mal so!

Könntest Du mir bitte auch verraten wie man den Befehl:

, den ich in der SerialMP3Player.h- Bibliothek gefunden habe in meinem Sketch anwendet? Der soll immer dann auftauchen wenn in meinem Sketch gerade der Befehl:

mp3.play();

auftaucht.


#include <SerialMP3Player.h>

/******************************************************************************
  Simple SerialMP3Player "Hello World" example of YX5300 chip.

  Copy the "hello.mp3" file to an empty SD card
  Connect the Serial MP3 Player to the Arduino board
    GND → GND
    VCC → 5V
    TX → pin 10
    RX → pin 11

  After compile and upload the code you must hear “Hello world” over and over.


  This example code is in the public domain.

  https://github.com/salvadorrueda/ArduinoSerialMP3Player

  by Salvador Rueda
 *******************************************************************************/

#include "SerialMP3Player.h" // Einbinden der "SerialMP3Player.h- Bibliothek

const byte Taster = 6;
bool Tasterstatus ;         // Variable für Tasterstatus
#define TX 10               // TX wird als Pin 11 definiert // die Pins auf dem MP3 Player- Modul schein vertauscht zu sein, denn TX de YX5300 Moduls liegt an Pin 10 an...
#define RX 8               // RX wird als Pin 10 definiert //...und RX des YX5300- Moduls liegt an Pin 11 an

SerialMP3Player mp3(RX, TX);

void setup() {
  pinMode (Taster, INPUT_PULLUP);
  bool Tasterstatus = false;
  Serial.begin(9600);     // starte die serielle Schnittstelle
  mp3.begin(9600);        // starte die mp3-Kommunikation
  delay(500);             // Wartezeit für den Anfang

  mp3.sendCommand(CMD_SEL_DEV, 0, 2);   //Auswählen der sd-card
  delay(500);             // Wartezeit für den Anfang
}

// the loop function runs over and over again forever
void loop() {
  mp3.play();
  if (digitalRead(Taster) == LOW)
  {
    Tasterstatus = true;
  }
  if (digitalRead(Taster) == HIGH)
  {
    Tasterstatus = false;
  }
  if (Tasterstatus == true)
  {
    mp3.play();
  }
}

Ich habe hier Esp32 & Serial mp3 Player YX5300 - Crisalctime gerade eine Liste mit den Grundfunktionen der SerialMP3Player.h- Bibliothek gefunden.

Grundfunktionen

     mp3.playNext();             // Play next file
     mp3.playPrevious();         // Play previous file
     mp3.play();                 // Play
     mp3.play(byte n);           // Play n file
     mp3.play(byte n, byte vol); // Play n file with volume

     mp3.volUp();            // Volumen Up
     mp3.volDown();          // Volumen Down
     mp3.setVol(byte v);     // Set Volumen (0-30)

     mp3.playSL(byte n);         // Play Single loop  n file.
     mp3.playSL(byte f, byte n); // Play Single loop play n file from f folder.

     mp3.pause();                // Pause

     mp3.playF(byte f);          // Play all files in the f folder

     mp3.stop();                 // Stop playing

Mit dem Befehl

mp3.play();

kann die mp3. Datei nicht neu gestartet werden. Man muss den laufenden Titel erst mit dem Befehl

mp3.pause();                // Pause

stoppen, damit man ihn dann wieder mit "mp3.play()" von Anfang an abspielen kann.

Der Sketch sieht jetzt so aus und funktioniert ziemlich gut.

#include <SerialMP3Player.h>

/******************************************************************************
  Simple SerialMP3Player "Hello World" example of YX5300 chip.

  Copy the "hello.mp3" file to an empty SD card
  Connect the Serial MP3 Player to the Arduino board
    GND → GND
    VCC → 5V
    TX → pin 10
    RX → pin 11

  After compile and upload the code you must hear “Hello world” over and over.


  This example code is in the public domain.

  https://github.com/salvadorrueda/ArduinoSerialMP3Player

  by Salvador Rueda
 *******************************************************************************/

#include "SerialMP3Player.h" // Einbinden der "SerialMP3Player.h- Bibliothek

const byte Taster = 6;
bool Tasterstatus ;         // Variable für Tasterstatus
#define TX 10               // TX wird als Pin 11 definiert // die Pins auf dem MP3 Player- Modul schein vertauscht zu sein, denn TX de YX5300 Moduls liegt an Pin 10 an...
#define RX 8               // RX wird als Pin 10 definiert //...und RX des YX5300- Moduls liegt an Pin 11 an

SerialMP3Player mp3(RX, TX);

void setup() {
  pinMode (Taster, INPUT_PULLUP);
  bool Tasterstatus = false;
  Serial.begin(9600);     // starte die serielle Schnittstelle
  mp3.begin(9600);        // starte die mp3-Kommunikation
  delay(500);             // Wartezeit für den Anfang

  mp3.sendCommand(CMD_SEL_DEV, 0, 2);   //Auswählen der sd-card
  delay(500);             // Wartezeit für den Anfang
}

// the loop function runs over and over again forever
void loop() {
  mp3.play();
  if (digitalRead(Taster) == LOW)
  {
    Tasterstatus = true;
    mp3.stop();
  }
  if (digitalRead(Taster) == HIGH)
  {
    Tasterstatus = false;
  }
  if (Tasterstatus == false)
  {
    mp3.play();
  }
}

Das einzige Manko: Wenn ich den Taster gedrückt halte, dann stoppt die Wiedergabe erst, startet dann neu, stoppt dann wieder, startet dann wieder neu usw...
Wie kann ich das ständige Neustarten bei gedrücktem Taster verhindern und bewirken, dass die Wiedergabe erst startet wenn ich den Taster losgelassen habe?

Am Taster müssen wir noch arbeiten.
Gehäuse halte ich so auch für bedenklich.
Die Funktionen stehen so auch in deiner Lib. Schaue ich mal im Code nach, wo das CMD... versteckt ist
Melde mich nach dem Abendessen wieder.

Es gibt neue Probleme:

  • Wenn ich den Arduino Uno und die Lautsprecher per Steckdose versorge, funktioniert alles einwandfrei. Auch wenn ich den Arduino Uno über die Powerbank versorge und die Lausprecher über die Steckdose, funktioniert alles einwandfrei. Sobald ich aber Lautsprecher und Arduino Uno mit der Powerbank versorge, stürzt der Arduino Uno immer mal wieder ab.


Hier ist eine Liste der Verbraucher:

Arduin Uno: 0,0476 A; 5 V
Lausprecher: 0,6 A; 5 V
YX5300 MP3 Player: 0,2 A; 5 V

Hier ist der Link zu den Lautsprechern, hier steht was von Ausgangsspannung 1W, muss das noch draufgerechnet werden? Manhattan USB Lautsprecher Set schwarz/orange: Amazon.de: Computer & Zubehör

Das ist die Powerbank, die ich benutze: INIU Powerbank, 22.5W PD3.0 QC4.0 Schnelles Aufladen 20000mAh LED Display Externer Akku, Tri-Outputs USB C Power bank Kompatibel mit iPhone 13 12 Samsung S21 Xiaomi Oppo iPad Tablet mehr【2022 Version】: Amazon.de: Elektronik & Foto

Woran liegt das? Gibt es einen Trick das Problem zu lösen, oder bleibt nur eine neue Powerbank oder das Hinzuziehen einer zweiten Powerbank als Option?

Danke schonmal für Deine Antwort und guten Apettit:)! Freue mich schon auf Deine Antwort!