Hilfe bei Softwareänderung, gleiche Karte ignorieren

Hallo,

ich lese schon längere Zeit mit und ich freue mich sehr, dass sich hier eine so großartige Community gebildet hat!

Ich habe dem Arduino ein Bluetooth-Modul spendiert, damit ich mit dem Handy auf die Box zugreifen kann. Das funktioniert auch ganz gut. Da lassen sich dann auf sehr einfache Weise SleepTimer, etc. realisieren. Die Firmware läuft auch ganz gut.

Nun zu meinem Problem: Wenn ich die Karte herunternehme (spielt die Box weiter, passt!) und wieder auflege, dann spielt die Box den Titel/das Hörbuch wieder von vorne. Aktuell ist die Karte im Hörspiel-Modus konfiguriert.
Irgendwer hat es geschafft, das Verhalten der Tonibox zu implementieren, d.h. Karte runter = Pause, Karte drauf = weiterspielen. Kann mir vielleicht jemand auf die Sprünge helfen, wie ich das (bzw. den zweiten Teil) im Code realisieren kann?

Folgendes habe ich versucht:

  • Anlegen eines neuen nfcTagObject newCard;
  • Wenn eine neue Karte aufliegt, springt er aus der Loop, liest die neue Karte (newCard) und ich vergleiche, ob Ordner und Mode gleich sind. Falls ja, zurück zu loop, wenn nicht: myCard = newCard; newCard.mode = 0; newCard.folder = 0; und das Programm quasi weiter laufen lassen.
  • Das macht er einmal, danach ignoriert er alle Karten, die aufgelegt werden. Vermutlich hängt es bei der MFRC522-Bib, aber ich steig da nicht ganz durch, da die Bib recht komplex ist. Was auffällt: Der springt aus der Loop und betritt sie wieder, auch wenn eine Karte liegen bleibt. Ganz klar ist mir das Verhalten nicht …

nfcTagObject myCard;
nfcTagObject newCard;

void loop()
{
Serial.println(„Entering Loop“);
do
{

} while (!mfrc522.PICC_IsNewCardPresent());

Serial.println(„Leaving loop“);

// RFID Karte wurde aufgelegt
if (!mfrc522.PICC_ReadCardSerial()) return;

// EXPERIMENTAL
if (readCard(&newCard) == true)
{
Serial.println(„Read card“);

if ((newCard.folder == myCard.folder) && (newCard.mode == myCard.mode))
{
Serial.println(„folder and mode of cards are identical, return to loop“);
return;
}
else
{
Serial.println(„folder and mode of cards are not identical, therefore continue“);
myCard = newCard;
newCard.folder = 0;
newCard.mode = 0;
}

(Wie kann ich Code anzeigen?)

Kann mir wer mit ein paar Tips helfen? Bei Bedarf kann ich auch die Projektdatei zur Verfügung stellen.

Danke und viele Grüße,
iBuddy

Damit machst du aber den Hörspielmodus unbrauchbar, wo bei jedem neuen auflegen der selben Karte ein anderer Titel kommt.

Vermutlich weil

mfrc522.PICC_HaltA();
mfrc522.PCD_StopCrypto1(); 

nicht gemacht wurden? Ich habe aber jetzt nicht alles geprüft.

Schau dir am besten die Forks der Leute an, die das umgebaut haben. z.B.:

https://github.com/PluggPreagar/TonUINO/commits/master
https://github.com/hvdh2/TonUINO/commits/DEV-pause-when-card-away

Ich habe das aber weder selbst ausprobiert noch ist das mein gewünschtes Verhalten. Daher ohne Gewähr.

Hallo Stephan,

danke für deine Hilfe. Die Befehle

mfrc522.PICC_HaltA();
mfrc522.PCD_StopCrypto1();

hatte ich nicht weiter drin, da ich dachte, dass ich in die Sequenz eigentlich nicht unterbreche und ich die gegebenen Funktionen wiederverwende. Tja, falsch gedacht. Folgendes funktioniert nun wie ich es mir vorstelle:

if (readCard(&newCard) == true) 
{
Serial.println("Read card");

if ((newCard.folder == myCard.folder) && (newCard.mode == myCard.mode))
{
  Serial.println("folder and mode of cards are identical, return to loop");
  mfrc522.PICC_HaltA();  // <----- HIER 
  mfrc522.PCD_StopCrypto1();  // <----- HIER 
  return;
}
else
{
  Serial.println("folder and mode of cards are not identical, therefore continue");
  myCard = newCard;
  newCard.folder = 0;
  newCard.mode = 0;
}

Da ich per “return” ganz an den Anfang springe und “readCard()” die Verbindung zum MFRC522 nicht “schließt”, kommt es zu den geschilderten Verbindungproblemen (stand auch in der Doku zur MFRC522-Bib). Einfügen und fertig.
Eleganterweise sollte ich aber noch die UID der Karte merken und statt folder & mode diese vergleichen. Mal schauen wie ich das bewerkstellige. Da hilft mir aber sicherlich der zweite Post.

Danke dir vielmals! Danke an die Anteilnahme der anderen. :wink:

Viele tönernde Grüße,
ibuddy :loud_sound: