3 lettori rfid e un solo relè

Buonasera,

mi sono affacciato da poco ad Arduino, ma non nego che la cosa mi stia prendendo molto.

Le mie basi sono minime perchè il mio diploma di perito informatico è in soffitta da molto tempo, ma adesso che sto studiando un pò Arduino, posso ammettere che qualcosina mi suona familiare.

Giungo al punto.

Mi serviva un programma che grazie a 3lettori rfid mi permesse di azionare un relè.

Ho trovato qualcosa in giro, ma niente era perfetto per il mio caso e quindi ho iniziato a leggermi qualche programma che ho trovato in giro e a studiarmi il funzionamento di ognuno di loro.

Con qualche mia piccola conoscenza, sono adesso riuscito ad accorpare una serie di programmi e creare il programma che fa per me.

Il programma funziona abbastanza bene ma devo ammettere che anche se sto studiando, ci sono cose inserite nel programma che non riesco a capire bene e quindi mi piacerebbe capire come funzionano e quindi perfezionare il programma.

Spero davvero di non aver infranto il regolamento e spero che oltre ad aver inserito il mio post nel posto giusto :smiley: che qualcuno possa aiutarmi.

Il programma è stato riscritto da me, ma prendendo spunto da programmi esistenti, quindi spero di non offendere nessuno se troverà qualche stringa scritta prima da lui nel mio programma.

#include <SPI.h>
#include <MFRC522.h>
 

#define RST_PIN 9
#define SS_PIN 7
#define SS_PIN_2 10
#define SS_PIN_3 8



#define led_giallo 2
#define led_verde 3
#define led_blu 4
#define led_rosso 6

#define rele 5


 
MFRC522 mfrc522(SS_PIN, RST_PIN); 

MFRC522 mfrc522_2(SS_PIN_2, RST_PIN); 


MFRC522 mfrc522_3(SS_PIN_3, RST_PIN); 
 
long previousMillis = 0;
long interval = 10;
 


int ac1 = 0;
int ac2 = 0;
int ac3 = 0;

 
String uidRFID[] = {"c6691c07"};
String uidRFID2[] = {"85161046"};
String uidRFID3[] = {"47235901"};
 
void setup() {
     
        
        Serial.begin(9600); 
    SPI.begin();    

        
    mfrc522.PCD_Init();  
    Serial.println("Controllo tessera 1");
        Serial.println("Tessere registrate n° --> "+String(sizeof(uidRFID)/sizeof(String)));
        Serial.println("Lettore 1 in attesa di tessera...");


        
 mfrc522_2.PCD_Init(); 
    Serial.println("Controllo tessera 2");
        Serial.println("Tessere registrate n° --> "+String(sizeof(uidRFID2)/sizeof(String)));
        Serial.println("Lettore 2 in attesa di tessera...");
        

        
 mfrc522_3.PCD_Init(); 
    Serial.println("Controllo tessera 3");
        Serial.println("Tessere registrate n° --> "+String(sizeof(uidRFID3)/sizeof(String)));
        Serial.println("Lettore 3 in attesa di tessera...");
        
        
       
}


 
void openDoor(){
 
  digitalWrite(rele, HIGH);
  digitalWrite(led_verde, HIGH);
  Serial.println("Relè acceso");
  delay(3000);
  digitalWrite(rele, LOW);
  digitalWrite(led_verde, LOW);
  Serial.println("Relè spento");
   
}


void loop() 
{
 unsigned long currentMillis = millis();
    
String uid_s = "";

String uid_s2 = "";

String uid_s3 = "";



  if(currentMillis - previousMillis > interval) 
  {
    previousMillis = currentMillis; 
  
     
    if ( ! mfrc522.PICC_IsNewCardPresent() && ! mfrc522_2.PICC_IsNewCardPresent() && ! mfrc522_3.PICC_IsNewCardPresent() ) 
    {
        return;
    }
    
    if ( ! mfrc522.PICC_ReadCardSerial() && ! mfrc522_2.PICC_ReadCardSerial() && ! mfrc522_3.PICC_ReadCardSerial()) 
    {
        return;
    }
 
 
 
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("Lettore 1:  Tessera n° --> ");
  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("Tessera 1 valida");
            digitalWrite(led_blu, HIGH);
            controllo = true;
            ac1= 1;
            break;

        }
     }

     
   if(!controllo)
   {
   Serial.println("Tessera 1 non valida");
   digitalWrite(led_blu, LOW);
   delay(1000);
   ac1=  0;
   }
    
   Serial.println();
   Serial.println("In attesa di tessera nel lettore 2...");
   ac2=0;
             
     
 
 
