🔐 Arduino • RFID • RC522

RFID RC522 con Arduino: accendere un LED e memorizzare fino a 3 TAG

Leggiamo tessere e tag RFID con il modulo RC522, impostiamo una chiave MASTER e memorizziamo fino a tre TAG nella EEPROM di Arduino per controllare un LED verde.

DifficoltàIntermedia
Tempo35–45 minuti
Cosa impariRFID, UID ed EEPROM
In poche parole: un TAG autorizzato cambia lo stato del LED verde a ogni passaggio. Un TAG sconosciuto accende temporaneamente il LED rosso. La tessera MASTER permette invece di registrare nuovi TAG o cancellare quelli salvati.

Cosa imparerai

  • come collegare il lettore RFID RC522 ad Arduino Uno;
  • come leggere l’UID di una tessera;
  • come riconoscere una tessera MASTER;
  • come memorizzare UID nella EEPROM;
  • come autorizzare fino a tre TAG;
  • come realizzare una logica toggle per accendere e spegnere un’uscita.

Video dimostrativo

Materiale necessario

🔌 Arduino Uno
📡 Lettore RFID RC522
💳 Almeno 2 tessere o TAG RFID
🟢 1 LED verde
🔴 1 LED rosso
Ω 2 resistenze da 220 Ω
🔘 1 pulsante
🔗 Cavetti e breadboard

🧰 Kit Arduino consigliato

Un kit completo è utile per avere breadboard, cavetti, resistenze, LED e molti componenti di base per sperimentare con Arduino.

👉 Guarda 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?

Se vuoi approfondire e realizzare progetti più completi, puoi dare un’occhiata anche ai miei libri dedicati ad Arduino. All’interno troverai spiegazioni semplici, schemi chiari e molti progetti pratici pensati per chi parte da zero.

👉 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 del circuito

Schema Arduino RFID RC522 accensione LED

Schema con lettore RC522, LED verde, LED rosso e pulsante.

Collegamenti RC522

RC522Arduino Uno
SDA / SSD10
SCKD13
MOSID11
MISOD12
RSTD9
3.3V3.3V
GNDGND
Importante: il modulo RC522 lavora a 3,3 V. Non alimentarlo dal pin 5 V di Arduino.

Prima fase: leggere l’UID della tessera MASTER

Prima di usare il programma completo devi conoscere l’UID della tessera che fungerà da MASTER. Installa la libreria RFID e carica lo sketch di lettura.

⬇️ Scarica la libreria RFID

Sketch per leggere l’UID
/*
  LETTURA UID RFID RC522

  Collegamenti RC522 con Arduino Uno:
  SDA / SS -> D10
  SCK      -> D13
  MOSI     -> D11
  MISO     -> D12
  RST      -> D9
  3.3V     -> 3.3V
  GND      -> GND

  Lo sketch stampa sul Monitor Seriale il codice
  della tessera/tag in formato decimale ed esadecimale.
*/

#include <SPI.h>
#include <RFID.h>

#define SS_PIN 10
#define RST_PIN 9

RFID rfid(SS_PIN, RST_PIN);

// Memorizza l'ultimo UID letto
int ultimoUid[5] = {-1, -1, -1, -1, -1};

void setup() {

  Serial.begin(9600);

  SPI.begin();
  rfid.init();

  Serial.println("Avvicina una tessera o un tag RFID...");
}

void loop() {

  // Controlla se è presente una tessera
  if (!rfid.isCard()) {
    return;
  }

  // Legge il seriale della tessera
  if (!rfid.readCardSerial()) {
    return;
  }

  bool nuovoTag = false;

  for (byte i = 0; i < 5; i++) {
    if (rfid.serNum[i] != ultimoUid[i]) {
      nuovoTag = true;
      break;
    }
  }

  if (nuovoTag) {

    Serial.println();
    Serial.println("Tessera rilevata");

    Serial.print("Dec: ");

    for (byte i = 0; i < 5; i++) {
      ultimoUid[i] = rfid.serNum[i];
      Serial.print(rfid.serNum[i], DEC);

      if (i < 4) {
        Serial.print(", ");
      }
    }

    Serial.println();

    Serial.print("Hex: ");

    for (byte i = 0; i < 5; i++) {
      Serial.print(rfid.serNum[i], HEX);

      if (i < 4) {
        Serial.print(", ");
      }
    }

    Serial.println();
  }

  rfid.halt();
}
Lettura UID RFID RC522 Monitor Seriale

