ESP32 RFID RC522 Kart Okuyucu (LCD Ekranlı)
Bu projede MFRC522 tabanlı RC522 RFID modülünü ESP32'ye SPI üzerinden bağlayıp kart/etiket UID'sini okuyacağız. Kapı kilidi, üyelik sistemi ve giriş kontrolü gibi uygulamaların temelini oluşturur. Okunan UID'yi LCD ekranda göstereceğiz; bu sürümde yetkili kart listesiyle karşılaştırma yapılmaz. **DİKKAT:** RC522 sadece **3.3V** ile çalışır, 5V verirseniz modül yanar!

Video
Devre Şeması

Kaynak Kodu
1// ─────────────────────────────────────────
2// BlueGrays · bluegrays.com
3// ESP32 RFID RC522 Kart Okuyucu (LCD Ekranlı)
4// ─────────────────────────────────────────
5// RC522 RFID modülü SPI ile okunur; okutulan kartın UID'si 16x2 I2C LCD'de
6// HEX olarak 3 sn gösterilir, sonra "Kart okutun" ekranına dönülür.
7//
8// Pinler:
9// GPIO 5 -> RC522 SDA (SS)
10// GPIO 18 -> RC522 SCK, GPIO 19 -> RC522 MISO, GPIO 23 -> RC522 MOSI
11// GPIO 27 -> RC522 RST
12// GPIO 21 -> LCD SDA, GPIO 22 -> LCD SCL
13// RC522 3.3V -> 3V3, IRQ boş kalır
14// LCD VCC -> 5V (VIN), tüm GND'ler ortak
15
16#include <Wire.h>
17#include <LiquidCrystal_I2C.h>
18#include <SPI.h>
19#include <MFRC522.h>
20
21// Pin tanımları
22const int RST_PIN = 27; // RC522 RST
23const int SS_PIN = 5; // RC522 SDA (SS)
24
25// SPI pinleri VSPI varsayılanı: SCK 18, MISO 19, MOSI 23
26MFRC522 rfid(SS_PIN, RST_PIN);
27LiquidCrystal_I2C lcd(0x27, 16, 2); // LCD adresi 0x27, bazen 0x3F
28
29unsigned long lastScan = 0; // Son okuma zamanı (ms)
30const unsigned long DISPLAY_HOLD = 3000; // UID ekranda kalma süresi (ms)
31bool showingCard = false; // Ekranda UID var mı
32
33// Bekleme ekranı
34void showWaitMessage() {
35 lcd.clear();
36 lcd.setCursor(0, 0);
37 lcd.print("Kart okutun");
38 lcd.setCursor(0, 1);
39 lcd.print("Scan a card");
40}
41
42void setup() {
43 Wire.begin(21, 22); // I2C: SDA=21, SCL=22
44 lcd.init();
45 lcd.backlight();
46
47 // Açılış ekranı 3 sn
48 lcd.setCursor(3, 0);
49 lcd.print("BlueGrays");
50 lcd.setCursor(3, 1);
51 lcd.print("RFID v1.0");
52 delay(3000);
53
54 // SPI ve RC522'yi başlat
55 SPI.begin();
56 rfid.PCD_Init();
57 delay(50);
58
59 showWaitMessage();
60}
61
62void loop() {
63 // Süre dolunca bekleme ekranına dön
64 if (showingCard && millis() - lastScan > DISPLAY_HOLD) {
65 showWaitMessage();
66 showingCard = false;
67 }
68
69 // Yeni kart yoksa ya da okunamadıysa çık
70 if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) {
71 delay(50);
72 return;
73 }
74
75 // UID'yi HEX olarak yaz, örnek 0A:1B:2C:3D
76 lcd.clear();
77 lcd.setCursor(0, 0);
78 lcd.print("Kart UID:");
79 lcd.setCursor(0, 1);
80 for (byte i = 0; i < rfid.uid.size; i++) {
81 if (rfid.uid.uidByte[i] < 0x10) lcd.print("0");
82 lcd.print(rfid.uid.uidByte[i], HEX);
83 // 7 baytlık UID'de ayırıcı yok: 14 karakter satıra sığar
84 if (rfid.uid.size <= 5 && i < rfid.uid.size - 1) lcd.print(":");
85 }
86
87 lastScan = millis();
88 showingCard = true;
89
90 // Kartı beklemeye al, şifrelemeyi bitir
91 rfid.PICC_HaltA();
92 rfid.PCD_StopCrypto1();
93}
94
Sıkça Sorulanlar
RC522'yi ESP32'ye hangi pinlerle bağlarım?▾
ESP32'nin varsayılan SPI pinleri kullanılır: SCK = GPIO 18, MISO = GPIO 19, MOSI = GPIO 23. SDA (SS) ve RST için koddaki pinleri (ör. 5 ve 27) kullan; besleme mutlaka 3,3 V olmalı.
LCD ve RFID aynı anda çalışır mı?▾
Evet. LCD I2C (GPIO 21/22), RC522 ise SPI hattını kullandığı için birbirini etkilemez; iki ayrı haberleşme hattı aynı anda çalışır.
UID neden bazı kartlarda 4, bazılarında 7 bayt?▾
MIFARE Classic kartlar genelde 4 baytlık, MIFARE Ultralight ve NTAG etiketler 7 baytlık UID kullanır. Karşılaştırma yaparken UID uzunluğunu da kontrol etmelisin.
Yetkili kartları kod değiştirmeden ekleyebilir miyim?▾
Evet, 'yönetici kartı' okutulunca bir sonraki kartı listeye ekleyen bir mod yazabilir, listeyi Preferences ile kalıcı belleğe kaydedebilirsin.
