Progetto #114 • RFID + LCD I2C

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.

Difficoltà★★★☆☆ Media
Tempo40–55 minuti
ConcettiRFID • I2C • UID

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.

Cosa imparerai
  • 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

1× Arduino UNO
1× modulo RFID RC522
1× badge o tag RFID compatibile
1× LCD 16×2 con interfaccia I2C
Cavi jumper
Breadboard opzionale

🧰 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
Schema Arduino RFID RC522 con display LCD I2C 16x2
Attenzione: il modulo RC522 lavora a 3,3 V. Collegane l’alimentazione al pin 3.3V di Arduino, non al 5V.

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.

Indirizzo LCD: nel codice utilizziamo 0x27. Alcuni moduli I2C utilizzano un indirizzo diverso, spesso 0x3F. Se il display non mostra nulla, verifica l’indirizzo con uno scanner I2C e controlla anche la regolazione del contrasto.

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 — RFID RC522 + LCD I2C
// ============================================
// 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

1

Attesa del badge

All’avvio l’LCD mostra “Sistema RFID” e invita ad avvicinare un badge.

2

Lettura dell’UID

Il RC522 comunica con Arduino tramite SPI e acquisisce l’identificatore del tag.

3

Verifica

Arduino controlla lunghezza e byte dell’UID confrontandoli con il valore autorizzato.

4

Messaggio sul display

L’LCD mostra “Accesso consentito” oppure “Accesso negato” per circa due secondi.

5

Nuova lettura

Terminato il tempo, il display torna automaticamente alla schermata di attesa.

Concetto chiave: Arduino UNO può gestire contemporaneamente periferiche che usano bus diversi: il lettore RFID comunica tramite SPI, mentre il display utilizza I2C.

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.

Progetto didattico: alcuni identificatori RFID possono essere replicati o emulati. Per proteggere realmente un accesso non bisogna affidarsi al solo UID del tag.

Varianti possibili

🔓 Aggiungi un relè

Attiva un’uscita quando il badge viene riconosciuto.

🔴🟢 LED di stato

Verde per accesso consentito e rosso per accesso negato.

🔔 Buzzer

Aggiungi un feedback acustico differente per i due risultati.

👥 Più badge

Gestisci nel prototipo un elenco di UID autorizzati.