Controllo accessi RFID Arduino con display LCD 16×2
Leggiamo un badge con il modulo RC522, confrontiamo il suo UID con quello autorizzato e mostriamo direttamente su un display LCD I2C se l’accesso è consentito oppure negato.
Introduzione
Nel progetto precedente abbiamo utilizzato un UID RFID per comandare un relè. Qui aggiungiamo una vera e propria interfaccia utente: un display LCD 16×2 comunica con Arduino tramite I2C e informa immediatamente l’utente sull’esito della lettura.
Quando avvicini un badge al lettore RC522, Arduino ne legge l’UID, lo confronta con quello memorizzato nel programma e visualizza Accesso consentito oppure Accesso negato.
- leggere un badge RFID con RC522;
- confrontare correttamente un UID;
- utilizzare un display LCD 16×2 tramite I2C;
- gestire messaggi e stati dell’interfaccia;
- combinare periferiche SPI e I2C nello stesso progetto.
Materiale necessario
🧰 Non hai ancora i componenti?
Un kit Arduino per principianti contiene molti dei componenti utilizzati nei progetti del sito.
Vedi il kit Arduino consigliato →Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.📘 Vuoi imparare Arduino passo dopo passo?
Nei miei libri trovi spiegazioni, schemi e numerosi progetti pratici dedicati ad Arduino.
Scopri i miei libri su Arduino →Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.Schema di collegamento
📡 RFID RC522
- SDA / SS → pin 10
- SCK → pin 13
- MOSI → pin 11
- MISO → pin 12
- RST → pin 9
- GND → GND
- 3.3V → 3.3V
📟 LCD 16×2 I2C
- VCC → 5V
- GND → GND
- SDA → A4
- SCL → A5

Librerie necessarie
Installa MFRC522 e una libreria LiquidCrystal_I2C compatibile con il costruttore usato nel codice. Le librerie SPI e Wire fanno normalmente parte dell’ambiente Arduino.
Prima di caricare il codice
L’UID DE:AD:BE:EF è soltanto un esempio. Sostituiscilo con quello del tuo badge. Ho inoltre corretto il confronto dell’UID: oltre ai singoli byte viene verificata anche la sua lunghezza.
Codice Arduino
La versione migliorata evita il delay(2000) del codice originale. Il messaggio rimane sul display per due secondi, ma Arduino continua a eseguire il programma e poi riporta automaticamente l’LCD alla schermata di attesa.
// ============================================
// Progetto 114 - Controllo accessi RFID + LCD
// RC522 + display LCD 16x2 I2C
// ============================================
#include <SPI.h>
#include <MFRC522.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 rfid(SS_PIN, RST_PIN);
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Sostituisci con l'UID del tuo badge
const byte uidAutorizzato[] = {
0xDE, 0xAD, 0xBE, 0xEF
};
const byte lunghezzaUID =
sizeof(uidAutorizzato) / sizeof(uidAutorizzato[0]);
const unsigned long durataMessaggio = 2000UL;
bool messaggioAttivo = false;
unsigned long ritornoAttesaA = 0;
void schermataAttesa() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sistema RFID");
lcd.setCursor(0, 1);
lcd.print("Avvicina badge");
}
bool badgeAutorizzato() {
if (rfid.uid.size != lunghezzaUID) {
return false;
}
for (byte i = 0; i < lunghezzaUID; i++) {
if (rfid.uid.uidByte[i] != uidAutorizzato[i]) {
return false;
}
}
return true;
}
void stampaUID() {
Serial.print("UID: ");
for (byte i = 0; i < rfid.uid.size; i++) {
if (rfid.uid.uidByte[i] < 0x10) {
Serial.print("0");
}
Serial.print(rfid.uid.uidByte[i], HEX);
if (i < rfid.uid.size - 1) {
Serial.print(":");
}
}
Serial.println();
}
void mostraEsito(bool autorizzato) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Accesso");
lcd.setCursor(0, 1);
if (autorizzato) {
lcd.print("consentito");
Serial.println("ACCESSO CONSENTITO");
} else {
lcd.print("negato");
Serial.println("ACCESSO NEGATO");
}
messaggioAttivo = true;
ritornoAttesaA = millis() + durataMessaggio;
}
void setup() {
Serial.begin(9600);
SPI.begin();
rfid.PCD_Init();
lcd.init();
lcd.backlight();
schermataAttesa();
Serial.println("Sistema RFID pronto");
}
void loop() {
unsigned long ora = millis();
// Ripristina la schermata di attesa
if (messaggioAttivo && ora >= ritornoAttesaA) {
messaggioAttivo = false;
schermataAttesa();
}
// Durante il messaggio non accettiamo un nuovo badge
if (messaggioAttivo) {
return;
}
if (!rfid.PICC_IsNewCardPresent()) {
return;
}
if (!rfid.PICC_ReadCardSerial()) {
return;
}
stampaUID();
bool autorizzato = badgeAutorizzato();
mostraEsito(autorizzato);
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
}Come funziona
Attesa del badge
All’avvio l’LCD mostra “Sistema RFID” e invita ad avvicinare un badge.
Lettura dell’UID
Il RC522 comunica con Arduino tramite SPI e acquisisce l’identificatore del tag.
Verifica
Arduino controlla lunghezza e byte dell’UID confrontandoli con il valore autorizzato.
Messaggio sul display
L’LCD mostra “Accesso consentito” oppure “Accesso negato” per circa due secondi.
Nuova lettura
Terminato il tempo, il display torna automaticamente alla schermata di attesa.
UID RFID e sicurezza
Il confronto dell’UID è molto utile per imparare come funziona la logica di autorizzazione, ma non rappresenta da solo un sistema di autenticazione sicuro.

