Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Apriporta RFID con arduino uno

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteMassimoB, Foto UtenteWALTERmwp, Foto Utentexyz

0
voti

[1] Apriporta RFID con arduino uno

Messaggioda Foto Utentelupoalberto74it » 4 ago 2021, 16:59

Salve, ho realizzato un apriporta con sensore RFID mfrc522, con il quale apro il cancelletto. Il progetto funziona bene, ho solo un problema per quanto riguarda il codice, perché non riesco ad inserire 4 codici di TAG (UID) differenti. Il codice è il seguente:
Codice: Seleziona tutto
#include <SPI.h>

#include <MFRC522.h>

#include <Wire.h>

#include <LiquidCrystal_I2C.h>



#define SS_PIN 10

#define RST_PIN 9



#define LED_DENIED_PIN 7

#define LED_ACCESS_PIN 6

#define rele 2



LiquidCrystal_I2C lcd(0x27,16,2);

MFRC522 mfrc522(SS_PIN, RST_PIN); // Instance of the class


int code[] = {44,206,04,50}; //This is the stored UID (Unlock Card)

int codeRead = 0;




void setup() {

   Serial.begin(9600);

   SPI.begin();       // Init SPI bus

   mfrc522.PCD_Init(); // Init MFRC522

   Serial.println("Arduino RFID reading UID");



   pinMode( LED_DENIED_PIN , OUTPUT);

   pinMode( LED_ACCESS_PIN , OUTPUT);

   pinMode(rele, OUTPUT); //cambiare 2 in rele per funzionare come relè
   


   lcd.init();

  // Print a message to the LCD.

  lcd.backlight();

  lcd.setCursor(0,0);

  lcd.print("IT Benvenuto");
  Serial.println("IT Benvenuto");
  lcd.setCursor(0,1);

  lcd.print("ES Bienvenidos");
  Serial.println("ES Bienvenidos");
}

void loop() {

 

if ( mfrc522.PICC_IsNewCardPresent())

    {

        if ( mfrc522.PICC_ReadCardSerial())

        {

           lcd.clear();

           Serial.print("Tag UID:");

           lcd.setCursor(0,0);

           lcd.print("Tag UID:");

           lcd.setCursor(0,1);


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

                  Serial.print(mfrc522.uid.uidByte[i] < 0x27 ? " 0" : " ");

                  Serial.print(mfrc522.uid.uidByte[i], HEX);

                 

                  lcd.print(mfrc522.uid.uidByte[i] < 0x27 ? " 0" : " ");

                  lcd.print(mfrc522.uid.uidByte[i], HEX);

                //  lcd.print(" ");

            }

           

           
 
            int i = 0;

            boolean match = true;

            while(i<mfrc522.uid.size)

            {

   

               if(!(int(mfrc522.uid.uidByte[i]) == int(code[i])))

               {

                  match = false;

               }

              i++;

            }



            delay(2000);

           lcd.clear();

           lcd.setCursor(0,0);

           

           

           if(match)

           {

              digitalWrite( LED_ACCESS_PIN , HIGH);
             
              lcd.print("Accesso Valido");
              lcd.setCursor(0,1);
              lcd.print("Porta Aperta");

              Serial.println("\Accesso Valido");

              digitalWrite (rele, HIGH); //cambiare 2 in rele per funzionare come relè
              delay (1000);     // Tempo relè o led in stato ON
              digitalWrite (rele, LOW); //cambiare 2 in rele per funzionare come relè

             

           

   

           }else{

              digitalWrite( LED_DENIED_PIN , HIGH);
             
              lcd.print("Carta Errata");
              lcd.setCursor(0,1);
              lcd.print("Accesso Negato");

             Serial.println("\Carta Errata");

           }

             

             Serial.println("============================");

           

             mfrc522.PICC_HaltA();



             delay(1000);

             reset_state();

        }

}

}

void reset_state()