Esempio di UID mostrato sul Monitor Seriale. L’immagine mantiene una larghezza massima di 441 px.

Apri il Monitor Seriale a 9600 baud e avvicina la tessera. Annota i cinque valori decimali dell’UID.

⬇️ Scarica cardread.ino

Inserire l’UID della tessera MASTER

Nel programma principale sostituisci i valori dell’array MASTER_UID con quelli letti dalla tua tessera:

UID MASTER di esempio
const byte MASTER_UID[5] = {
  252, 162, 51, 59, 86
};

Programma completo

RFID RC522 + EEPROM + LED
/*
  RFID RC522: ACCENSIONE / SPEGNIMENTO LED CON TAG MEMORIZZATI

  Funzioni:
  - una tessera MASTER abilita la modalità registrazione
  - si possono memorizzare fino a 3 TAG nella EEPROM
  - un TAG autorizzato alterna LED verde ON/OFF
  - un TAG non autorizzato accende temporaneamente il LED rosso
  - il pulsante reset cancella i TAG solo quando è attiva
    la modalità MASTER

  Collegamenti RC522:
  SDA / SS -> D10
  RST      -> D9
  MOSI     -> D11
  MISO     -> D12
  SCK      -> D13
  Alimentazione RC522 -> 3.3 V

  LED verde -> D7
  LED rosso -> D2
  Pulsante reset -> D6
*/

#include <SPI.h>
#include <RFID.h>
#include <EEPROM.h>

#define SS_PIN 10
#define RST_PIN 9

const byte LED_VERDE = 7;
const byte LED_ROSSO = 2;
const byte RESET_KEY = 6;

// UID della tessera MASTER.
// Sostituisci questi 5 valori con quelli letti
// tramite lo sketch di lettura.
const byte MASTER_UID[5] = {
  252, 162, 51, 59, 86
};

RFID rfid(SS_PIN, RST_PIN);

bool ledAcceso = false;
bool modalitaMaster = false;

// Numero di TAG slave salvati.
// EEPROM[0] contiene 0, 1, 2 oppure 3.
byte numeroTag = 0;

// UID appena letto
byte uid[5];

// Indirizzi iniziali dei tre TAG nella EEPROM
const byte TAG_ADDRESS[3] = {1, 6, 11};

void setup() {

  Serial.begin(9600);

  SPI.begin();
  rfid.init();

  pinMode(LED_VERDE, OUTPUT);
  pinMode(LED_ROSSO, OUTPUT);

  // Il pulsante usa la resistenza interna:
  // premuto = LOW.
  pinMode(RESET_KEY, INPUT_PULLUP);

  digitalWrite(LED_VERDE, LOW);
  digitalWrite(LED_ROSSO, LOW);

  numeroTag = EEPROM.read(0);

  // Protezione nel caso la EEPROM contenga un valore non valido
  if (numeroTag > 3) {
    numeroTag = 0;
    EEPROM.update(0, 0);
  }

  stampaPronto();
}

