Phoniebox

Auf jeden Fall habe ich nun Zeit mir ein paar Dinge schonmal zu überlegen.

byte daten [][11] = {  
/*
 * [*] [0] = zugehörige Liednummer
 * [*] [1-11] = UID
 */

{2, 0x04, 0xE0, 0x2A, 0xDA, 0xAB, 0x5C, 0x80}, // Michelin   
{1, 0x04, 0xDC, 0x2A, 0xDA, 0xAB, 0x5C, 0x80}, // Eule
{3, 0x04, 0xD8, 0x2A, 0xDA, 0xAB, 0x5C, 0x80}, // Spongebob
{4, 0x04, 0xE8, 0x2A, 0xDA, 0xAB, 0x5C, 0x80}, // Hai 
{5, 0x04, 0xED, 0x2A, 0xDA, 0xAB, 0x5C, 0x80}, // Leo Lausemaus
{6, 0x04, 0xF2, 0x2A, 0xDA, 0xAB, 0x5C, 0x80}, // Benjamin
{7, 0x04, 0xF6, 0x2A, 0xDA, 0xAB, 0x5C, 0x80}, // 
{8, 0x04, 0xFA, 0x2A, 0xDA, 0xAB, 0x5C, 0x80}, //  
{9, 0x04, 0x00, 0x2A, 0xDA, 0xAB, 0x5C, 0x81}, //  
{10, 0x04, 0x03, 0x29, 0xDA, 0xAB, 0x5C, 0x81}, //  
{11, 0x04, 0x07, 0x29, 0xDA, 0xAB, 0x5C, 0x81}, //  
{0}                                            // Zum Beenden der While
};

....
....
....

   // UID Vergleichen
   int h = 0;
    do {
    helfer = true;

    for (int j=1; j<10; j++) {
      
      if (mfrc522.uid.uidByte[j-1] != daten [h] [j]) {
        helfer = false;
        break;
      }

    }
    if (helfer) {
      if (daten [h][0] == 0 ) break; 
       myDFPlayer.play(daten [h] [0]);
       break ;                                //Schleife verlassen wenn er etwas gefunden hat
      }
      h = h +1;
    } while ( daten [h][0] != 0);

Dieses Konstrukt funktioniert. Es funktioniert ja sogar so gut, dass auch wirklich nur der TAG 0x04, 0xE8, 0x2A, 0xDA, 0xAB, 0x5C, 0x80 das Lied 4 spielen darf.
Das macht sicher Sinn bei Zutrittskontrollen oder in der Warenwirtschaft.
Aber um das Lied auf einem Spielzeug abzuspielen geht es doch sicher auch eine Stufe lockerer.

Ich denke mir dass ich doch den TAG beschreiben kann. Mit dem einfachen Text “01 004”

01 = spiele Lied
001 = Lied 1, 002 = Lied 2,…
02 = spiele Ordner normal bspw. Hörbücher
001 = Ordner 1, 002 = Ordner 2, …
03 = spiele Ordner random, bspw. Kinderalbum
001 = Ordner 1, 002 = Ordner 2, …
04 = Steuerungsaktion
001 = pause, 002 = play, 003 = play/pause, 004 = lauter, 006 = ausschalten, 512 = Lautstärke auf 12,…

Dies kann ich dann im Sketch vorbereiten und muss nichtmehr an den Arduino ran, bei einer neuen Figur beschreibe ich dann den TAG mit “03 008”, schiebe auf die SD Karte den passenden Ordner und los geht es.

Bis jetzt habe ich mir die 10 ersten TAGs genommen, habe sie mit 1 bis 10 beschriftet um nicht durcheinander zu kommen und habe sie im Code vorbereitet, damit ich nicht nochmal an den Arduino muss wenn eine Figur dazu kommt.

Nun lese ich mich mal durch wie ich den TAG auslesen, und spalte. Bei Fragen melde ich mich in diesem Thread :roll_eyes:

