Sketch per rfid-rc522

ciao ragazzi. vorrei farvi una domandina.
ho comprato e provato un modulo rfid ma mi sono accorto che in pratica mi blocca tutto il resto dello sketch ed esegue solo quello nella fuzione openDoor(). Nello sketch ho aggiunto un semplice digitalWrite all’interno del void loop() ma non lo esegue mai.
in pratica non posso utilizzarela arduino in questo modo… è una cosa normale?

ecco lo sketch:

#include <SPI.h>
#include <MFRC522.h>
 
#define SS_PIN 53
#define RST_PIN 5
 
MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.
 
long previousMillis = 0;
long interval = 10;
 int led=27;
int rele = 25;  //pin relè
 
String uidRFID[] = {"7e485d23","69e4971a","codeRFID_C","codeRFID_D"};
 
 
void setup() {
     
        
        Serial.begin(9600); // Initialize serial communications with the PC
    SPI.begin();        // Init SPI bus
    mfrc522.PCD_Init(); // Init MFRC522 card
        pinMode(rele, OUTPUT);
    Serial.println("Ingresso Aziendale");
        Serial.println("RFID registrati n° --> "+String(sizeof(uidRFID)/sizeof(String)));
        Serial.println("In attesa di lettura...");

      pinMode(led, OUTPUT);
}
 
void loop() {
 
  unsigned long currentMillis = millis();
    
  if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis; 
     
      // Look for new cards
    if ( ! mfrc522.PICC_IsNewCardPresent()) {
        return;
    }
 
    // Select one of the cards
    if ( ! mfrc522.PICC_ReadCardSerial()) {
        return;
    }
 
String uid_s = "";
 
if (!mfrc522.PICC_IsNewCardPresent() && !mfrc522.PICC_ReadCardSerial()) {
   
    for (byte i = 0; i < mfrc522.uid.size; i++) {
         
        String uid_a = String(mfrc522.uid.uidByte[i] < 0x10 ? "0" : "");
        String uid_b = String(mfrc522.uid.uidByte[i], HEX);
           
        uid_s = uid_s+uid_a+uid_b;
          
 
    }
  }
   
  Serial.print("RFID UID rivelato --> ");
  Serial.println(uid_s);
  Serial.println("");
  boolean controllo = false;
  for (int i = 0; i < sizeof(uidRFID)/sizeof(String); i++){
   
    if(uidRFID[i] == uid_s){
      
            Serial.println("Accesso consentito");
            openDoor();
            controllo = true;
            break;
             
      }
    }
      
   if(!controllo){
   Serial.println("Accesso vietato");
   delay(1000);
   }
    
   Serial.println();
   Serial.println("In attesa di lettura...");
    
 
 }

 //QUESTO DIGITAL WRITE L'HO INSERITO PER PROVA. MA NON LO ESEGUE MAI.
 digitalWrite(led,HIGH);
 delay(200);
 digitalWrite(led,LOW);
}
 
void openDoor(){
 
  digitalWrite(rele, HIGH);
  Serial.println("Relè ON");
  delay(3000);
  digitalWrite(rele, LOW);
  Serial.println("Relè OFF");
   
}

Non so bene dove sia il problema, ma cosa vorresti fare con:

