Controllo accessi RFID Tastierino

Il controllo accessi rfid tastierino è un progetto che tanti makers desiderano realizzare e Adriano ha realizzato e voluto condividere con tutti noi.

controllo accessi rfid tastierino

Come spesso accade il Venerdì è la giornata dedicata in cui descrivo i progetti che non realizzo personalmente ma che altri appassionati e makers desiderano condividere usando il blog.

Diciamo che il venerdì è la giornata della vetrina su progetti tuoi un giorno in cui puoi mostrare a tutti cosa hai realizzato.

Oggi il progetto che riporto è di Adriano Guscetti: Controllo accessi RFID Tastierino, lascio la descrizione all’autore:

Il programma permette di autorizzare tramite lettura di una chiave elettronica (RFID) e l’inserimento di una password inserita tramite una tastiera 4 righe e 4 colonne, l’accesso a qualsivoglia entrata o apparecchio.

I dati di chi è autorizzato a entrare sono memorizzati direttamente nello sketch nella funzione PadroneChiave.

Scegliendo il tasto D si interrompe l’immissione

Scegliendo il tasto * si cancella l’ultima immissione

Scegliendo il tasto # si conferma l’immissione prima della lunghezza massima (7 caratteri)

I tasti A, B e C non hanno nessuna funzione.

Cosa ti server per il Controllo accessi RFID Tastierino

Il materiale necessario a realizzare il controllo accessi rfid tastierino 4×4 è il seguente:

  • Arduino Mega 2560
  • Scheda RFID-RC522
  • Tastierino 4×4
  • Buzzer
  • LCD 4×20

Il collegamento di questi componenti non è complesso tuttavia è necessario che tu faccia attenzione a non confondere i pin dell’arduino mega 2560, puoi seguire lo schema inviato da Adriano:

controllo accessi rfid tastierino

avrai già notato a quali pin collegare i componenti, tuttavia Adriano ha voluto specificarli nella descrizione del progetto e li riporto per completezza:

  • La scheda RFID-RC522 devi collegarla ai pin: RST   5, MISO  50, MOSI  51, SCK   52, SDA   53
  • Il tastierino 4×4 devi collegarlo ai pin dal 34 al 41: pin 37, 36, 35, 34 rispettivamente riga0, riga1, riga2 e riga3; pin 41, 40, 39, 38 rispettivamente alle colonne: colonna0, colonna1 , colonna2 e colonna3
  • Il buzzer collegalo al pin 7
  • LCD 4×20 collegato ai pin 22 RS, 23 E, 24 DB4, 25 DB5, 26 DB6, 27 DB7

Lo sketch di Adriano

Ecco lo sketch che Adriano ha realizzato per il controllo accessi rfid tastierino 4×4:

/*
Adriano Guscetti marzo 2014
Il programma permette di autorizzare tramite lettura di una chiave elettronica (RFID)e l'inserimento di una 
password inserita tramite una tastiera 4 righe e 4 colonne, l'accesso a qualsivoglia entrata o apparecchio.
I dati di chi è autorizzato a entrare sono memorizzati direttamente nello sketch nella Void PadroneChiave.
Scegliendo il tasto D si interrompe l'immissione
Scegliendo il tasto * si cancella l'ultima immissione
Scegliendo il tasto # si conferma l'immissione prima della lunghezza massima (7 caratteri)
I tasti A, B e C non hanno nessuna funzione.

Arduino Mega 2560
Scheda RFID-RC522 allacciata ai seguenti Pin:
RST   5
MISO  50
MOSI  51
SCK   52
SDA   53
Tastierino 4x4 allacciato ai Pin 34 - 41 (vedi impostazioni sotto)
Buzzer al Pin 7
LCD 4x20 allacciato ai Pin 22 - 27 (vedi impostazioni sotto)
*/
String stringa;
String codice;
String nome;
int IDCarta;
int ID;
int caratterimax;
int errore;
int i=0;
int numero;
int cifra;
int spazio;
int PinEntrata =30;

//RFID
#include <SPI.h>
#include <MFRC522.h>
//Viene creata l'istanza dell'oggetto MFRC522 chiamata mfrc522 in cui sono indicati i pin del RFID collegati alle uscite digitali di Arduino
#define SS_PIN 53
#define RST_PIN 5
MFRC522 mfrc522(SS_PIN, RST_PIN);        // Crea istanza MFRC522.

