Lettore di schede RFID RC522 per ESP32 (con LCD)
In questo progetto collegheremo il modulo RFID RC522 basato su MFRC522 all'ESP32 tramite SPI per leggere l'UID della tessera o dell'etichetta. Costituisce la base per applicazioni quali serrature, sistemi di abbonamento e controllo degli accessi. Visualizzeremo l'UID letto su un display LCD; questa versione non lo confronta con un elenco di tessere autorizzate. **ATTENZIONE:** l'RC522 funziona solo a **3,3 V**; a 5 V il modulo si brucerà!

Video
Schema circuito

Codice sorgente
1// ─────────────────────────────────────────
2// BlueGrays · bluegrays.com
3// Lettore di schede RFID RC522 per ESP32 (con LCD)
4// ─────────────────────────────────────────
5// Legge il modulo RFID RC522 via SPI; l'UID di una carta scansionata è
6// mostrato in HEX sull'LCD I2C 16x2 per 3 s, poi ritorna la schermata
7// "scan a card".
8//
9// Pin:
10// GPIO 5 -> SDA (SS) dell'RC522
11// GPIO 18 -> SCK dell'RC522, GPIO 19 -> MISO dell'RC522, GPIO 23 -> MOSI dell'RC522
12// GPIO 27 -> RST dell'RC522
13// GPIO 21 -> SDA dell'LCD, GPIO 22 -> SCL dell'LCD
14// RC522 3.3V -> 3.3V dell'RC522 -> 3V3, IRQ resta scollegato
15// LCD VCC -> VCC dell'LCD -> 5V (VIN), tutti i GND in comune
16
17#include <Wire.h>
18#include <LiquidCrystal_I2C.h>
19#include <SPI.h>
20#include <MFRC522.h>
21
22// Definizione dei pin
23const int RST_PIN = 27; // RST dell'RC522
24const int SS_PIN = 5; // SDA (SS) dell'RC522
25
26// I pin SPI sono quelli predefiniti di VSPI
27MFRC522 rfid(SS_PIN, RST_PIN);
28LiquidCrystal_I2C lcd(0x27, 16, 2); // Indirizzo dell'LCD 0x27 o 0x3F
29
30unsigned long lastScan = 0; // Ora dell'ultima scansione (ms)
31const unsigned long DISPLAY_HOLD = 3000; // Tempo di visualizzazione dell'UID (ms)
32bool showingCard = false; // C'è un UID sullo schermo?
33
34// Schermata di attesa
35void showWaitMessage() {
36 lcd.clear();
37 lcd.setCursor(0, 0);
38 lcd.print("Kart okutun");
39 lcd.setCursor(0, 1);
40 lcd.print("Scan a card");
41}
42
43void setup() {
44 Wire.begin(21, 22); // I2C: SDA=21, SCL=22
45 lcd.init();
46 lcd.backlight();
47
48 // Schermata iniziale 3 s
49 lcd.setCursor(3, 0);
50 lcd.print("BlueGrays");
51 lcd.setCursor(3, 1);
52 lcd.print("RFID v1.0");
53 delay(3000);
54
55 // Avviare l'SPI e l'RC522
56 SPI.begin();
57 rfid.PCD_Init();
58 delay(50);
59
60 showWaitMessage();
61}
62
63void loop() {
64 // Quando il tempo è scaduto, tornare alla schermata di attesa
65 if (showingCard && millis() - lastScan > DISPLAY_HOLD) {
66 showWaitMessage();
67 showingCard = false;
68 }
69
70 // Uscire se non c'è una nuova carta o non si può leggere
71 if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) {
72 delay(50);
73 return;
74 }
75
76 // Stampare l'UID in HEX, ad es. 0A:1B:2C:3D
77 lcd.clear();
78 lcd.setCursor(0, 0);
79 lcd.print("Kart UID:");
80 lcd.setCursor(0, 1);
81 for (byte i = 0; i < rfid.uid.size; i++) {
82 if (rfid.uid.uidByte[i] < 0x10) lcd.print("0");
83 lcd.print(rfid.uid.uidByte[i], HEX);
84 // Nessun separatore per un UID di 7 byte: 14 caratteri stanno nella riga
85 if (rfid.uid.size <= 5 && i < rfid.uid.size - 1) lcd.print(":");
86 }
87
88 lastScan = millis();
89 showingCard = true;
90
91 // Fermare la carta e interrompere la cifratura
92 rfid.PICC_HaltA();
93 rfid.PCD_StopCrypto1();
94}
95
FAQ
Con quali pin devo collegare l'RC522 all'ESP32?▾
Vengono utilizzati i pin SPI predefiniti dell'ESP32: SCK = GPIO 18, MISO = GPIO 19, MOSI = GPIO 23. Per SDA (SS) e RST, utilizzare i pin indicati nel codice (ad es. 5 e 27); la tensione di alimentazione deve essere necessariamente di 3,3 V.
LCD e RFID funzionano contemporaneamente?▾
Sì. Poiché l'LCD utilizza l'interfaccia I2C (GPIO 21/22) e l'RC522 utilizza la linea SPI, non si interferiscono a vicenda; le due linee di comunicazione separate funzionano contemporaneamente.
Perché l'UID è di 4 byte in alcune schede e di 7 in altre?▾
Le tessere MIFARE Classic utilizzano in genere un UID di 4 byte, mentre i tag MIFARE Ultralight e NTAG utilizzano un UID di 7 byte. Quando effettui un confronto, devi verificare anche la lunghezza dell'UID.
Posso aggiungere le tessere autorizzate senza modificare il codice?▾
Sì, puoi scrivere un modulo che, quando viene letta la "scheda amministratore", aggiunga la scheda successiva all'elenco; puoi salvare l'elenco nella memoria permanente tramite le Preferenze.