for (int i = 0; i < sizeof(uidRFID)/sizeof(String); i++){

? Confrontare l’UID letto con quello “buono”? In tal caso non serve il ciclo for, sono due String, puoi confrontarle direttamente con ==.

Ciao se vuoi usa questo sketch che ho creato basandomi anch’io sul tuo(la differenza è che ho integrato lcd 16x2 e rtc con blocco accessi a determinati orari) e ultimato con l’aiuto del forum…modificalo come meglio credi :slight_smile:

/* lettore tag nfc il quale abilita un rele' se il tag è corretto.
 *  funzione di auto-protect che inibisce la lettura in un determinato arco temporale
 *  pin rtc : 8-sclk,9-IO pin,10-CEpin(rst)
 *  pin lcd I2C : A4,A5
 *  pin MFRC522: 7-rst,6-sda,11-mosi,12-miso,13-sck
 *  pin rele: 2
 *  pin buzzer: 3
 *  pin led: 5
 */


#include <DS1302RTC.h> //includo libreria rtc
#include <Time.h> //includo libreria gestione time
#include <SPI.h> // includo libreria spi
#include <MFRC522.h> //includo libreria lettore rfid
#include <LiquidCrystal_I2C.h> //libreria lcd I2C
#include <Wire.h> //includo libreria wire
#define SS_PIN 6 //definisco i pin rfid
#define RST_PIN 7 // definisco pin reset rfid

LiquidCrystal_I2C mylcd(0x27, 20, 4); // setto il display

DS1302RTC RTC(10, 9, 8); // setto pin RTCD

MFRC522 mfrc522(SS_PIN, RST_PIN);   // setto e creo l'istanza rfid

long previousMillis = 0;  //variabili tempo rfid
long interval = 10;
bool bSystemLocked;

int rele = 2;  //pin relè
int buzzer = 3; //pin buzzer
int hour() ; //variabile tempo
int ledG = 5;

String uidRFID[] = {"b34cdcc7", "codeRFID_B", "codeRFID_C", "codeRFID_D"}; // tag abilitati (da modificare con i tag di interesse)

byte locked[8] = {B00000, B01110, B10001, B10001, B11111, B11111, B11111, B00000}; // creo carattere speciale
byte Clock[8] = {B00000, B01110, B10011, B10101, B10001, B01110, B00000, B00000};


void setup() {

  mylcd.begin(); //inizializzo lcd
  mylcd.backlight(); //abilito retroilluminazione
  mylcd.createChar(0, locked); //creo carattere speciale e imposto la sua assegnazione a 0
  mylcd.createChar(1, Clock);
  SPI.begin();        // Inizializzo SPI
  mfrc522.PCD_Init(); // Inizializzo MFRC522
  pinMode(rele, OUTPUT); //imposto il pin del rele come output
  pinMode(ledG, OUTPUT);

  
  
  mylcd.clear(); //pulisco display

  if (RTC.haltRTC()) {  //ciclo di controllo sul rtc se attivo
    mylcd.print("Clock stopped!");
  }
  else {
    mylcd.print("Clock working.");
  }

  mylcd.setCursor(0, 1);
  if (RTC.writeEN())  {   //controllo rom rtc
    mylcd.print("Write allowed.");
  }
  else  {
    mylcd.print("Write protected.");
  }

  delay ( 2000 ); //attendo

  // Setup Time libreria
  mylcd.clear();
  mylcd.print("RTC Sync");
  setSyncProvider(RTC.get); // acquisisco i dati dal rtc e verifico
  if (timeStatus() == timeSet) {
    mylcd.print(" Ok!");
  }
  else  {
    mylcd.print(" FAIL!");
  }
  delay ( 2000 );

  mylcd.clear();




}

void loop() {


  mylcd.setCursor(2, 0); //setto cursore
  mylcd.print("STUDIO GLOBAL"); //prima riga lcd in stampa fissa

  if (timeStatus() != timeSet) {
    mylcd.setCursor(0, 1);
    mylcd.print(F("RTC ERROR"));  //controlla che i time sia sincroni
  }

  int h = hour();  // a hour la variabile h
  if ((h == 0) || (h >= 7))  // se,h = 0 oppure h maggiore o uguale a 7
  {
    openOffice();  //attivo funzione open office
  }
  else //oppure
  {
    closeOffice(); // attivo funzione close office
  }

  unsigned long currentMillis = millis();  // currentmillis uguale millis

  if (currentMillis - previousMillis > interval) {  //
    previousMillis = currentMillis;

    // gurda se c'è un tg vicino
    if ( ! mfrc522.PICC_IsNewCardPresent()) {
      return;
    }

    // e lo legge
    if ( ! mfrc522.PICC_ReadCardSerial()) {
      return;
    }

    String uid_s = ""; // il codice del tag è assegnato alla variabile

    if (!mfrc522.PICC_IsNewCardPresent() && !mfrc522.PICC_ReadCardSerial()) {

      for (byte i = 0; i < mfrc522.uid.size; i++) {

        String uid_a = String(mfrc522.uid.uidByte[i] < 0x10 ? "0" : "");
        String uid_b = String(mfrc522.uid.uidByte[i], HEX);

        uid_s = uid_s + uid_a + uid_b;


      }
    }


    boolean controllo = false;  // controllo valore boleano logico 1
    if (!bSystemLocked) { //se bSystem è falso

      for (int i = 0; i < sizeof(uidRFID) / sizeof(String); i++)  // attiva ciclo

        if (uidRFID[i] == uid_s) {  // se il tag letto corrisponde a un tag valido


          mylcd.setCursor(3, 1);
          mylcd.print("Consentito");
          tone(buzzer, 800, 100);
          ledgB();
          openDoor();  //attiva
          controllo = true;
          break;

        }
    }


    if (!controllo) {  //se il controllo booleano è falso
      mylcd.setCursor(0, 1);
      mylcd.print("!Non Consentito!");
      tone(buzzer, 800, 500);
      displayBlink(3, 400);
      delay(2000);
    }
    mylcd.clear();
  }
  

}



void openDoor() {  //funzione attivazione rele

  digitalWrite(rele, HIGH);
  delay(2000);
  digitalWrite(rele, LOW);

}

void ledgB() {
  digitalWrite(ledG, HIGH);
  delay(500);
  digitalWrite(ledG, LOW);
}

void print2digits(int number) {   //funzione stampa corretta ora,minuti,secondi
  // Output leading zero
  if (number >= 0 && number < 10) {
    mylcd.write('0');
  }
  mylcd.print(number);
}

void openOffice() {  //funzione open office
  mylcd.setCursor(0, 1);
  mylcd.print("   ");
  mylcd.setCursor(3, 1);
  mylcd.write(1);
  mylcd.setCursor(4, 1);
  mylcd.print("");
  print2digits(hour());
  mylcd.print(":");
  print2digits(minute());
  mylcd.print(":");
  mylcd.print(second());
  mylcd.setCursor(12, 1);
  mylcd.print("   ");
  bSystemLocked = false;  // booleano falso (1) presente nella funzione tag corretto
}

void closeOffice() {  //funzione close office
  mylcd.setCursor(1, 1);
  mylcd.write(0);
  mylcd.setCursor(2, 1);
  mylcd.print("System Locked");
  bSystemLocked = true;  // booleano vero(0) presente nella funzione "non consentito" nella funzione read nfc deve essere falso per abilitarlo
}

void displayBlink(int blinks, int duration)  // funzione lampeggio display quando "non consentito"
{
  while (blinks--)
  {
    mylcd.noDisplay();
    delay(duration);
    mylcd.display();
    delay(duration);
  }
}

Grazie mille... credo che il problema risieda nel fatto che il lettore sta in "ascolto" per trovare una nuovo tag. Avete idea di come risolvere? In pratica sto creando un sistema di gestione di una vecchia autovettura(dalle frecce alle luci ecc...) volevo utilizzare la scheda rfid per dare il comando di start motore. Ma ovviamente in questa maniera( se non si risolve il problema di NON blocco dello sketch) è impossibile da usare. Ho provato anche a inserire il tutto dopo una condizione if,( se premo un pulsante avvia lal partw di sketch relativa al lettore) ma niente, blocca tutto il resto anche se la condizione risulta falsa.

Allora non ti resta che controllare i collegamenti...può essere che non riesce a resettare il lettore...controlla tutto poi facci sapere :slight_smile:

Purtroppo i collegamenti sono giusti, anche perche di perse lo sketch funziona, solonche come dicevo se metto dentro al loop anche altre azioni da compiere che non riguardano l rfid, non le compie assolutamente. Mi domando solo se sia normale o no.