if (!mfrc522_2.PICC_IsNewCardPresent() && !mfrc522_2.PICC_ReadCardSerial()) 
    {
   
    for (byte h = 0; h < mfrc522_2.uid.size; h++) 
        {
         
        String uid_c = String(mfrc522_2.uid.uidByte[h] < 0x10 ? "0" : "");
        String uid_d = String(mfrc522_2.uid.uidByte[h], HEX);
           
        uid_s2 = uid_s2+uid_c+uid_d;
          
 
        }
     }
   
  Serial.print("Lettore 2:  Tessera n° --> ");
  Serial.println(uid_s2);
  Serial.println("");
  boolean controllo2 = false;
  for (int h = 0; h < sizeof(uidRFID2)/sizeof(String); h++)
     {
   
    if(uidRFID2[h] == uid_s2)  
        {
      
            Serial.println("Tessera 2 valida");
            digitalWrite(led_giallo, HIGH);
            controllo2 = true;
            ac2=1;
            break;

        }
     }

     
   if(!controllo2)
   {
   Serial.println("Tessera 2 non valida");
   digitalWrite(led_giallo, LOW);
   delay(1000);
   ac2=0;
   }
 



   Serial.println();
   Serial.println("In attesa di tessera nel lettore 3...");
   ac2=0;
             
     
 
 
if (!mfrc522_3.PICC_IsNewCardPresent() && !mfrc522_3.PICC_ReadCardSerial()) 
    {
   
    for (byte j = 0; j < mfrc522_2.uid.size; j++) 
        {
         
        String uid_e = String(mfrc522_2.uid.uidByte[j] < 0x10 ? "0" : "");
        String uid_f = String(mfrc522_2.uid.uidByte[j], HEX);
           
        uid_s3 = uid_s3+uid_e+uid_f;
          
 
        }
     }
   
  Serial.print("Lettore 3:  Tessera n° --> ");
  Serial.println(uid_s3);
  Serial.println("");
  boolean controllo3 = false;
  for (int j = 0; j < sizeof(uidRFID3)/sizeof(String); j++)
     {
   
    if(uidRFID3[j] == uid_s3)  
        {
      
            Serial.println("Tessera 3 valida");
            digitalWrite(led_rosso, HIGH);
            controllo3 = true;
            ac3=1;
            break;

        }
     }

     
   if(!controllo3)
   {
   Serial.println("Tessera 3 non valida");
   digitalWrite(led_rosso, LOW);
   delay(1000);
   ac3=0;
   }
 



   if (ac1==1 &&  ac2==1  &&  ac3==1)
    {  Serial.println ("porta aperta");
    openDoor();
   delay(1000); }    
   else
   Serial.println ("porta chiusa");
   delay(1000);

   
   Serial.println();
   Serial.println("In attesa di tessera nel lettore 1...");
   ac1=0;

   
    }          
 
}

Buongiorno, non scrivo per riportare in alto il mio post, ma per capire se non sto ricevendo risposte perchè nessuno sa o vuole rispondere o se ho sbagliato qualcosa io e non avrei proprio dovuto scrivere tale post.

Grazie anticipatamente per un’eventuale risposta

Non c'è nessun problema, ma forse non è chiaro cosa stai chiedendo di preciso. Non ci sono domande nel tuo post ;).

Ma nel tuo post ... dove sono le domande ? ? ? :o

Perché dici:

stefanodaimler: ... Il programma funziona abbastanza bene ma devo ammettere che anche se sto studiando, ci sono cose inserite nel programma che non riesco a capire bene e quindi mi piacerebbe capire come funzionano e quindi perfezionare il programma.

... ma poi NON spieghi cosa ti è poco chiaro e cosa vuoi sapere e non poni alcuna domanda.

Speri che gli altri si inventino le domande per te ? ? ? :o

Guglielmo

Edit: Mi sono sovrapposto con SukkoPera che ... ha avuto simile reazione al tuo post :D

gpb01: Ma nel tuo post ... dove sono le domande ? ? ? :o

Perché dici: ... ma poi NON spieghi cosa ti è poco chiaro e cosa vuoi sapere e non poni alcuna domanda.

Speri che gli altri si inventino le domande per te ? ? ? :o

Guglielmo

Edit: Mi sono sovrapposto con SukkoPera che ... ha avuto simile reazione al tuo post :D

In effetti non ho fatto nessuna domanda e scusatemi se sono stato poco chiaro.

Inizio con le domande: è scritto correttamente? Se no, cosa ho sbagliato?

Cosa si può migliorare? Perchè a volte non funziona e non so il motivo.

