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.
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
🧰 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 consigliatoLink 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 ArduinoLink di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.
Schema del circuito
Schema con lettore RC522, LED verde, LED rosso e pulsante.
Collegamenti RC522
| RC522 | Arduino Uno |
|---|---|
| SDA / SS | D10 |
| SCK | D13 |
| MOSI | D11 |
| MISO | D12 |
| RST | D9 |
| 3.3V | 3.3V |
| GND | GND |
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.
/*
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();
}
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.
Inserire l’UID della tessera MASTER
Nel programma principale sostituisci i valori dell’array MASTER_UID con quelli letti dalla tua tessera:
const byte MASTER_UID[5] = {
252, 162, 51, 59, 86
};
Programma completo
/*
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.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
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.

