MFRC 522 hört nach einer Zeit auf zu funktionieren

Hallo liebes Forum,
ich habe einen Nano 33 IOT an welchem ein RFID Reader angeschlossen ist und mit der MFRC522 Bibliothek funktionert.

Leider hört der Reader manchmal einfach auf Karten zu lesen (manchmal nach ner halben Stunde manchmal von Beginn an) ich kann das Problem nicht ganz einordnen.
Die Loop an sich in der das Programm läuft funktioniert noch nur passiert absolut nichts wenn man eine Karte auf den Reader legt (egal welche).

Vielleicht habt ihr ja eine Idee wie ich das Problem eingrenzen/reproduzieren könnte oder woran es liegen kann.

Anbei ist mein Programm Code.

Viele Grüße Alex

#include <SPI.h>
#include <WiFiNINA.h>
#include "arduino_secrets.h"
#include <MFRC522.h>
#define RST_PIN 9
#define SS_PIN 10
#define button 5
boolean buttonState;
boolean oldState; 

MFRC522 mfrc522(SS_PIN, RST_PIN);


///////please enter your sensitive data in the Secret tab/arduino_secrets.h
char ssid[] = SECRET_SSID;    // your network SSID (name)
char pass[] = SECRET_PASS;    // your network password (use for WPA, or use as key for WEP)
char str[56] = "";
char mID[3] ="00"; // 00 = Mastercontroller
char Ausgabe[17] ="";

boolean LED = false;

WiFiClient client;
WiFiSSLClient sclient;

IPAddress server(192,168,0,110);

int status = WL_IDLE_STATUS;     // the WiFi radio's status


void setup() {
  // Initialize serial and wait for port to open:
   Serial.begin(9600);
 
   pinMode(button,INPUT_PULLUP);
   buttonState = digitalRead(button); 
   oldState = buttonState; //damit der Shelly nicht ausgeschaltet wird wenn der Arduino neu startet
   
   SPI.begin();
   mfrc522.PCD_Init();
   mfrc522.PCD_DumpVersionToSerial(); //Details des Lesegerätes ausgeben
   Serial.println(F("Scan PICC to see UID, type, and data blocks..."));
   // wait for serial port to connect. Needed for native USB port only
  
   pinMode(6, OUTPUT);
   // check for the WiFi module:
  
  if (WiFi.status() == WL_NO_MODULE) {
    Serial.println("Communication with WiFi module failed!");
    // don't continue
    while (true);
  }

  String fv = WiFi.firmwareVersion();
  if (fv < WIFI_FIRMWARE_LATEST_VERSION) {
    Serial.println("Please upgrade the firmware");
  }

  // attempt to connect to WiFi network:
  while ( status != WL_CONNECTED) {
    Serial.print("Attempting to connect to WPA SSID: ");
    Serial.println(ssid);
    // Connect to WPA/WPA2 network:
    status = WiFi.begin(ssid, pass);

    // wait 10 seconds for connection:
    delay(10000);
  }

  // you're connected now, so print out the data:
  Serial.println("You're connected to the network");
  printCurrentNet();
  printWiFiData();
  
}

void loop() {
digitalWrite(6, LOW);
  
   buttonState = digitalRead(button);
   if (buttonState != oldState){
        httpRequestClear();
    oldState = buttonState;
   }
   
  
    while (client.available()) {
       char c = client.read();
      // Serial.write(c);
     }


  Seruial.println(mfrc.ui
  //Suche nach neuen Karten
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
  return;
  }
  if ( ! mfrc522.PICC_ReadCardSerial()) {
  return;
  }

  
  //Informationsabruf des RFID-Gerätes

  mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
  
  array_to_string(mfrc522.uid.uidByte, 7, str); //Insert (byte array, length, char array for output)
  
  Serial.println(str);
  
  for(int i = 0; i <14; i++){
    Ausgabe[i] = str[i];
  }
  
  Ausgabe[14] = mID[0];
  Ausgabe[15] = mID[1];
  Serial.println(Ausgabe);
  httpRequest();

}

void httpRequest() {
  // close any connection before send a new request.
  // This will free the socket on the Nina module
  ;
  client.stop();

  // if there's a successful connection:
  if (client.connect(server, 5005)) {   
    Serial.println("connecting...");
    client.print(Ausgabe); 
    digitalWrite(6, HIGH);   
  } 
  else {   
    // if you couldn't make a connection:
    Serial.println("connection failed");  
  }
}