//LCD 20x4
#include <LiquidCrystal.h>
//Viene creata l'istanza dell'oggetto LiquidCrystal chiamata lcd in cui sono indicati i pin dell'LCD collegati alle uscite digitali di Arduino  
LiquidCrystal lcd(22, 23, 24, 25, 26, 27);

//Tastiera
// Definizione tastiera
#include <Keypad.h>
const byte ROWS = 4; // Quattro righe
const byte COLS = 4; // Quattro colonne
// Definizione mappa della tastiera
char keys[ROWS][COLS] = {
{'1','4','7','*'},
{'2','5','8','0'},
{'3','6','9','#'},
{'A','B','C','D'}
};
byte rowPins[ROWS] = {37, 36, 35, 34 }; // Connessione delle righe: Riga0, Riga1, Riga2 e Riga3 ai pins di Arduino.
byte colPins[COLS] = {41, 40, 39, 38 }; // Connessione delle colonne: Colonna0, Colonna1 , Colonna2 e Colonna3 ai pins di Arduino.
Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); // Creazione della tastiera

void setup() 
{
  //LCD
  //imposta il numero di colonne ed il numero di righe
   lcd.begin(4, 20);
   // Visualizzo il nome dello Sketch sul display
   lcd.print("EntrataV01");
   delay(1000);

   Serial.begin(9600);        // Initializza la communicazione seriale
   SPI.begin();                // Inizializza il bus SPI
   mfrc522.PCD_Init();        // Inizializza la carta MFRC522
   pinMode(7, OUTPUT);

   pinMode(PinEntrata,OUTPUT); //PIN per attivare l'accesso
}
void loop()
{
  // Prepara la key - tutte le aree keys a FFFFFFFFFFFFh 
  MFRC522::MIFARE_Key key;
  lcd.setCursor(0,2);
  lcd.print("Annunciarsi !!!");
  for (byte i = 0; i < 6; i++) 
  {
    key.keyByte[i] = 0xFF;
  }
  //Controlla che si annunci una nuova chiave
  if ( ! mfrc522.PICC_IsNewCardPresent()) 
  {
    return;
  }
  //Selezionato una chiave
  if ( ! mfrc522.PICC_ReadCardSerial()) 
  {
    return;
  }

  // Con la selezione di una chiave emette un bip !
  digitalWrite(7, HIGH);
  delay(100);
  digitalWrite(7, LOW);

  // Una nuova chiave è stata selezionata. L'UID e SAK sono in mfrc522.uid.

  //Restituisce il munero decimale dell'ID della chiave sommando i 4 blocchi di numeri
  IDCarta=0;
  for (byte i = 0; i < mfrc522.uid.size; i++) 
  {
    if (i==0){IDCarta=(mfrc522.uid.uidByte[i]);}
    if (i==1){IDCarta+=(mfrc522.uid.uidByte[i]);}
    if (i==2){IDCarta+=(mfrc522.uid.uidByte[i]);}
    if (i==3){IDCarta+=(mfrc522.uid.uidByte[i]);}
  }

  // Mostra il numero della chiave, questo codice sarà da eliminare!
  lcd.clear();
  lcd.setCursor(0,2);
  lcd.print(IDCarta);
  delay(2000);

  PadroneChiave(); //Verifica a chi appartiene la chiave

  lcd.clear();
  lcd.setCursor(0,0);
  lcd.setCursor(0,1);
  lcd.print("Ciao ");lcd.print(nome);
  lcd.setCursor(0,2);
  lcd.print("Codice: ");lcd.print(codice); //Questo non dovrà essere mostrato è solo per il test
  delay(2000);

  //Inserimento codice di sicurezza
  errore=3; //Numero di volte che si può sbaglire l'inserimento del codice
  caratterimax=6;//lunghezza massima caratteri della stringa n° + 1
  stringa="";
  while(stringa!=codice)
  {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Inserisci codice");
    lcd.setCursor(0,1);
    lcd.print("max ");lcd.print(caratterimax+1);lcd.print(" caratteri");

    InserisceStringa(); //Void per la lettura del tastierino

    if(stringa=="A"){break;}
    if(stringa=="B"){break;}
    if(stringa=="C"){break;}
    if(stringa=="D"){break;}

    if(i<=3) // Il codice deve essere al minimo di 4 caratteri
    {
      lcd.clear();
      lcd.setCursor(0, 1);
      lcd.print("Codice troppo corto");
      lcd.setCursor(0, 2);
      lcd.print("minimo 4 lettere !");
      delay(2000);
      stringa="";
    } 

    if((stringa!=codice)&&(i>3))
    {
      errore--;
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Codice ERRATO !!");
      lcd.setCursor(0, 1);
      lcd.print("Riprova -"); lcd.print(errore);
      delay(2000);
      if(errore==0){break;}
      stringa=""; 
    }
  }

  if(stringa=="A")//è stato scelto il tasto A
  //La lettera A non è utilizzata
  {
    lcd.clear(); 
    lcd.setCursor(0, 0);
    lcd.print("Hai scelto > A <");
    lcd.setCursor(0, 1);
    lcd.print("Tasto non utilizzato !!!");
    delay(2000);
  }

  if(stringa=="B") //La lettera B non è utilizzata
  {
    lcd.clear(); 
    lcd.setCursor(0, 0);
    lcd.print("Hai scelto > B <");
    lcd.setCursor(0, 1);
    lcd.print("Tasto non utilizzato !!!");
    delay(2000);
  }

  if(stringa=="C")//La lettera C non è utilizzata
  {
    lcd.clear(); 
    lcd.setCursor(0, 0);
    lcd.print("Hai scelto > C <");
    lcd.setCursor(0, 1);
    lcd.print("Tasto non utilizzato !!!");
    delay(2000);
  }
  if(stringa=="D")// Scegliendo la lettera D si interrompe l'immissione
  {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Hai scelto STOP!");
    lcd.setCursor(0, 1);
    lcd.print("Devi riannunciarti !");
    delay(2000);
  }
  //Se il codice corrisponde, attiva il PIN dove si può allacciare per esempio il meccanismo d'apertura di una porta (per la durarta di 3 secondi)
  if(stringa==codice)
  {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Puoi entrare");
    digitalWrite(PinEntrata, HIGH);
    delay(3000);
    digitalWrite(PinEntrata, LOW);
  }

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("FINE FINE FINE FINE");
  delay(2000);
}