EDIT: hier schon die erste Frage:
Macht es denn Sinn den Text mit 01 … zu beschreiben oder soll ich lieber HEX-Zahlen oder irgendwelche Zeichen nehmen, weil sie sich leichter zerpflücken lassen?

Damit hast du dir die Antwort schon selbst gegeben. Nimm eine Codierung, mit der du am Besten klar kommst und die für deine Verwendung sinnvoll ist.

raznz_snasna: Nun lese ich mich mal durch wie ich den TAG auslesen, und spalte. Bei Fragen melde ich mich in diesem Thread :roll_eyes:

Und weiter geht es.... die relevanten Teile sind angekommen, das Steckbrett ist voll und ich komme nicht weiter. Die Idee nichtmehr die UID auszulesen und zu vergleichen, sondern die Informationen welcher Befehl und welches Lied auf den TAG zu schreiben, gefällt mir einfach besser. Aber nun google ich mich zu tode und finde keine Möglichkeit diese Informationen auszulesen. Mit meinem Handy schreibe ich "01 009" auf den TAG und kann ihn damit auch wieder auslesen....

Das Internet ist voll mit Leuten die diesen Reader zur Zugangskontrolle zu nutzen, dort ist die UID gut zu nutzen. Die Beispiele der mfrc522.h bekomme ich nicht zum laufen

ReadAndWrite

Card UID: 04 08 2A DA AB 5C 81
PICC type: MIFARE Ultralight or Ultralight C
This sample only works with MIFARE Classic cards.

rfid_read_personal_data

**Card Detected:**
Card UID: 04 08 2A DA AB 5C 81
Card SAK: 00
PICC type: MIFARE Ultralight or Ultralight C
Name: Authentication failed: Timeout in communication.

rfid_write_personal_data

Write personal data on a MIFARE PICC 
Card UID: 04 08 2A DA AB 5C 81 PICC type: MIFARE Ultralight or Ultralight C
Type Family name, ending with #
[color=red]ScheisseHier#[/color]
PCD_Authenticate() failed: Timeout in communication.