void httpRequestClear() {
  // close any connection before send a new request.
  // This will free the socket on the Nina module
  ;
  client.stop();

  // if there's a successful connection:
  if (client.connect(server, 5005)) {   
    Serial.println("connecting...");
    client.print("0000000000000000"); 
    digitalWrite(6, HIGH);   
  } 
  else {   
    // if you couldn't make a connection:
    Serial.println("connection failed");  
  }
}
void printWiFiData() {
  // print your board's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP address : ");
  Serial.println(ip);

  Serial.print("Subnet mask: ");
  Serial.println((IPAddress)WiFi.subnetMask());

  Serial.print("Gateway IP : ");
  Serial.println((IPAddress)WiFi.gatewayIP());

  // print your MAC address:
  byte mac[6];
  WiFi.macAddress(mac);
  Serial.print("MAC address: ");
  printMacAddress(mac);
}

void printCurrentNet() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print the MAC address of the router you're attached to:
  byte bssid[6];
  WiFi.BSSID(bssid);
  Serial.print("BSSID: ");
  printMacAddress(bssid);
  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI): ");
  Serial.println(rssi);

  // print the encryption type:
  byte encryption = WiFi.encryptionType();
  Serial.print("Encryption Type: ");
  Serial.println(encryption, HEX);
  Serial.println();
}

void printMacAddress(byte mac[]) {
  for (int i = 5; i >= 0; i--) {
    if (mac[i] < 16) {
      Serial.print("0");
    }
    Serial.print(mac[i], HEX);
    if (i > 0) {
      Serial.print(":");
    }
  }
  Serial.println();
}

void array_to_string(byte array[], unsigned int len, char buffer[]){
   for (unsigned int i = 0; i < len; i++){
      byte nib1 = (array[i] >> 4) & 0x0F;
      byte nib2 = (array[i] >> 0) & 0x0F;
      buffer[i*2+0] = nib1  < 0xA ? '0' + nib1  : 'A' + nib1  - 0xA;
      buffer[i*2+1] = nib2  < 0xA ? '0' + nib2  : 'A' + nib2  - 0xA;
   }
   buffer[len*2] = '\0';
}

(deleted)

Hallo Peter da hast du wohl was falsch verstanden, der Sketch bleibt nicht stehen er läuft weiter.
Ich kann weiterhin den Knopf drücken um eine HTTP Request zu senden und kriege auch eine Ausgabe im Serial Monitor.

Der RFID Reader erkennt einfach irgendwann keine Karte mehr und zeigt dementsprechend nichts mehr an. (als ob die SPI Verbindung oder irgendwie so etwas nicht mehr funktioniert)

alex3480:
....
Der RFID Reader erkennt einfach irgendwann keine Karte mehr und zeigt dementsprechend nichts mehr an. (als ob die SPI Verbindung oder irgendwie so etwas nicht mehr funktioniert)

Was unternimmst du, damit der Reader wieder funktioniert ?
Poste bitte mal ein Schaltbild, wie du den Reader angeschlossen hast.

lass die LED_BUILTIN blinken, wenn der Sketch durch die LOOP rast.

Das würde auch gar nicht funktionieren.

(als ob die SPI Verbindung oder irgendwie so etwas nicht mehr funktioniert)

Das kannst du testen, indem du dir ab und zu mal die Reader Version ausgeben lässt.
Zumindest siehst du so, ob der Reader noch reagiert.

Evtl hilfreich: Ein Logikanalysator

Damit der Reader wie funktioniert trenne ich entweder den USB Stecker vom Arduino oder lade den Sketch neu hoch.
verkabelt ist es so wie auf dem Bild hier:

(deleted)

"Das kannst du testen, indem du dir ab und zu mal die Reader Version ausgeben lässt.
Zumindest siehst du so, ob der Reader noch reagiert."

Blöde frage wie mache ich das?

Peter-CAD-HST:
Warum nicht?

:o :o :o :o :o :o :o :o :o :o

LED_BULITIN wird durch SPI.begin() von "deiner" Erreichbarkeit abgeschnitten.

:smiling_imp: :smiling_imp: :smiling_imp: :smiling_imp: :smiling_imp:


Blöde frage wie mache ich das?

:disappointed_relieved:

