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.
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.
#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.
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!
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();
}
}
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.
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();
}
}
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.
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.
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?