Wieso kann die Welt nicht so einfach sein wie ich sie gerne hätte :(

Könnt ihr mir sagen wie der (wahrscheinlich einfache) Befehl den Datensatz eines RFID-Tags zu lesen ist?

Liebe Grüße aus Löberitz

Ich habe leider nicht wirklich viel Ahnung von den RFID-Readern, aber deine Meldung liest sich wie nicht kompatible Tags.

Hast du die originalen, mitgelieferten verwendet ?

Ich hatte mir alles einzeln zusammenbestellt. Konnt ja keiner Ahnen dass es schon wieder 12 Normen gibt die teilweise miteinander kompatibel sind. UID funktioniert ja tadellos.

MFRC 522

NTAG 213

Hallo, ab und an möchte ich euch hier noch auf dem Laufenden halten. Google und TryAndError haben mir nun die Vermutung bestätigt, dass der MFRC522 nicht in der Lage ist meine Wünsche zu erfüllen. Nun sind die PN532 auf dem Weg zu mir. Die sollen eine Menge mehr auf dem Kasten haben, u.a. im NDEF Format lesen und schreiben. Ich melde mich wenn es neues gibt.

Liebe Grüße Stefan

Hi

NFC und RFID sollten allerdings schon zwei unterschiedliche Paar Schuhe sein. Bin selber wohl kein Freund von NFC, da Das selbst meine Bank-Karte kann ... und wenn der Langfinger am anderen Ende meiner Hosentasche Das auch kann, mag ich Das wohl nicht mehr.

Bin gespannt, was Du Damit zusammen bekommst - meiner Meinung artet Das gerade etwas aus - wie mit Kanonen auf Spatzen zu werfen.

MfG

Mir fällt einfach keine leichtere Lösung ein. Wenn ich eine neue Figur baue, muss ich natürlich eine mp3 auf die sd des dfplayer schieben. Dann muss ich aber zusätzlich den Chip nach seiner UID fragen, diese in der IDE mit auflisten und ihm sagen was er bei dieser UID tun soll. Code natürlich hochladen. Ich denke es ist einfacher für mich, aber auch wenn ich an NichtArdiuinos verschenke, mit dem Handy dem Tag mit bspw. "01006" zu beschreiben, wenn die Box bei diesem TAG lied 6 spielen soll. Bis jetzt habe ich einfach 10 Tags "vorbelegt" und beschriftet. Auf lange Sicht soll aber auch möglich sein einen Ordner komplett zu spielen, als Vorlesegeschichte, oder Ordner im random zu spielen. Dann bin ich schon bei 30 vorbereiteten Tags. Eventuell noch einer der immer die Lautstärke auf 8 setzt, zum einschlafen bspw., und einer der immer 2 Schritte lauter macht.... Ich erhoffe mir dass ich diese Spielereien vorbereiten kann und nach Bedarf dann jedem Tag mit dem Handy sagen kann was er bewirken soll. Liebe Grüße

EDIT so bin ich auch flexibel bei "Updates" wenn mir noch etwas tolles einfällt. Dann muss ich nur einen Code ändern und auf 3 Geräte laden und keine Datenbank anlegen welche Box auf welche UIDs reagieren muss

HotSystems:
Nochmal.....du darfst keinen GND von elektronischen Modulen schalten.
Das bringt dir Probleme bishin zur Zerstörung der Teile.

Ich schau gleich mal nach einer Selbsthalteschaltung mit Transistoren, die sich bewährt hat und weniger Strom braucht.
Das mit GND schalten, solltest du dir abgewöhnen.

Z.B. diese hier:
Ein_Auto_Aus.png

Es geht aber wenns muss auch einfacher. :wink:
Z.B. den R1, R3, C1 und Q2 weglassen und den S1 über den Q1 (Source und Drain) setzen.

Vielen Dank HotSystems,
nach langer Zeit mal wieder etwas, was nach der ersten Löt-Runde funktioniert.

Deine Hinweise habe ich befolgt und für alle hier nachgezeichnet:

Selbsthaltung.png

void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(2, OUTPUT);
  digitalWrite(2,HIGH);
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   
  delay(1000);
  digitalWrite(LED_BUILTIN, LOW);
  delay(1000);
    digitalWrite(LED_BUILTIN, HIGH);  
  delay(1000);                    
  digitalWrite(LED_BUILTIN, LOW);  
  delay(1000);
    digitalWrite(LED_BUILTIN, HIGH);  
  delay(1000);   
  digitalWrite(LED_BUILTIN, LOW);
  delay(1000);
    digitalWrite(LED_BUILTIN, HIGH);  
  delay(1000);                  

  
  digitalWrite(2,LOW);
}

IMG_20200308_133154.jpg

Der Nano blinkt ein paar mal und schaltet sich selbst ab. Danke, eine kleine Hürde ist gemeistert.
Kann man mit einem Kondensator arbeiten um die "Einschaltzeit" zu verkürzen? Nun muss ich ja drücken bis der Nano den Ausgang auf High gesetzt hat, kann ich diese Zeit überbrücken?

Liebe Grüße
Stefan

Selbsthaltung.png

IMG_20200308_133154.jpg

Hallo Stefan,

freut mich, dass dir meine Schaltung weiter geholfen hat. Wenn du dir meine Schaltung nochmal anschaust, da ist genau das von dir beschriebene Problem mit Q2, R3 und C1 gelöst worden. Mit Elko und Widerstand kannst du die Zeit einstellen.

Ach danke Dieter.... Ich habe mir das damals schon angeschaut, da ich mir nicht die Zeit genommen habe mich dort einzudenken habe ich die 5 Sekunden als Zeit gedacht die man den Schalter drücken muss damit die schaltung frei gibt. Aber das scheint wohl anders zu laufen. Dann bestelle ich mal noch IRLML2502 und Elkos.... Auf die pn532 muss ich ja auch warten.... Danke dir

Ja, ok....evtl. nicht ausreichend erklärt worden.

