Go Down

Topic: MP3 Board: SFEMP3Shield + RFID Leser: MFRC55 (Read 296 times) previous topic - next topic

Saubr

Oct 01, 2018, 05:38 pm Last Edit: Oct 01, 2018, 05:43 pm by Saubr
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.

Code: [Select]
#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.

Tommy56

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

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Saubr

#2
Oct 01, 2018, 05:53 pm Last Edit: Oct 01, 2018, 06:31 pm by Saubr
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.

Tommy56

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
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

HotSystems

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.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Saubr

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 ?

HotSystems

.....
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.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Saubr

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 ?

Tommy56

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
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

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.

HotSystems

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.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Go Up