//Inserisce una stringa tramite tastierino
void InserisceStringa()
{
  i=0;
  while(i<=caratterimax) //Lunghezza massima stringa valore variabile caratterimax + 1
  {
    char key = kpd.getKey();
    if(key) // controlla che il valore sia valido.
    {
      if(key==65){stringa="A";break;}
      if(key==66){stringa="B";break;}
      if(key==67){stringa="C";break;}
      if(key==68){stringa="D";break;}
      if(key==35){break;}//Interrompe quando si digita #
      else{stringa += key;}//Aumenta la variabile stringa con il carattere digitato
      i++;
      if(key==42){stringa=stringa.substring(0,i-2); i-=2;lcd.setCursor(i, 2);lcd.print(" ");} //Se si digita * viene cancellato l'ultima cifra
      if(i>0) //Serve a evitare spiacevoli indicazioni sul LCD se si digita * quale primo tasto
      {
        lcd.setCursor(i-1, 2);
        lcd.print(key);
        delay(200);
        lcd.setCursor(i-1, 2);
        lcd.print("*");
      }
      if(i<0){stringa=""; i=0;} //SE si è digitato * come primo tasto rimette tutto a 0
    }
  }
}

//Void per definire a chi appartiene la chiave
void PadroneChiave()
{
  if(IDCarta==538){nome="Aldo"; codice="1111111";}
  if(IDCarta==423){nome="Giovanni"; codice="2222222";}
  if(IDCarta==621){nome="Giacomo"; codice="3333333";}
}

sketch corredato dalla spiegazione che lo stesso autore ha scritto per noi:

Righe 1-11: vengono dichiarate le variabili necessarie

Riga 12: viene impostato il pin che sarà attivato quando tutte le condizioni richieste per permettere l’accesso saranno verificate.

Righe 13-17: viene impostata la scheda RFID con la libreria MFRC522.h, e definito i pin necessari pin53 > SS, pin5 > RST