void loop()
{
    INTERVAL(2000) mfrc522.PCD_DumpVersionToSerial(); //Details des Lesegerätes ausgeben

// weiter, wie gehabt.

ungetestet

INTERVAL

(deleted)

Die Ausgabe funktioniert so leider nicht, die Version zeigt er mir dann nur doppelt an wenn ich wieder ne Karte drauf lege.
edit:
mein Fehler funktioniert wohl ich schau mal ob ich den Fehler reproduziert kriege.

alex3480:
Damit der Reader wie funktioniert trenne ich entweder den USB Stecker vom Arduino oder lade den Sketch neu hoch.
verkabelt ist es so wie auf dem Bild hier:

Das Bild auf eine externe Seite zu Laden, ist eine schlechte Idee.
Da ist das Bild kurzfristig verschwunden und der Zusammenhang hier ebenso.

Hast du schon mal ein einfaches Beispiel aus der Library getestet und macht das auch diesen Fehler ?

Die Schaltung sieht aber ok aus.
Wenn du in deine Sketch selbst keinen Hänger feststellen kannst, vermute ich einen Defekt am RFID-Reader.

Ich hab jetzt mal mehrere von den Readern mit Arduinos über Nacht an der 5V Stromversorgung laufen lassen (Später sollen die permanent laufen).

Nach einem Tag haben noch beide ohne Probleme funktioniert, jetzt heute am zweiten Tag hat einer der beiden Reader auch aufgehört Karten zu lesen. (War diesmal nicht der gleiche wie beim ersten Mal)

Aus diesem Grund komme ich zu folgender Erkenntnis:

-> Es liegt nicht an der Verkabelung / Wackelkontakten
-> Es liegt nicht am RFID Reader (Sind sowieso schon eher die besseren)

Da das Sketch wie bereits erwähnt noch läuft vermute ich dass es sich um ein Problem mit der SPI Verbindung oder der MFRC522 Bibliothek handelt.

Da später mal ziemlich viele von diesen Readern dauerhaft laufen sollen und es nicht praktikabel ist jeden Tag von jedem der nicht läuft den Stecker zu ziehen muss ich das Problem irgendwie beheben.

Meine bisherige quick und dirty Variante wäre es herauszufinden wann genau der RFID Reader nicht mehr funktioniert und dann den Arduino einfach neu zu starten mittels Watchdogs.

Jetzt ist die Frage wie kriege ich von der Software Seite her raus ob der Reader nicht mehr läuft?
Es ist mir bisher leider nicht möglich den Arduino über mehrere Tage am PC laufen zu lassen um mir ggf. im Serial monitor mir anzeigen zu lassen was von der Software Seite her nicht mehr funktioniert wenn der Reader sich verabschiedet hat.

Auf gut Glück wäre mein vorgehen jetzt:
Watchdog Timer auf 8 Sekunden
alle 6 Sekunden die aktuelle Version vom Reader abfragen und falls eine Antwort kommt watch dogs resetten?

Habt ihr ggf. noch ne bessere Idee oder eine Ahnung wo man das Problem an der Wurzel beheben könnte?
Oder ob ich statt der Versionsabfrage eher was anderes abfragen soll um zu schauen ob der Reader noch läuft.
(bin mir halt momentan nicht sicher und kann es auch nicht überprüfen ob sich die Version noch abfragen lässt wenn der reader mal keine Lust hat)

Viele Grüße
Alexander

(deleted)

Hi Peter das ist eine gute Idee das werde ich versuchen umzusetzen.
Anderes Problem:

Auf dem verwendeten Arduino Nano 33 IOT läuft gar kein Watchdog gibt's da ne andere Möglichkeit?
Arduino per Befehl restarten oder ggf. nur den gesamten MFRC522 kram hat da jemand vielleicht ne Idee?

Vielleicht hilft das noch jemanden mir zu helfen ist mir auch erst gerade aufgefallen:

Wenn ich irgendwas am Code ändere und ihn neu hochlade läuft der RFID reader nicht ich muss erst den USB Anschluss ein und ausstecken bevor der reader wieder funktioniert das passiert aber auch nur manchmal ???

Manchmal läuft er auch wieder wenn ich nur den Code neu hochlade..

Bin dezent verwirrt.

alex3480:
Vielleicht hilft das noch jemanden mir zu helfen ist mir auch erst gerade aufgefallen:

Wenn ich irgendwas am Code ändere und ihn neu hochlade läuft der RFID reader nicht ich muss erst den USB Anschluss ein und ausstecken bevor der reader wieder funktioniert das passiert aber auch nur manchmal ???

Manchmal läuft er auch wieder wenn ich nur den Code neu hochlade..

Bin dezent verwirrt.

Hast du einen Uno, um den Reader daran zu testen ?

Ich werde die Tage mal versuchen ein ganz einfaches Programm zu schreiben nur um dieses Problem zu fixen nen normalen UNO bzw . Mega oder so habe ich auch noch.

Wenn ich den RST Pin des RFID Readers zu beginn auf LOW setze muss ich übrigens nicht den USB Stecker ziehen, das wäre schon einmal ne möglichkeit den das RFID Modul zu resetten denke ich.

Jetzt muss ich nur noch rauskriegen wann es nicht mehr läuft.

alex3480:
Ich werde die Tage mal versuchen ein ganz einfaches Programm zu schreiben nur um dieses Problem zu fixen nen normalen UNO bzw . Mega oder so habe ich auch noch.

Ein Beispielsketch aus der der Library sollte es doch auch tun.