void loop() {

  // ----------------------------------------------------
  // RESET TAG:
  // consentito soltanto quando la modalità MASTER è attiva
  // ----------------------------------------------------
  if (modalitaMaster && digitalRead(RESET_KEY) == LOW) {

    cancellaTag();

    modalitaMaster = false;

    Serial.println("TAG memorizzati cancellati.");
    delay(500);

    stampaPronto();
  }

  // Nessuna tessera presente
  if (!rfid.isCard()) {
    return;
  }

  // Impossibile leggere l'UID
  if (!rfid.readCardSerial()) {
    return;
  }

  // Copia l'UID appena letto
  for (byte i = 0; i < 5; i++) {
    uid[i] = rfid.serNum[i];
  }

  // ----------------------------------------------------
  // 1. TESSERA MASTER
  // ----------------------------------------------------
  if (uidUguale(uid, MASTER_UID)) {

    modalitaMaster = !modalitaMaster;

    if (modalitaMaster) {
      numeroTag = EEPROM.read(0);

      Serial.println("CARD MASTER");
      Serial.println("Modalita registrazione TAG ATTIVA");
      Serial.print("TAG memorizzati: ");
      Serial.println(numeroTag);
    }
    else {
      Serial.println("Modalita registrazione TAG DISATTIVATA");
    }

    delay(1000);
    rfid.halt();
    return;
  }

  // ----------------------------------------------------
  // 2. TAG GIA' AUTORIZZATO
  // ----------------------------------------------------
  if (tagAutorizzato(uid)) {

    ledAcceso = !ledAcceso;

    digitalWrite(
      LED_VERDE,
      ledAcceso ? HIGH : LOW
    );

    if (ledAcceso) {
      Serial.println("TAG valido: LED VERDE ACCESO");
    }
    else {
      Serial.println("TAG valido: LED VERDE SPENTO");
    }

    delay(800);
    rfid.halt();
    return;
  }

  // ----------------------------------------------------
  // 3. MODALITA MASTER: MEMORIZZA UN NUOVO TAG
  // ----------------------------------------------------
  if (modalitaMaster) {

    if (numeroTag < 3) {

      salvaTag(numeroTag, uid);

      numeroTag++;

      EEPROM.update(0, numeroTag);

      Serial.print("Nuovo TAG memorizzato. Totale: ");
      Serial.println(numeroTag);

      // Dopo una registrazione usciamo dalla modalità MASTER
      modalitaMaster = false;
    }
    else {
      Serial.println("Memoria piena: massimo 3 TAG.");
    }

    delay(1000);
    rfid.halt();
    return;
  }

  // ----------------------------------------------------
  // 4. TAG NON AUTORIZZATO
  // ----------------------------------------------------
  Serial.println("TAG non autorizzato");

  digitalWrite(LED_ROSSO, HIGH);
  delay(1500);
  digitalWrite(LED_ROSSO, LOW);

  rfid.halt();
}

// ------------------------------------------------------
// Confronta due UID da 5 byte
// ------------------------------------------------------
bool uidUguale(const byte a[5], const byte b[5]) {

  for (byte i = 0; i < 5; i++) {
    if (a[i] != b[i]) {
      return false;
    }
  }

  return true;
}

// ------------------------------------------------------
// Controlla se il TAG è presente nei tre slot EEPROM
// ------------------------------------------------------
bool tagAutorizzato(const byte tag[5]) {

  for (byte slot = 0; slot < numeroTag && slot < 3; slot++) {

    byte salvato[5];

    leggiTag(slot, salvato);

    if (uidUguale(tag, salvato)) {
      return true;
    }
  }

  return false;
}

// ------------------------------------------------------
// Salva un UID in uno dei tre slot EEPROM
// ------------------------------------------------------
void salvaTag(byte slot, const byte tag[5]) {

  if (slot >= 3) {
    return;
  }

  byte indirizzo = TAG_ADDRESS[slot];

  for (byte i = 0; i < 5; i++) {
    EEPROM.update(indirizzo + i, tag[i]);
  }
}

// ------------------------------------------------------
// Legge un UID salvato
// ------------------------------------------------------
void leggiTag(byte slot, byte tag[5]) {

  byte indirizzo = TAG_ADDRESS[slot];

  for (byte i = 0; i < 5; i++) {
    tag[i] = EEPROM.read(indirizzo + i);
  }
}