Grazie

stefanodaimler: Cosa si può migliorare? Perchè a volte non funziona e non so il motivo.

Capisci che anche questo è poco chiaro ? A volte COSA non funziona ? non legge una tessera ? la legge ma poi non pilota il rele ?

nid69ita:
Capisci che anche questo è poco chiaro ? A volte COSA non funziona ?
non legge una tessera ? la legge ma poi non pilota il rele ?

A volte la tessera non viene letta: con le tessere appoggiate sui lettori rfid, dal monitor seriale risulta letta la tessera sul primo lettore, letta la tessera sul secondo lettore e letta anche quella sul terzo. Senza toccare niente e quindi con le tessere sui 3 lettori, viene riletta la tessera sul primo lettore ma non le tessere suglia ltri 2 lettori e ancora senza modificare nulla, vengono rilette le 3 tessere poi solo la prima e via di seguito. Questo non lo fa sempre.
Quando i lettori leggono tutte e 3 le tessere giuste, il relè viene pilotato correttamente.

Adesso mi sono spiegato meglio o sono ancora poco chiaro?

A parte che lo sketch si potrebbe scrivere in maniera più sintetica, senza ripetere tutti i blocchi di codice per ogni lettore, qua leggi la card 3 ma usi la 2:

if (!mfrc522_3.PICC_IsNewCardPresent() && !mfrc522_3.PICC_ReadCardSerial()) 
    {
   
    for (byte j = 0; j < mfrc522_2.uid.size; j++)      // <-- Non dovrebbe essere mfrc522_3? E anche sotto, in tutto il blocco
        {
         
        String uid_e = String(mfrc522_2.uid.uidByte[j] < 0x10 ? "0" : "");
        String uid_f = String(mfrc522_2.uid.uidByte[j], HEX);
           
        uid_s3 = uid_s3+uid_e+uid_f;
          
 
        }
     }
   
  Serial.print("Lettore 3:  Tessera n° --> ");

Inoltre non mi piace la condizione di terminazione dei cicli for tipo:

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

Non credo che cicli il numero corretto di volte. Secondo me sarebbe meglio un semplice:

i < uidRFID.length()

(In realtà sarebbe ancora meglio evitare di usare la classe String del tutto)

SukkoPera:
A parte che lo sketch si potrebbe scrivere in maniera più sintetica, senza ripetere tutti i blocchi di codice per ogni lettore, qua leggi la card 3 ma usi la 2:

if (!mfrc522_3.PICC_IsNewCardPresent() && !mfrc522_3.PICC_ReadCardSerial()) 

{
 
    for (byte j = 0; j < mfrc522_2.uid.size; j++)      // ← Non dovrebbe essere mfrc522_3? E anche sotto, in tutto il blocco
        {
       
        String uid_e = String(mfrc522_2.uid.uidByte[j] < 0x10 ? “0” : “”);
        String uid_f = String(mfrc522_2.uid.uidByte[j], HEX);
         
        uid_s3 = uid_s3+uid_e+uid_f;

}
    }
 
  Serial.print("Lettore 3:  Tessera n° → ");




Inoltre non mi piace la condizione di terminazione dei cicli for tipo:


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




Non credo che cicli il numero corretto di volte. Secondo me sarebbe meglio un semplice:


i < uidRFID.length()




(In realtà sarebbe ancora meglio evitare di usare la classe String del tutto)

Si, nel primo caso c’è un errore che avevo fatto usando il copia incolla, ma poi avevo corretto sul mio programma e non qui. Scusami.

Credo anche io che non cicli il numero corretto di volte e che questo possa causare l’errore.

Tu rusciresti a sintetizzarmi il programma non usando la classe String come hai detto tu?

Io al momento non saprei come fare per sintetizzarlo senza creare un casino.

Grazie mille in anticipo!

Erm no, è una cosa un po' lunga. Quel che posso fare è farti vedere uno sketch mio dove faccio qualcosa di simile:

https://gist.github.com/SukkoPera/3e87aacedf3939fc50bbe893016dabab#file-esp_togglefoscammotiondetection-ino-L83

La riga 83 chiama la funzione compareUId() poco sopra.

Per il resto suggerirei di cercare online un tutorial sulle stringhe "pure" in C.

SukkoPera: Erm no, è una cosa un po' lunga.

Immagino, grazie comunque per la disponibilità.

Se invece chiedessi come fare per scrivere in maniera piu' sintetica senza ripetere i blocchi di codice per ogni lettore?

Grazie in anticipo

Per questo potresti dare un'occhiata alla mia funzione compareUid(), pensaci un po' ;).