{

    lcd.clear();

    lcd.setCursor(0,0);

    lcd.print("IT Benvenuto");
    Serial.println("IT Benvenuto");
    lcd.setCursor(0,1);
    lcd.print("ES Bienvenidos");
    Serial.println("ES Bienvenidos");
   

    digitalWrite( LED_ACCESS_PIN , LOW);

    digitalWrite( LED_DENIED_PIN , LOW);

}

Spero in un vostro aiuto. Grazie in anticipo.
Avatar utente
Foto Utentelupoalberto74it
10 3
 
Messaggi: 42
Iscritto il: 4 ago 2021, 14:39

0
voti

[2] Re: Apriporta RFID con arduino uno

Messaggioda Foto UtenteIlGuru » 4 ago 2021, 17:27

Aggiungerei un'altra dimensione all'array code, l'indice aggiuntivo tiene conto dei nuovi codici tag che a questo punto non sarebbero più limitati a 4.
Aggiungerei poi un ciclo for esterno utilizzandone l'indice j per estrarre il valore da testare.
if(!(int(mfrc522.uid.uidByte[i]) == int(code[i]))) diventa quindi if(!(int(mfrc522.uid.uidByte[i]) == int(code[j][i])))
La logica però va invertita, match deve essere false all'inizio, deve diventare true quando viene trovata una corrispondenza valida ed a quel punto si deve uscire dal ciclo.
\Gamma\nu\tilde{\omega}\theta\i\ \sigma\epsilon\alpha\upsilon\tau\acute{o}\nu
Avatar utente
Foto UtenteIlGuru
5.287 2 10 13
G.Master EY
G.Master EY
 
Messaggi: 1895
Iscritto il: 31 lug 2015, 23:32

0
voti

[3] Re: Apriporta RFID con arduino uno

Messaggioda Foto Utentenicsergio » 4 ago 2021, 20:12

Probabilmente è la stessa cosa, ma per il confronto dei byte delle chiavi potresti togliere il for interno ed usare la funzione memcmp(), se non sbaglio così:

