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.