ich konnte es nun nicht abwarten und habe mir einen PN 532 über Amazon bestellt.
Erste Versuche brachten nur Frust, aber nun bin ich schon nahe an meinem Erfolg. Natürlich geht es nicht ohne eure Hilfe :confused:

Mit das Adafruit Beispiel “ntag2xx_read” zum PN532 habe ich nun schon soweit, dass ich mir nurnoch die relevanten Daten hole. Hier nur der von mir geänderte Teil:

success = nfc.ntag2xx_ReadPage(7, data);
        
        // Display the current page number
        Serial.print("PAGE ");
        
          Serial.print("0");
          Serial.print(7);
        
        Serial.print(": ");

        // Display the results, depending on 'success'
        if (success) 
        {
          // Dump the page data
          nfc.PrintHex(data, 4);
        }
        else
        {
          Serial.println("Unable to read the requested page!");
        }success = nfc.ntag2xx_ReadPage(8, data);
        
        // Display the current page number
        Serial.print("PAGE ");

          Serial.print("0");
          Serial.print(8);

        Serial.print(": ");

        // Display the results, depending on 'success'
        if (success) 
        {
          // Dump the page data
          nfc.PrintHex(data, 4);
        }
        else
        {
          Serial.println("Unable to read the requested page!");
        }

anstatt

