#123Intermedio

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à!

4.8(21)
38 completato
Lettore di schede RFID RC522 per ESP32 (con LCD)
Ti sei mai chiesto come fa una porta a riconoscerti quando avvicini la tessera della scuola o il portachiavi del condominio? Avvicinando una tessera al lettore RFID, l'ESP32 legge il suo numero identificativo unico e lo mostra su un piccolo schermo LCD; dopo qualche secondo lo schermo torna ad aspettare la tessera successiva. È il primo passo verso progetti come una porta a tessera o un registro presenze.

Video

Schema circuito

Lettore di schede RFID RC522 per ESP32 (con LCD) - Circuit

Codice sorgente

Arduino (C++)
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.

Lettore RFID RC522 per ESP32 (con LCD) | BlueGrays