Problema lettura con RC522

Ciao a tutti,
sto usando questo RC522 con arduino Pro Mini, ho fatto tutte le connessioni e per provarlo ho usato questo interessante codice os che trovate qui: http://webingenerale.com/index.php/articoli-e-giude/item/37-apriporta-rfid-con-arduino-versione-modificata.
Il led pin 4 funziona, il problema è che non riesco a laggere le schede con l'RC522, il serial monitor rimane su "in attesa di lettura..."
Ho ricontrollato le connessioni e mi sembrano corrette rispetto al codice che uso, non capisco dove sbaglio.

Grazie a tutti
Saluti

Do per scontato che il programma sia funzionante e che tu lo abbia copiato esattamente.
Ogni volta che avvicini un RFID al lettore il programma dovrebbe indicare la cosa.
Se non lo fa, assicurati di aver inserito il TUO codice della carta che vuoi usare come Master nella stringa che lo identifica
String CardMaster="1A2B3C4D"; // stringa ASCII del numero esadecimale della carta Es 2882400016 (dec) = ABCDEF10 (esa)
Evidentemente tale codice dovresti averlo letto preventivamente con il programma che sicuramente ti è stato fornito con il lettore.
Poi esegui un reset premendo il pulsante collegato ad A0.

cyberhs:
Do per scontato che il programma sia funzionante e che tu lo abbia copiato esattamente.
Ogni volta che avvicini un RFID al lettore il programma dovrebbe indicare la cosa.
Se non lo fa, assicurati di aver inserito il TUO codice della carta che vuoi usare come Master nella stringa che lo identifica
String CardMaster="1A2B3C4D"; // stringa ASCII del numero esadecimale della carta Es 2882400016 (dec) = ABCDEF10 (esa)
Evidentemente tale codice dovresti averlo letto preventivamente con il programma che sicuramente ti è stato fornito con il lettore.
Poi esegui un reset premendo il pulsante collegato ad A0.

Avevi ragione, come avevo immaginato era una sciocchezza, avevo scritto male il codice della carta master, grazie!

Un altra cosa, nel codice ho questa parte:

void loop() {
  
  // scansione lettore ogni "interval" in mS ---------------------
 unsigned long currentMillis = millis();

E le variabili sono specificate cosi:

long previousMillis = 0;
long previousMillis1 = 0;
long interval = 0;     // intervallo lettura RFID

Non riesco a capire dove specifica i ms di lettura, empiricamente impiegherà 3 sec ogni lettura, io vorrei che la lettura fosse continua così da lasciare il relè sempre aperto con la scheda presente...

Grazie ancora! :slight_smile:

Veramente nella versione originale "interval" vale 10 ms.
E' nel tuo codice che hai azzerato la variabile.
Io porterei la variabile a 100 ms: 10 letture al secondo mi paiono più che sufficienti

cyberhs:
Veramente nella versione originale "interval" vale 10 ms.
E' nel tuo codice che hai azzerato la variabile.
Io porterei la variabile a 100 ms: 10 letture al secondo mi paiono più che sufficienti

Scusa il ritardo, ho impostato il valore 100ms ma per renderli effettivi ho dovuto togliere i delay del relè nel codice:

void openDoor(){
  
  digitalWrite(attiva_rele, HIGH);
  digitalWrite(attiva_led, HIGH);
  // Serial.println("Rele ON");
  delay(attiva_temporele);
  digitalWrite(attiva_rele, LOW);
  digitalWrite(attiva_led, LOW);
  // Serial.println("Rele OFF");
  delay(3500);
}

Altrimenti continuava giustamente ad applicare il ritardo ogni attivazione.
In realtà a me fa comodo non averli e fare una lettura ripetuta in cerca della scheda in quanto vorrei che il relè rimanesse attivo fino a quando è presente la scheda autorizzata in eeprom con il metodo a inizio codice, qualche consiglio su come attuare questa istruzione?

Grazie

Magari puoi ottenere qualcosa di simile aumentando il ritardo attiva_temporele: non mi piace pensare al solenoide dell'apriporta (scalda parecchio!) attivo per lunghi periodi,

cyberhs:
Magari puoi ottenere qualcosa di simile aumentando il ritardo attiva_temporele: non mi piace pensare al solenoide dell'apriporta (scalda parecchio!) attivo per lunghi periodi,

Il mio non è un apri porta è un applicazione simile ma ho un relè alimentato a 5v che apre e chiude un circuito in cui passa relativamente poca corrente, di certo non 220v.
Stavo pensando una soluzione transistor switch al posto del relè...
Non mi piace l'idea di allungare il delay, perché prima o poi deve terminare, invece voglio che rimanga chiuso fino a quando la scheda autorizzata è presente sul lettore..
Il mio quesito principale ora è proprio quello del codice, di come introdurre questa chiusura circuito (o eccitamento relè) continuo fino a che la card è presente.

Saluti

All'interno del loop(), dopo la serie di controlli per la card master, c'è il ciclo di scansione dei codici conosciuti e, se viene trovato un codice già esistente, il relè ed il relativo LED vengono attivati per il tempo "attiva_temporele".
Se invece fai due routine Open (che si limita ad attivare il relè) e Close (che lo disattiva) e inserisci quest'ultima alla fine del ciclo nell'else che fa apparire il messaggio "Accesso vietato", dovresti ottenere ciò che desideri.

for (int i = 0; i < pch; i++){
       if(uidRFID[i] == uid_s){
            Serial.println("Accesso consentito");
            openDoor();
            controllo = true;
            break;
         }
       }
     ...

cyberhs:
All'interno del loop(), dopo la serie di controlli per la card master, c'è il ciclo di scansione dei codici conosciuti e, se viene trovato un codice già esistente, il relè ed il relativo LED vengono attivati per il tempo "attiva_temporele".
Se invece fai due routine Open (che si limita ad attivare il relè) e Close (che lo disattiva) e inserisci quest'ultima alla fine del ciclo nell'else che fa apparire il messaggio "Accesso vietato", dovresti ottenere ciò che desideri.

Ho creato, come hai consigliato due Void "close" e "open" che vado a richiamare nell'else e funziona bennissimo per l'interruzione del relè, grazie! :wink: Problema risolto a metà però in quanto l'attivazione, essendo nel loop della lettura e dell'"accesso consentito", me la ritrovo a impulso proporzionale al tempo di lettura in ms impostato e non fissa come vorrei... non riesco a venirci a capo.

Saluti