for (uint8_t i = 0; i < 42; i++) 
      {
        success = nfc.ntag2xx_ReadPage(i, data);
        
        // Display the current page number
        Serial.print("PAGE ");
        if (i < 10)
        {
          Serial.print("0");
          Serial.print(i);
        }
        else
        {
          Serial.print(i);
        }
        Serial.print(": ");

        // Display the results, depending on 'success'
        if (success) 
        {
          // Dump the page data
          nfc.PrintHexChar(data, 4);
        }
        else
        {
          Serial.println("Unable to read the requested page!");
        }

In diesen Beiden Bytes stehen meine relevanten Daten.

Ich habe mit meinem Handy und der App “NFC Tools” den Text “99999” auf den NFC Tag geschrieben.

Mit diesen beiden Bytes bringt der serielle Monitor nun :

Seems to be an NTAG2xx tag (7 byte UID)
PAGE 07: 0x65 0x6E 0x39 0x39
PAGE 08: 0x39 0x39 0x39 0xFE

0x39 entspricht meiner 9 als Text.

Jetzt bin ich dabei diese 9 in eine Variable zu ziehen. Mit nfc.PrintHex(data,4) bzw. nfc.PrintHexChar(data,4) bekomme ich es aber nur auf den seriellen Monitor, kann es aber nicht in einer Variable zerlegen um irgendwann an meine blanke Zahl 9 zu kommen.

In der Bibliothek Adafruit_PN532 habe ich zwar die Zeilen

 // Help functions to display formatted text
  static void PrintHex(const byte *data, const uint32_t numBytes);
  static void PrintHexChar(const byte *pbtData, const uint32_t numBytes);

gefunden, aber damit kann ich einfach absolut nichts anfangen.

Liebe Grüße und Danke für eure Zeit

Aha, die .cpp Datei hat mich doch da ein ganzes Stück weiter gebracht.

Nun bin ich soweit, dass ich mit einer App auf dem Handy "03232" als Text auf den Tag schreibe und der Arduino spuckt mir "Befehl:03, Parameter: 232" aus. Dies soll mal bedeuten "Spiele Ordner 232 in zufälliger Wiedergabe"

Hier die Entscheidenden Zeilen dazu:

if (success)
      {
        // Dump the page data
        nfc.PrintHexChar(data, 4);
        Befehl = (data[2]-48) * 10 + (data[3]-48);
        Serial.print("Befehl: ");
        Serial.println(Befehl);

      }
      else
      {
        Serial.println("Unable to read the requested page!");
      } 
      
      success = nfc.ntag2xx_ReadPage(8, data);

      // Display the current page number
      Serial.print("PAGE ");

      Serial.print("0");
      Serial.print(8);

      Serial.print(": ");

      // Display the results, depending on 'success'
      if (success)
      {
        // Dump the page data
        nfc.PrintHexChar(data, 4);
        Parameter = (data[0]-48) * 100 + (data[1]-48) * 10 + (data[2]-48);
        Serial.print("Parameter: ");
        Serial.println(Parameter);

      }
      else
      {
        Serial.println("Unable to read the requested page!");
      }

Die "-48" nutze ich um von der Text-Neun auf die Zahlen-Neun zu kommen. Sicher gibt es da eine schönere Variante, aber diese ist meine Idee, die begreife ich und sie funktioniert.

Nun kann ich mich endlich daran setzen die alte Version um den pn532 zu tauschen und die programmierbaren Tags einzupflegen.

Ich halte euch auf dem Laufenden.

raznz_snasna: Die "-48" nutze ich um von der Text-Neun auf die Zahlen-Neun zu kommen. Sicher gibt es da eine schönere Variante, aber diese ist meine Idee, die begreife ich und sie funktioniert.

Das ist der durchaus übliche Weg, um von einem Ziffernzeichen auf die Ziffer zu kommen.

Gruß Tommy

Hi

Die -48 ist Nichts Anderes, als von dem Zahlzeichen (0...9) den ASCII-Wert des Zeichen für die Null abzuziehen. So wird aus dem Zeichen 0 der Wert Null. Aus dem Zeichen 1 der Wert Eins.

Normal wird Das aber auch so geschrieben: wert=zeichen-'0'; Das '0' wird vom Kompiler zu 0x30 oder 48 Dezimal - Mehr ist Das nicht. 7 über der 9 steht das A - wenn's um hexadezimale Eingaben geht, vll. wissenswert ;)

MfG

postmaster-ino: Hi

Die -48 ist Nichts Anderes, als von dem Zahlzeichen (0...9) den ASCII-Wert des Zeichen für die Null abzuziehen. So wird aus dem Zeichen 0 der Wert Null. Aus dem Zeichen 1 der Wert Eins.

Normal wird Das aber auch so geschrieben: wert=zeichen-'0'; Das '0' wird vom Kompiler zu 0x30 oder 48 Dezimal - Mehr ist Das nicht. 7 über der 9 steht das A - wenn's um hexadezimale Eingaben geht, vll. wissenswert ;)

MfG

Das finde ich schöner, habe ich im Code schon angepasst.

Hallo Leute.
Die Codes habe ich nun mit Buchstaben und Zahlen gemacht, danke für die Idee.

Hier mal der gesamte Sketch:

#include <SPI.h>
#include <EEPROM.h>
#include <Adafruit_PN532.h>
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

#define PN532_SCK  (2)
#define PN532_MOSI (3)
#define PN532_SS   (4)
#define PN532_MISO (5)

Adafruit_PN532 nfc(PN532_SCK, PN532_MISO, PN532_MOSI, PN532_SS);

SoftwareSerial mySoftwareSerial(6, 7); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

bool musikLaeuft = LOW;   //um StandbyAbschaltung zu verhindern
bool aus = LOW;           //SelbstmordBefehl
long standby = 1;
long ruhezeit = 90000;    //Abschaltung nach ms

uint16_t Befehl;
uint16_t Parameter;
uint16_t BefehlAlt;
uint16_t ParameterAlt;

void setup() {


  pinMode(13, OUTPUT);  //kontroll LED
  pinMode(8, OUTPUT);   //Selbstmord

  digitalWrite(8, HIGH);
  digitalWrite(13, HIGH);

  standby = ruhezeit;

  Serial.begin(115200); 
  
  mySoftwareSerial.begin(9600);

  Serial.println();
  Serial.println(F("PhonieBox startet"));

  if (!myDFPlayer.begin(mySoftwareSerial)) {
    Serial.println(F("Start nicht möglich:"));

  }
  Serial.println(F("DFPlayer Mini ist startbereit."));
  myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);                  //SD Karte als Quelle
  if (EEPROM.read(0) != 0 ) myDFPlayer.volume(EEPROM.read(0));  //Start-Lautstärke aus dem EEPOROM, wenn nicht 0

  Serial.println("PN532 starten");

  nfc.begin();

  uint32_t versiondata = nfc.getFirmwareVersion();
  if (! versiondata) {
    Serial.print("PN5... Board nicht gefunden");
    while (1); // Abbruch
  }

  Serial.print("PN5... gefunden"); Serial.println((versiondata >> 24) & 0xFF, HEX);
  Serial.print("Firmware ver. "); Serial.print((versiondata >> 16) & 0xFF, DEC);
  Serial.print('.'); Serial.println((versiondata >> 8) & 0xFF, DEC);

  nfc.SAMConfig();

  Serial.println("Warte auf einen ISO14443A Tag ...");
}


