#123Intermédiaire

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 !

4.8(21)
38 terminé
Lecteur de cartes RFID RC522 pour ESP32 (avec LCD)
Tu t'es déjà demandé comment une porte te reconnaît quand tu passes ta carte ou ton badge d'immeuble ? Approche une carte du lecteur RFID : l'ESP32 lit son numéro d'identité unique et l'affiche sur un petit écran LCD, puis quelques secondes plus tard l'écran attend la carte suivante. C'est le premier pas vers des projets comme une porte à badge ou un système de pointage.

Vidéo

Schéma du circuit

Lecteur de cartes RFID RC522 pour ESP32 (avec LCD) - Circuit

Code source

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

Lecteur RFID RC522 pour ESP32 (avec LCD) | BlueGrays