Codice: Seleziona tutto
if ((bool) !memcmp(mfrc522.uid.uidByte, code[j], mfrc522.uid.size)


se i due array sono uguali memcmp ritorna 0
Avatar utente
Foto Utentenicsergio
4.466 3 9 13
Master
Master
 
Messaggi: 877
Iscritto il: 1 gen 2020, 16:42

0
voti

[4] Re: Apriporta RFID con arduino uno

Messaggioda Foto Utentelupoalberto74it » 4 ago 2021, 21:42

Salve, grazie per le risposte ma io sono un po' a digiuno di codice, sono agli inizi e non so dove mettere l'altro array code, ma non capisco anche come mettere altri codici (UID).
Ho provato più volte ad inserirne ma mi da errore la verifica. Farò altre prove. Se potete aiutarmi a capire meglio.
Grazie comunque del tempo che mi dedicate.
Avatar utente
Foto Utentelupoalberto74it
10 3
 
Messaggi: 42
Iscritto il: 4 ago 2021, 14:39

0
voti

[5] Re: Apriporta RFID con arduino uno

Messaggioda Foto UtenteGioArca67 » 5 ago 2021, 0:18

Codice: Seleziona tutto
int code[] = {44,206,04,50};


Diventa
Codice: Seleziona tutto
#define MAXSCHEDE 5
int code[MAXSCHEDE][4] = {{44,206,04,50},
{44,206,04,50},
{44,206,04,50},
{44,206,04,50},
{44,206,04,50}};

Ovviamente metti i numeri che servono a te, non devono essere uguali, io ho solo copiato.
MAXSCHEDE è il numero di carte RFID che vuoi controllare
Se ne servono diverse come numerosità cambia e corrispondentemente aggiungi o togli righe.

Foto UtenteIlGuru ti aveva già risposto, ripeto
Codice: Seleziona tutto
         boolean match = false;
        for(int sch=0;sch<MAXSCHEDE&&!match;sch++)
        {
            int i=0;
            match = true;
            while(i<mfrc522.uid.size)
            {
                if(!(int(mfrc522.uid.uidByte[i]) == int(code[sch][i])))
                  {
                     match = false;
                   }
                  i++;
             }
        }


L'idea del memcmp di Foto Utentenicsergio anche non è male;

Codice: Seleziona tutto
         boolean match = false;
        for(int sch=0;sch<MAXSCHEDE&&!match;sch++)
        {
            if(memcmp(mfrc522.uid.uidByte, code[sch], mfrc522.uid.size)==0)
            match = true;
          }



Non ho compilatore sotto mano, scritto a occhio...
Avatar utente
Foto UtenteGioArca67
3.724 4 5 9
Master
Master
 
Messaggi: 3608
Iscritto il: 12 mar 2021, 9:36

0
voti

[6] Re: Apriporta RFID con arduino uno

Messaggioda Foto Utentenicsergio » 5 ago 2021, 9:00

Aggiungo solo una nota a quanto scritto da Foto UtenteGioArca67: mfrc522.uid.uidByte è un array di byte, per cui se vuoi utilizzare la funzione memcmp(), devi dichiarare i codici come matrice di byte e non di interi:

Codice: Seleziona tutto
#define MAXSCHEDE 5

byte code[MAXSCHEDE][4] = {{44,206,04,50},
                           {44,206,04,51},
                           {44,206,04,52},
                           {44,206,04,53},
                           {44,206,04,54}};



La verifica del codice diventerebbe:

Codice: Seleziona tutto
bool match = false;
for (byte i = 0; i < MAXSCHEDE && !match; i++)
    match = !memcmp(mfrc522.uid.uidByte, code[i], mfrc522.uid.size);
Avatar utente
Foto Utentenicsergio
4.466 3 9 13
Master
Master
 
Messaggi: 877
Iscritto il: 1 gen 2020, 16:42

0
voti

[7] Re: Apriporta RFID con arduino uno

Messaggioda Foto UtenteGioArca67 » 5 ago 2021, 9:06

Dovrebbe essere ininfluente...

definizione della memcmp:
int memcmp ( const void * ptr1, const void * ptr2, size_t num );

ma in ogni caso concordo con l'osservazione.

Anche il casting a int nel controllo proposto non mi piaceva per nulla.

comunque compila correttamente in tutti e tre i modi (iniziale dell'OP, modifica con array 2D e modifica con memcmp)
Avatar utente
Foto UtenteGioArca67
3.724 4 5 9
Master
Master
 
Messaggi: 3608
Iscritto il: 12 mar 2021, 9:36

1
voti

[8] Re: Apriporta RFID con arduino uno

Messaggioda Foto Utentenicsergio » 5 ago 2021, 9:39

GioArca67 ha scritto:Dovrebbe essere ininfluente...


per compilare compila anche lasciando la definizione come interi, ma size_t num è il numero di byte da confrontare, se confronti un array di byte con uno di interi (che ha larghezza doppia) non può matchare, ho provato al volo con un Arduino
Avatar utente
Foto Utentenicsergio
4.466 3 9 13
Master
Master
 
Messaggi: 877
Iscritto il: 1 gen 2020, 16:42

1
voti

[9] Re: Apriporta RFID con arduino uno

Messaggioda Foto UtenteGioArca67 » 5 ago 2021, 9:42

Hai ragione!
size riporta in elementi, non byte...
Avatar utente
Foto UtenteGioArca67
3.724 4 5 9
Master
Master
 
Messaggi: 3608
Iscritto il: 12 mar 2021, 9:36

0
voti

[10] Re: Apriporta RFID con arduino uno

Messaggioda Foto UtenteGioArca67 » 5 ago 2021, 9:55

poco male

mfrc522.uid.size*sizeof(int)

:D :twisted: :D
Avatar utente
Foto UtenteGioArca67
3.724 4 5 9
Master
Master
 
Messaggi: 3608
Iscritto il: 12 mar 2021, 9:36

Prossimo

Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 5 ospiti