void loop() {

  uint8_t success;
  uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };  // Buffer to store the returned UID
  uint8_t uidLength;                        // Length of the UID (4 or 7 bytes depending on ISO14443A card type)





  if (millis() % 1000 <= 10 ) {                  //etwa jede Sekunde mal schauen ob die Musik läuft  und welcher TAG aufliegt
    // Serial.println(myDFPlayer.readState());

    if (myDFPlayer.readState() == 513) {
      musikLaeuft = HIGH;
      // Serial.println("Musik laeuft");
    }
    else {
      musikLaeuft = LOW;
      //Serial.println("Musik aus");
    }
    // Serial.println(musikLaeuft);


    // Wait for an NTAG203 card.  When one is found 'uid' will be populated with
    // the UID, and uidLength will indicate the size of the UUID (normally 7)
    success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);

    if (success) {    //Wenn er einen neuen Tag erkannt hat


      uint8_t data[32];

      success = nfc.ntag2xx_ReadPage(7, data); //lese den Block 7

      if (success)
      {
        Befehl = data[2] * 100 + data[3]; // hole dir aus Block 7 die Daten zur Berechnung des Befehls
        Serial.print("Befehl: ");
        Serial.println(Befehl);
      }
      else
      {
        Serial.println("Block 7 konnte nicht gelesen werden");
      }

      success = nfc.ntag2xx_ReadPage(8, data); //lese den Block 8

      if (success)
      {
        // Dump the page data
        nfc.PrintHexChar(data, 4);
        Parameter = (data[0] - '0') * 100 + (data[1] - '0') * 10 + (data[2] - '0'); //hole dir aus Block 8 die Daten zur Berechnung des Parameters
        Serial.print("Parameter: ");
        Serial.println(Parameter);

      }
      else
      {
        Serial.println("Block 8 konnte nicht gelesen werden");
      }
    }
  }


  if (Befehl == BefehlAlt && Parameter == ParameterAlt) {

  }
  else
  {
    switch (Befehl) {
      case 6976:                                  //"EL" = EinzelLied
        myDFPlayer.play(Parameter);               // Bsp: "EL026" spielt Lied 26
        Serial.print("Spiele Einzellied: ");
        Serial.println(Parameter);
        break;

      case 7978:                                  //"ON" = Ordner Normal
        myDFPlayer.playMp3Folder(Parameter);      // Bsp: "ON003" spielt den Ordner 3 hintereinander weg
        //hintereinander spielen
        Serial.print("Spiele Normalordner: ");
        Serial.println(Parameter);
        break;

      case 7990:                                  //"OZ" = Ordner im Zufall
        myDFPlayer.playMp3Folder(Parameter);      // Bsp: "OZ005" spielz Ordner 5 durcheinander
        //random einstellen
        Serial.print("Spiele Randomordner: ");
        Serial.println(Parameter);
        break;

      case 7683:                                  //"LS" = Lautstärke
        switch (Parameter) {
          case 100 ... 130:                       //100-130 = aktuelle Lautstärke auf 0-30 setzen
            myDFPlayer.volume(Parameter - 100);   // Bsp: "LS113" setzt die aktuelle Lautstärke auf 13
            Serial.print("Setze Normallautstärke: ");
            Serial.println(Parameter);
            break;

          case 200 ... 230:                       //200 = Lautstärke bleibt wie beim ausschalten
            EEPROM.write(0, Parameter - 200);     //201-230 = Startlautstärke auf 1-30 setzen
            Serial.print("Setze EEPROM Lautstärke: ");//"LS200" lässt die Lautstärke vom letzten mal
            Serial.println(EEPROM.read(0));           // Bsp:"LS215" beginnt nach jedem Neustart mit Lautstärke 15
            break;


          case 1:                                 //001 = ein Schritt leiser
            myDFPlayer.volumeDown();              // "LS001"
            Serial.println("eins leiser");
            break;

          case 2:                                 //002 = ein Schritt lauter
            myDFPlayer.volumeUp();     // "LS002"
            Serial.println("eins leiser");
            break;
        }
        break;

      case 8779:                                  //"WO" Wiedergabe Optionen
        switch (Parameter) {
          case 1:                                 //1 = Play
            myDFPlayer.start();             // "WO001"
            Serial.println("Play");
            break;

          case 2:                                 //2 = Pause
            myDFPlayer.pause();           // "WO002"
            Serial.println("Pause");
            break;

          case 3:                                 //3 = Wechsel
            if (myDFPlayer.readState() == 513) {  //"WO003"  war Pause, wird gespielt, wurde gespielt kommt Pause
              myDFPlayer.pause();
            }
            else {
              myDFPlayer.start();
            }
            Serial.println("Wiedergabewechsel");
            break;

          case 4:                                 //4 = vorheriges Lied
            myDFPlayer.previous();       //"WO004"
            Serial.println("vorheriges Lied");
            break;

          case 5:                                 //5 = nächstes Lied
            myDFPlayer.next();             //"WO005"
            Serial.println("nächstes Lied");
            break;
        }
        break;

      case 8377:                                  //"SM" = Selbstmord
        aus == true;                              //"SM000"
        Serial.println("Selbstmord");
        break;
    }

    BefehlAlt = Befehl;
    ParameterAlt = Parameter;
  }
  if (musikLaeuft) (standby = millis() + ruhezeit);           // Wenn die Musik läuft, kann "Ruhezeit" ausgeschalten werden.

  if (millis() >= standby) (aus = HIGH);                     // Lief die Musik "Ruhezeit" nicht, wird der Strom genommen

  if (aus) {
    Serial.println("ich schalte nun aus");
    myDFPlayer.pause();
    delay(200);
    digitalWrite(13, LOW);
    delay(10000);
    standby = millis() + ruhezeit;
    aus = LOW;
  }

