MP3 Board: SFEMP3Shield + RFID Leser: MFRC55

Hallo Zusammen,
ich versuche gerade einen MP3-Player zu basteln, der bei Erkennen einer RFID-Karte eine entsprechende MP3 abspielt.
Das klappt auch soweit ganz gut. Was mich stört, während das Audiofile läuft ist der Arduino blockiert, heißt ich kann nicht, z.B. durch Auflegen einer anderen RFID-Karte das Stück wechseln. Ich muss warten bis das MP3 zi Ende ist.
Gibt es die Möglichkeit das ganze ohne Blockierung zu machen ?
Das RFID Teil ist so eins: RFID
MP3-Board: MP3

Hier mein Sketch, quick and dirty, Sorry.

#include <SPI.h> // SPI-Bibiothek hinzufügen
#include <MFRC522.h> // RFID-Bibiothek hinzufügen

//Add the SdFat Libraries für MP3-Dateien
#include <SdFat.h>


//and the MP3 Shield Library
#include <SFEMP3Shield.h>

#define SS_PIN_leser 10 // SDA an Pin 10 
#define RST_PIN_leser 9 // RST an Pin 9 
#define CS_PIN_MP3 5 //CS PIN 5
const int interruptPin=1;

SdFat sd;


String content;
String card_id[] = {"52-da-1f-1f","9a-a9-27-83"};
int number_ids=sizeof(card_id)/sizeof(card_id[0]);

MFRC522 mfrc522(SS_PIN_leser, RST_PIN_leser); // RFID-Empfänger benennen
SFEMP3Shield MP3player; // MP3-Player benennen

void setup() // Beginn des Setups:
{
  
  attachInterrupt(digitalPinToInterrupt(interruptPin), MP3_stoppen, CHANGE);
  sd.begin(CS_PIN_MP3); // Initialisierung SD-Karte
  Serial.begin(115200);
  SPI.begin(); // SPI-Verbindung aufbauen
  mfrc522.PCD_Init(); // Initialisierung des RFID-Empfängers
  MP3player.begin();
  MP3player.setVolume(100, 100);

  
  Serial.print(number_ids);
  Serial.println(" Karten sind gespeichert");
  
}


void loop() // Hier beginnt der Loop-Teil
{
  
  
  
  if ( ! mfrc522.PICC_IsNewCardPresent()) // Wenn keine Karte in Reichweite ist...
  {
    return; // ...springt das Programm zurück vor die if-Schleife, womit sich die Abfrage wiederholt.
  }
  if ( ! mfrc522.PICC_ReadCardSerial()) // Wenn kein RFID-Sender ausgewählt wurde
  {
    return; // ...springt das Programm zurück vor die if-Schleife, womit sich die Abfrage wiederholt.
  }


  

  for (byte i = 0; i < 4; i++)
  {
    if (i > 0) content.concat("-");
    content.concat(String(mfrc522.uid.uidByte[i], HEX));
    }
    
  Serial.print("Die ID des RFID-TAGS lautet:");
  Serial.println(content);

  for (byte n=0; n<number_ids;n++) {
    if (content==card_id[n]) {
      MP3_abspielen(n);
    }
  }
 
  
  content = "";
  
}

void MP3_abspielen(int track) {
  Serial.print("Spiele Lied Nr. ");
  Serial.println(track);
  MP3player.playTrack(track);
  delay(50000);
  MP3player.stopTrack();
}


void MP3_stoppen() {
  Serial.print("Unterbrechung");
  MP3player.stopTrack();
}

Sehe gerade, in dieser Version habe ich Versucht mit einem IRQ was zu erreichen, aber der PIN ist bei dem Shield nicht aktiviert.

Mit Deinem delay(50000); blockierst Du Dein System für 50 Sekunden. In dieser Zeit kann keine neue RFID gelesen werden.

Gruß Tommy

Ok, das habe ich verdient.
Ursprünglich ist das delay(50000) und das MP3player.stopTrack() nicht drin.
Ich wollte damit testen, ob der Sketch nach beenden des Liedes wieder läuft, und hatte keine Lust zu warten bis es zu ende ist. :-[

Trotz allem kann ich auch ohne Delay keine Karten einlesen während das Lied läuft.

Ich habe dieses Teil nicht.

Wenn ich mir aber die Beispiele zur Lib anschaue, habe ich den Eindruck, dass es nicht blockiert.

Versuche doch erst mal die Beispiele, die in der Lib mitgeliefert werden, um das Verhalten zu verifizieren.

Gruß Tommy

Warum muss es unbedingt der von dir eingesetzte MP3-Player sein.
Leider kann ich zu dem Teil nichts beitragen.

Besser wäre der DFPlayer mini.
Den kannst du def. einfacher steuern, da MP3-mäßig alles auf dem Player läuft und dieser wird seriell angesprochen. Ich steure den per IR-Fernbedienung und kann jederzeit den Titel wechseln. Das sollte dann auch per RFID funktionieren.

In dem Beispiel kann man tatsächlich während der Wiedergabe, neue Befehle per Seriel-Monitor senden.
Durchschaue nur leider nicht warum es dort klappt, und bei mir nicht.
Dazu habe ich einfach zu wenig Ahnung von der Sache.

Vielleicht fällt hier jemandem was dazu auf ??

Sonst bestelle ich mit tatsächlich diesen DFPlayer mini. Der scheint ja auch sehr kompakt zu sein.
Hast du da einen Link, wo ich den am besten bestellen kann ?

Saubr:
.....
Sonst bestelle ich mit tatsächlich diesen DFPlayer mini. Der scheint ja auch sehr kompakt zu sein.
Hast du da einen Link, wo ich den am besten bestellen kann ?

Mittlerweile gibt es zahlreiche Angebote bei ebay, z.B. diesen hier.
Da solltest du dir den "besten" aussuchen.

Trotz allem wird die SFEMP3Shield Library als: "a real time non-blocking interrupt driven library for VSLI's VS10xx" beschrieben.
Fällt den Profis hier vielleicht doch noch ein, was ich falsch gemacht haben könnte ?

Wenn es mit den Beispielen aus der Lib nicht blockierend funktioniert, dann nimm doch ein funktionierendes Beispiel, dass Dir schon nahe kommt und baue da drin Deine RFID-Steuerung ein.

Gruß Tommy

Um das ganze hier noch abzuschließen. Benutze jetzt tatsächlich den DFPlayer mini, ist für meine Zwecke mehr als ausreichend, und super einfach anzusprechen.

Vielen Dank an alle.

Saubr:
Um das ganze hier noch abzuschließen. Benutze jetzt tatsächlich den DFPlayer mini, ist für meine Zwecke mehr als ausreichend, und super einfach anzusprechen.

Vielen Dank an alle.

Freut mich, dass es so funktioniert und danke für die Rückmeldung.