Righe 18-19: viene impostato LCD con la libreria LiquidCrystal.h, e definito i pin necessari pin22 > RS, pin23 > E, pin 24 > DB4, pin25 > DB5, pin26 > DB6, pin27 > DB7,

Righe 20-31: viene impostato il tastierino 4×4 con la libreria Keypad.h, e definito i pin necessari

Riga 34: definisce il tipo di LCD

Righe 35-36: per 1 secondo si mostra sul LCD il nome dello Sketch

Righe 37-41: si inizializzano la comunicazione seriale, il bus SPI, la scheda MFRC522, il pin 7 per il Buzzer e il pin per attivare il dispositivo che permette l’accesso (Pin30)

Righe 45-47: prepara la scheda RFID, fa apparire sul LCD la scritta  “Annunciarsi !!!” e aspetta che qualcuno passi una chiave vicino al ricevitore.

Righe 48-59: seleziona la chiave e memorizza i dati tramite la libreria MFRC522.h in mfrc522.uid

Righe 60-62: al passaggio di una chiave viene attivato per 1 decimo di secondo il pin del Buzzer in modo da confermare con un avviso sonoro che la chiave è stata letta.

Rigge 63-70: per una facilità di gestione dei numeri delle chiavi, si trasformano i primi 4 Byte del ID della carta in un numero decimale che viene attribuito alla variabile IDCarta.

Righe 71-74: solo per la versione di prova !!! sarà da cancellare nella versione definitiva mostra sul LCD il numero della chiave

Riga 75: tramite la funzione PadroneChiave verifica a chi appartiene la chiave. In questa versione i dati sono memorizzati direttamente nella funzione, si potrà a volontà trovare altri metodi di memorizzazione

Righe 76-82: saluta il padrone della chiave e indica il codice (anche il codice dovrà essere nascosto in una versione definitiva)

Righe 83-85: si definiscono i parametri per l’inserimento della Password, come il numero delle volte che può essere inserita sbagliata (variabile errore) e la lunghezza massima (variabile caratterimax), impostando le variabili che saranno utilizzate per l’inserimento (variabile stringa).

Riga 86: inizia il ciclo d’inserimento codice

Righe 87-92: fa apparire sul LCD l’invito a inserire il codice e spiega quanto può essere lungo

Riga 93: rimanda alla funzione per l’inserimento della stringa di caratteri (spiegazione alle righe 175 – 198)

Righe 94-97: se si digita A, B, C o D sul tastierino, si esce dal ciclo d’inserimento del codice

Righe 98-107: controlla che il codice sia di almeno 4 caratteri, se non lo è, viene comunicato sul LCD per 2 secondi

Righe 108-119: se il codice non corrisponde lo comunica per 2 secondi sul LCD con l’indicazione di quanti tentativi d’inserimento rimangono

Riga 120: termine del ciclo d’inserimento codice

Righe 121-156: routine scelta tasti A,B,C o D, al momento viene solo indicato su LCD che il tasto scelto non è utilizzato.

Righe 157-165: se il codice corrisponde con quanto inserito, viene attivato per 3 secondi  il pin che avvia il dispositivo per permette l’accesso (Pin30)

Righe 166-169: indica per 2 secondi sul LCD che si è terminato

Riga 170: fine ciclo d’inserimento codice

Riga 171: funzione per inserire una stringa tramite tastierino

Righe 172-183: se viene digitato A, B, C, D e #,  si esce dalla funzione.

Riga 184: aumenta la variabile stringa con il numero digitato

Righe 185-186: se si digita * cancella l’ultimo numero digitato

Righe 187-194: visualizza su LCD un * al posto del numero digitato

Riga 195: serve a rimettere le variabili alla situazione iniziale, nel caso sia stato digitato * quale primo  tasto e evitare spostamenti del “cursore” nel LCD

Riga 198: termine della funzione

Righe 199-204: funzione per la lettura dei dati legati alle chiavi che hanno diritto d’accesso. In questo esempio sono salvati direttamente nella funzione, ma potrebbe essere una qualsiasi funzione che legge dati da dispositivi vari, per esempio una scheda SD.

Buon controllo accessi rfid !!!

Prima di inserire un commento, per favore, leggi il regolamento

Permanent link to this article: https://www.mauroalfieri.it/elettronica/controllo-accessi-rfid-tastierino.html

Lascia un commento

Your email address will not be published.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.