
RFID Kartlı Yoklama (ESP32 + LCD)
Orta40 dkKartını okutan kişinin adı LCD'de görünür ve "girdi" ya da "çıktı" diye kaydedilir; ekran içeride kaç kişi olduğunu sayar. Kulüp, sınıf ya da atölye yoklaması için: tanımadığı kartın numarasını gösterir, sen o numarayı bir adla koddaki listeye eklersin. Breadboard gerekmez; RC522 ve LCD dişi-dişi kablolarla doğrudan ESP32'ye bağlanır.
Uygulamada adım adım yapGerekli malzemeler
1 × ESP32 Geliştirme Kartı (ESP32-WROOM-32)
1 × RFID RC522 Okuyucu ve Kart/Anahtarlık Seti
1 × 16x2 Karakter LCD Ekran (I2C modüllü)
11 × Jumper Kablo - Dişi/Dişi
Bağlantı adımları
- 1
LCD'nin gücünü bağla (GND ve VCC)

ESP32'yi breadboard'a takma: 30 pinli kart breadboard'u neredeyse tamamen kaplar. Kart masada durur, bütün bağlantılar dişi-dişi jumper kabloyla doğrudan pinlerine yapılır. Kartı USB girişi sana bakacak şekilde tut; pin adları kartın üstünde, pinlerin yanında yazar. LCD'nin arkasındaki I2C modülünün 4 pinli başlığında GND'yi ESP32'nin sol kenarında VIN'in hemen üstündeki GND pinine, VCC'yi en alttaki VIN pinine bağla. VIN, kart USB'ye takılıyken 5V verir; LCD'nin yazısı 5V ile net görünür.
- ESP32 GND (VIN'in yanındaki) → LCD GND (siyah kablo)
- ESP32 VIN (USB'nin 5V'u) → LCD VCC (kırmızı kablo)
- 2
LCD'nin I2C kablolarını bağla (SDA ve SCL)

LCD'nin SDA pinini ESP32'nin sağ kenarındaki D21 pinine, SCL pinini D22 pinine bağla. ESP32'de I2C için kullanılan pinler bunlardır; başka pin kullanırsan koddaki SDA_PIN ve SCL_PIN'i de değiştir.
- ESP32 D21 → LCD SDA (sarı kablo)
- ESP32 D22 → LCD SCL (yeşil kablo)
- 3
RC522'nin gücünü bağla (3.3V ve GND)

Okuyucunun 8 pinli başlığı çoğu kitte ayrı gelir; önce karta lehimlemen gerekebilir. Pinlere dişi-dişi kabloları tak: 3.3V'u ESP32'nin sağ kenarının en altındaki 3V3 pinine, GND'yi hemen üstündeki GND pinine bağla. DİKKAT: RC522'yi VIN'e (5V) bağlama, okuyucu bozulabilir; yalnızca 3V3 pinini kullan.
- ESP32 3V3 → RC522 3.3V (turuncu kablo)
- ESP32 GND (3V3'ün yanındaki) → RC522 GND (siyah kablo)
- 4
RC522'nin SPI kablolarını bağla

Okuyucunun SDA pinini ESP32'nin D5 pinine, SCK'yi D18'e, MOSI'yi D23'e, MISO'yu D19'a, RST'yi D4'e bağla; hepsi sağ kenarda. IRQ boş kalır. D18, D19 ve D23 ESP32'nin SPI pinleridir, değiştirme; SDA ya da RST için başka pin kullanırsan koddaki SS_PIN ya da RST_PIN'i de değiştir.
- ESP32 D5 → RC522 SDA (beyaz kablo)
- ESP32 D18 → RC522 SCK (kahverengi kablo)
- ESP32 D23 → RC522 MOSI (mavi kablo)
- ESP32 D19 → RC522 MISO (mor kablo)
- ESP32 D4 → RC522 RST (gri kablo)
Arduino kodu
// Kitaplık Yöneticisi'nden kurulacaklar:
// "MFRC522" (GithubCommunity) ve
// "LiquidCrystal I2C"
// Kart: "ESP32 Dev Module"
#include <SPI.h>
#include <MFRC522.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// RC522'nin SDA ve RST pinleri; SCK,
// MISO, MOSI ESP32'de 18, 19, 23'tür
const int SS_PIN = 5;
const int RST_PIN = 4;
// LCD'nin I2C pinleri
const int SDA_PIN = 21;
const int SCL_PIN = 22;
// Aynı kart bu süre içinde sayılmaz (ms)
const unsigned long REPEAT_GUARD = 3000;
// Mesaj ekranda bu kadar kalır (ms)
const unsigned long MESSAGE_TIME = 3000;
// Tanınan kartlar: numarası ve adı.
// Yeni kartın numarası Seri Monitörde
// yazar; buraya ekle (ad en çok 16 harf,
// LCD Türkçe harf göstermez).
struct Person {
const char* uid;
const char* name;
bool inside;
};
Person people[] = {
{"01 02 03 04", "Ayse", false},
{"11 22 33 44", "Burak", false},
{"55 66 77 88", "Elif", false},
};
const int PEOPLE = sizeof(people) / sizeof(people[0]);
MFRC522 rfid(SS_PIN, RST_PIN);
// I2C adresi çoğunda 0x27, bazısında 0x3F
LiquidCrystal_I2C lcd(0x27, 16, 2);
String lastUid = "";
unsigned long lastReadAt = 0;
unsigned long messageAt = 0;
bool showingMessage = false;
int insideCount() {
int count = 0;
for (int i = 0; i < PEOPLE; i++) {
if (people[i].inside) count++;
}
return count;
}
// Okunan kartın numarası: "01 02 03 04"
String readUid() {
String uid = "";
for (byte i = 0; i < rfid.uid.size; i++) {
if (i > 0) uid += " ";
if (rfid.uid.uidByte[i] < 0x10) uid += "0";
uid += String(rfid.uid.uidByte[i], HEX);
}
uid.toUpperCase();
return uid;
}
// Ana ekran: kart beklenir
void showIdle() {
lcd.clear();
lcd.print("Kartini okut");
lcd.setCursor(0, 1);
lcd.print("Iceride: ");
lcd.print(insideCount());
}
void setup() {
Serial.begin(115200);
Wire.begin(SDA_PIN, SCL_PIN);
lcd.init();
lcd.backlight();
SPI.begin();
rfid.PCD_Init();
// Okuyucu cevap vermiyorsa sürüm 0x00
// ya da 0xFF okunur
byte version = rfid.PCD_ReadRegister(MFRC522::VersionReg);
if (version == 0x00 || version == 0xFF) {
Serial.println("RC522 bulunamadı, kabloları kontrol et.");
lcd.print("RC522 yok!");
lcd.setCursor(0, 1);
lcd.print("Kablolara bak");
while (true) {
delay(1000);
}
}
Serial.println("Yoklama hazır: kartını okut.");
showIdle();
}
void loop() {
// Mesajın süresi dolunca ana ekrana dön
if (showingMessage && millis() - messageAt > MESSAGE_TIME) {
showingMessage = false;
showIdle();
}
if (!rfid.PICC_IsNewCardPresent()) return;
if (!rfid.PICC_ReadCardSerial()) return;
String uid = readUid();
rfid.PICC_HaltA();
// Okuyucuda duran kart iki kez sayılmaz
if (uid == lastUid && millis() - lastReadAt < REPEAT_GUARD) {
return;
}
lastUid = uid;
lastReadAt = millis();
lcd.clear();
showingMessage = true;
messageAt = millis();
int found = -1;
for (int i = 0; i < PEOPLE; i++) {
if (uid == people[i].uid) found = i;
}
if (found < 0) {
lcd.print("Tanimsiz kart");
lcd.setCursor(0, 1);
lcd.print(uid.substring(0, 16));
Serial.print("Tanımsız kart: ");
Serial.println(uid);
return;
}
// Tanınan kart: içerideyse çıkar,
// değilse girer
Person& person = people[found];
person.inside = !person.inside;
lcd.print(person.name);
lcd.setCursor(0, 1);
lcd.print(person.inside ? "GIRDI " : "CIKTI ");
lcd.print("Iceride:");
lcd.print(insideCount());
Serial.print(person.name);
Serial.print(person.inside ? " girdi" : " çıktı");
Serial.print(", içeride ");
Serial.print(insideCount());
Serial.println(" kişi");
}
Seri Monitörde göreceğin
Yoklama hazır: kartını okut. Tanımsız kart: 3A F2 11 9C Mert girdi, içeride 1 kişi Ayse girdi, içeride 2 kişi Mert çıktı, içeride 1 kişi
Bir kablo yerinde değilse
RC522 bulunamadı, kabloları kontrol et.
Sonuç
Arduino IDE'de ESP32 kurulu değilse bir kerelik: Dosya → Tercihler'de "Ek kart yöneticisi URL'leri" kutusuna https://espressif.github.io/arduino-esp32/package_esp32_index.json yaz, Araçlar → Kart → Kart Yöneticisi'nden "esp32 by Espressif Systems"ı kur ve kart olarak "ESP32 Dev Module"ü seç. Kitaplık Yöneticisi'nden "MFRC522" (GithubCommunity) ve "LiquidCrystal I2C"yi kur ("AVR mimarisi" uyarısı önemli değil). Kodu yükle ve Seri Monitörü 115200 baud'da aç. LCD'de "Kartini okut" ve "Iceride: 0" yazar. Kitteki beyaz kartı okuyucunun üstüne 1-2 cm yaklaştır: kod onu henüz tanımadığı için LCD "Tanimsiz kart" ve kartın numarasını, Seri Monitör de "Tanımsız kart: 3A F2 11 9C" gibi bir satır yazar. Bu numarayı koddaki people listesine bir adla ekle, örneğin {"3A F2 11 9C", "Mert", false}, (ad en çok 16 harf, LCD Türkçe harf göstermez) ve kodu yeniden yükle. Artık kartı okutunca LCD'de adın ve "GIRDI" yazar, içerideki kişi sayısı bir artar; aynı kartı yeniden okutunca "CIKTI" yazar ve sayı azalır. 3 saniye sonra ekran yeniden kart bekler. Kartı okuyucunun üstünde bırakırsan bir kez sayılır. Koddaki Ayse, Burak ve Elif örnektir, silebilirsin. ESP32 yeniden başlayınca herkes "dışarıda" sayılır; giriş-çıkışlar saklanmaz. "RC522 bulunamadı" yazıyorsa ve LCD'de "RC522 yok!" görünüyorsa okuyucunun kablolarına, özellikle 3.3V, SDA (D5), SCK (D18), MOSI (D23) ve MISO'ya (D19) bak; pin başlığı lehimsizse ya da gevşekse okuyucu cevap vermez. LCD'nin ışığı yanıyor ama yazı yoksa I2C modülündeki mavi trimpotu çevir; yine görünmüyorsa koddaki 0x27'yi 0x3F yap. Kart hiç okunmuyorsa okuyucunun ortasına ve daha yakına tut. Yükleme "Connecting..." yazıp hata veriyorsa yükleme sırasında ESP32'nin BOOT düğmesine basılı tut.
Uygulamada her bağlantıyı tek tek işaretle, envanterindeki parçalarla eşleştir ve kaldığın yerden devam et.
Uygulamada adım adım yap