Nun meine 2 Fragen:
In der Praxis ist es absolut ausreichend jede Sekunde mal zu schauen ob ein neuer Tag aufgesetzt wurde.
Ist es zu häufig für den Sensor oder verträgt er das auch auf dauer?

Dann sitze ich jetzt dran ein Layout für die ganze Geschichte zu bauen. Die Beispiele geben mir

// define the pins for SPI communication.
#define PN532_SCK  (2)
#define PN532_MOSI (3)
#define PN532_SS   (4)
#define PN532_MISO (5)

und

SoftwareSerial mySoftwareSerial(6, 7); // RX, TX

vor. Es funktioniert ja auch mit anderen Pins. Bin ich denn da uneingeschränkt? Kann ich alle Ds vom Nano nehmen oder gibt es da Pins die nicht zu empfehlen sind? Oder kann ich sogar auch auf die As umschwenken?

Danke euch

Liebe Grüße
Stefan

Wie kommst du auf die SPI-Pins (2 - 5) ?

SPI liegt auf den Pins 10 - 13 beim Uno bzw. Nano.

Die Pins für SoftwareSerial kanns du auf beliebige digitale Pins legen.
Beim Nano geht auch A0 - A5.

Die 2-5 ist im Beispiel ntag2xx_read so vorgegeben und funktioniert auch.

Aber kann ich dann anpassen und Software serial nehme ich auf die As, dann sind sie auf der anderen Seite.