Lecteur de cartes RFID RC522 pour ESP32 (avec LCD)
Dans ce projet, nous allons connecter le module RFID RC522 basé sur le MFRC522 à l'ESP32 via SPI afin de lire l'UID d'une carte ou d'un badge. Cela constitue la base d'applications telles que les serrures de porte, les systèmes d'adhésion et le contrôle d'accès. Nous afficherons l'UID lu sur un écran LCD ; cette version ne le compare pas à une liste de cartes autorisées. **ATTENTION :** le RC522 fonctionne uniquement en **3,3 V** ; 5 V grillerait le module !

Vidéo
Schéma du circuit

Code source
1// ─────────────────────────────────────────
2// BlueGrays · bluegrays.com
3// Lecteur de cartes RFID RC522 pour ESP32 (avec LCD)
4// ─────────────────────────────────────────
5// Lit le module RFID RC522 en SPI ; l'UID d'une carte scannée s'affiche en
6// HEX sur le LCD I2C 16x2 pendant 3 s, puis l'écran "scanne une carte"
7// revient.
8//
9// Broches :
10// GPIO 5 -> SDA (SS) du RC522
11// GPIO 18 -> SCK du RC522, GPIO 19 -> MISO du RC522, GPIO 23 -> MOSI du RC522
12// GPIO 27 -> RST du RC522
13// GPIO 21 -> SDA du LCD, GPIO 22 -> SCL du LCD
14// RC522 3.3V -> 3.3V du RC522 -> 3V3, IRQ laissée non connectée
15// LCD VCC -> VCC du LCD -> 5V (VIN), tous les GND en commun
16
17#include <Wire.h>
18#include <LiquidCrystal_I2C.h>
19#include <SPI.h>
20#include <MFRC522.h>
21
22// Définitions des broches
23const int RST_PIN = 27; // RST du RC522
24const int SS_PIN = 5; // SDA (SS) du RC522
25
26// Les broches SPI sont celles par défaut du VSPI
27MFRC522 rfid(SS_PIN, RST_PIN);
28LiquidCrystal_I2C lcd(0x27, 16, 2); // Adresse du LCD 0x27 ou 0x3F
29
30unsigned long lastScan = 0; // Heure du dernier balayage (ms)
31const unsigned long DISPLAY_HOLD = 3000; // Durée d'affichage de l'UID (ms)
32bool showingCard = false; // Un UID est-il à l'écran
33
34// Écran d'attente
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 // Écran d'accueil 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 // Démarrer le SPI et le RC522
56 SPI.begin();
57 rfid.PCD_Init();
58 delay(50);
59
60 showWaitMessage();
61}
62
63void loop() {
64 // Quand le temps est écoulé, revenir à l'écran d'attente
65 if (showingCard && millis() - lastScan > DISPLAY_HOLD) {
66 showWaitMessage();
67 showingCard = false;
68 }
69
70 // Quitter s'il n'y a pas de nouvelle carte ou si elle est illisible
71 if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) {
72 delay(50);
73 return;
74 }
75
76 // Afficher l'UID en HEX, par ex. 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 // Pas de séparateur pour un UID de 7 octets : 14 caractères tiennent sur la ligne
85 if (rfid.uid.size <= 5 && i < rfid.uid.size - 1) lcd.print(":");
86 }
87
88 lastScan = millis();
89 showingCard = true;
90
91 // Mettre la carte en halt et arrêter le chiffrement
92 rfid.PICC_HaltA();
93 rfid.PCD_StopCrypto1();
94}
95
FAQ
À quelles broches dois-je connecter le RC522 sur l'ESP32 ?▾
On utilise les broches SPI par défaut de l'ESP32 : SCK = GPIO 18, MISO = GPIO 19, MOSI = GPIO 23. Pour les broches SDA (SS) et RST, utilisez celles indiquées dans le code (par exemple 5 et 27) ; la tension d'alimentation doit impérativement être de 3,3 V.
Le LCD et la RFID fonctionnent-ils en même temps ?▾
Oui. L'écran LCD I2C (GPIO 21/22) et le RC522 n'interfèrent pas l'un avec l'autre, car ce dernier utilise la bus SPI ; les deux bus de communication fonctionnent simultanément.
Pourquoi l'UID fait-il 4 octets sur certaines cartes et 7 sur d'autres ?▾
Les cartes MIFARE Classic utilisent généralement un UID de 4 octets, tandis que les étiquettes MIFARE Ultralight et NTAG utilisent un UID de 7 octets. Lorsque tu effectues une comparaison, tu dois également vérifier la longueur de l'UID.
Puis-je ajouter des cartes autorisées sans modifier le code ?▾
Oui, tu peux écrire un module qui ajoute la carte suivante à la liste lorsque la « carte d'administrateur » est lue, et enregistrer cette liste dans la mémoire permanente via les Préférences.