// ------------------------------------------------------
// Cancella contatore e tre slot TAG
// ------------------------------------------------------
void cancellaTag() {

  for (byte i = 0; i < 16; i++) {
    EEPROM.update(i, 0);
  }

  numeroTag = 0;
}

void stampaPronto() {
  Serial.println("RFID RC522 pronto.");
}

Come funziona

1. Tessera MASTER

Passando la tessera MASTER si entra o si esce dalla modalità di registrazione. In questa modalità il prossimo TAG sconosciuto può essere salvato nella EEPROM.

2. Memorizzazione di massimo 3 TAG

Ogni UID occupa cinque byte. I tre slot vengono salvati nelle posizioni EEPROM 1–5, 6–10 e 11–15, mentre l’indirizzo 0 contiene il numero di TAG registrati.

3. TAG autorizzato

Quando l’UID letto coincide con uno degli UID memorizzati, lo stato del LED verde viene invertito: acceso diventa spento e spento diventa acceso.

4. TAG non autorizzato

Se il TAG non è presente in memoria e la modalità MASTER non è attiva, il LED rosso si accende temporaneamente.

5. Reset delle chiavi

Il pulsante di reset cancella i TAG memorizzati soltanto quando è stata prima attivata la modalità MASTER. Questo evita cancellazioni accidentali.

EEPROM: il codice usa EEPROM.update() quando possibile, così una cella viene riscritta solo se il nuovo valore è diverso da quello già presente.

Scarica il programma completo

⬇️ Scarica arduino_rfid_accensione_di_un_led.ino

RFID e sicurezza

Nota: confrontare soltanto l’UID di un TAG è adatto a esperimenti e automazioni semplici, ma non equivale a un sistema di accesso ad alta sicurezza. Alcuni UID possono essere copiati o emulati con hardware specifico.

Debug rapido

  • se il lettore non risponde, controlla alimentazione a 3,3 V e collegamenti SPI;
  • se nessun TAG viene riconosciuto, verifica SDA/SS su D10 e RST su D9;
  • controlla che il Monitor Seriale sia impostato a 9600 baud;
  • se la tessera MASTER non funziona, ricontrolla tutti e cinque i byte dell’UID;
  • se un TAG non viene salvato, verifica di essere entrato nella modalità MASTER;
  • se hai già registrato tre TAG, la memoria prevista dal programma è piena.

Varianti del progetto

  • sostituire il LED verde con un modulo relè;
  • controllare una serratura elettrica tramite un circuito di potenza adeguato;
  • aggiungere un buzzer per confermare letture valide e non valide;
  • aggiungere un display LCD o OLED;
  • aumentare il numero di TAG memorizzabili;
  • aggiungere un timeout alla modalità MASTER;
  • registrare gli accessi su SD Card.

Cosa devi ricordare

  • RC522 comunica con Arduino tramite SPI.
  • Il modulo deve essere alimentato a 3,3 V.
  • La tessera MASTER abilita la registrazione dei TAG.
  • Il programma memorizza fino a tre UID nella EEPROM.
  • Un TAG autorizzato alterna lo stato del LED verde.
  • Il pulsante reset cancella i TAG solo in modalità MASTER.

Domande frequenti

Quanti TAG posso memorizzare?

In questa configurazione vengono utilizzati tre slot, quindi puoi registrare fino a tre TAG oltre alla tessera MASTER.

La tessera MASTER viene salvata nella EEPROM?

No. Il suo UID viene inserito direttamente nel codice e serve per attivare la modalità di gestione dei TAG.

Posso comandare un relè invece del LED verde?

Sì. La logica software è la stessa, ma usa un modulo relè compatibile e verifica se il suo ingresso è active HIGH oppure active LOW.

I TAG rimangono memorizzati dopo aver spento Arduino?

Sì. La EEPROM conserva i dati anche in assenza di alimentazione finché non vengono cancellati o riscritti.