RFID Kartlı Kapı Kilidi
Orta60 dkTanıttığın kart ya da anahtarlıkla açılan bir kapı kilidi: RC522 okuyucu kartın numarasını okur, kayıtlıysa yeşil LED yanar, kısa bir bip çalar ve servo mandalı çevirip kapıyı 5 saniyeliğine açar; kayıtsız kartta kırmızı LED yanar ve uzun bir bip çalar. İlk okutulan kart yönetici kartı olur: yönetici kartını okutunca 10 saniyeliğine ekleme modu açılır, o sırada okuttuğun yeni kart eklenir, kayıtlı kart silinir. Kartlar Arduino'nun EEPROM belleğinde saklanır, elektrik gidip gelse de unutulmaz. SPI ile bir modülle haberleşmeyi, kart numaralarını karşılaştırmayı, EEPROM'da küçük bir liste tutmayı ve bir modun kendi kendine kapanmasını öğretir. Kitaplık Yöneticisi'nden "MFRC522" kurulur; Servo ve EEPROM Arduino ile gelir. Bu bir öğrenme projesidir; gerçek bir kapının tek kilidi olarak kullanma.
Uygulamada adım adım yapGerekli malzemeler
1 × Arduino Uno R3
1 × Breadboard 830 Pin (MB-102)
1 × RFID RC522 Okuyucu ve Kart/Anahtarlık Seti
1 × SG90 Mikro Servo Motor
1 × Pasif Buzzer (Piezo)
1 × LED - Yeşil (5mm)
1 × LED - Kırmızı (5mm)
2 × Direnç 220 Ω (1/4W)
9 × Jumper Kablo - Erkek/Erkek
7 × Jumper Kablo - Erkek/Dişi
Bağlantı adımları
- 1
Güç sıralarını bağla (5V ve GND)

Kırmızı erkek-erkek jumper kabloyu Arduino'nun güç başlığındaki 5V pinine tak, diğer ucunu breadboard'un üstteki kırmızı çizgili (+) güç sırasına bağla. Siyah kabloyu aynı başlıktaki GND pinlerinden birine tak, diğer ucunu üstteki mavi çizgili (−) güç sırasına bağla. Servo, buzzer ve LED'ler bu sıralardan beslenecek. RC522 buradan beslenmez: o 3.3V ile çalışır.
- Arduino 5V → üstteki kırmızı çizgili (+) sıra (kırmızı kablo)
- Arduino GND → üstteki mavi çizgili (−) sıra (siyah kablo)
- 2
RC522 okuyucuyu bağla

Okuyucunun 8 pinli başlığı çoğu kitte ayrı gelir; önce karta lehimlemen gerekebilir. Pinlere erkek-dişi kabloların dişi uçlarını tak ve hepsini doğrudan Arduino'ya bağla: SDA'yı 10'a, SCK'yi 13'e, MOSI'yi 11'e, MISO'yu 12'ye, RST'yi 9'a, GND'yi dijital başlıktaki GND pinine (13'ün yanında), 3.3V'u güç başlığındaki 3.3V pinine. IRQ boş kalır. DİKKAT: RC522'nin VCC'sini 5V'a bağlama, okuyucu bozulabilir; 3.3V pinini kullan. 13, 12 ve 11 numaralı pinler Uno'nun SPI pinleridir, değiştirilemez.
- Arduino pin 10 → RC522 SDA (sarı kablo)
- Arduino pin 13 → RC522 SCK (yeşil kablo)
- Arduino pin 11 → RC522 MOSI (mavi kablo)
- Arduino pin 12 → RC522 MISO (mor kablo)
- Arduino pin 9 → RC522 RST (beyaz kablo)
- Arduino GND → RC522 GND (siyah kablo)
- Arduino 3.3V → RC522 3.3V (kırmızı kablo)
- 3
Servoyu bağla

SG90'ın kablosunun ucundaki üç delikli fişe üç erkek-erkek kablo tak. Kahverengi (GND) kablonun karşısındakini üstteki (−) sıraya, kırmızı (5V) kablonun karşısındakini üstteki (+) sıraya, turuncu (sinyal) kablonun karşısındakini doğrudan Arduino'nun 6 numaralı pinine bağla (SERVO_PIN 6). Servonun tek kollu başlığını, kod açılışta servoyu 0°'ye getirdikten sonra tak: kol 0°'de mandalı kapatsın, 90°'de açsın.
- servo kahverengi kablo (GND) → üstteki mavi çizgili (−) sıra (siyah kablo)
- servo kırmızı kablo (5V) → üstteki kırmızı çizgili (+) sıra (kırmızı kablo)
- Arduino pin 6 → servo turuncu kablo (sinyal) (turuncu kablo)
- 4
Buzzer'ı tak ve bağla

Pasif buzzer'ın + bacağını üst yarıda 15. sütuna, öbür bacağını 16. sütuna tak; + bacak genelde daha uzundur ve gövdesinde + işareti vardır. Turuncu kabloyla Arduino'nun 8 numaralı pinini 15. sütuna bağla (BUZZER_PIN 8). Kısa siyah bir kabloyla 16. sütunu üstteki (−) sıraya bağla.
- buzzer + bacak → 15. sütun, üst yarı
- buzzer − bacak → 16. sütun, üst yarı
- Arduino pin 8 → 15. sütun, üst yarı (turuncu kablo)
- 16. sütun, üst yarı → üstteki mavi çizgili (−) sıra (siyah kablo)
- 5
Yeşil ve kırmızı LED'i dirençleriyle tak

Yeşil LED'in uzun bacağını (+) üst yarıda 34. sütuna, kısa bacağını (−) 35. sütuna tak; bir 220 Ω direnci 35. sütundan üstteki (−) sıraya tak. Yeşil kabloyla Arduino'nun 5 numaralı pinini 34. sütuna bağla (GREEN_LED 5). Kırmızı LED'i aynı şekilde tak: uzun bacak 40., kısa bacak 41. sütuna; ikinci 220 Ω direnç 41. sütundan (−) sıraya. Mavi kabloyla Arduino'nun 4 numaralı pinini 40. sütuna bağla (RED_LED 4).
- yeşil LED uzun bacak (+) → 34. sütun, üst yarı
- yeşil LED kısa bacak (−) → 35. sütun, üst yarı
- kırmızı LED uzun bacak (+) → 40. sütun, üst yarı
- kırmızı LED kısa bacak (−) → 41. sütun, üst yarı
- yeşil LED'in direnci (1. bacak) → 35. sütun, üst yarı
- yeşil LED'in direnci (2. bacak) → üstteki mavi çizgili (−) sıra
- kırmızı LED'in direnci (1. bacak) → 41. sütun, üst yarı
- kırmızı LED'in direnci (2. bacak) → üstteki mavi çizgili (−) sıra
- Arduino pin 5 → 34. sütun, üst yarı (yeşil kablo)
- Arduino pin 4 → 40. sütun, üst yarı (mavi kablo)
Arduino kodu
// Kitaplık Yöneticisi'nden kurulacak:
// "MFRC522" (GithubCommunity)
#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
#include <EEPROM.h>
// RC522'nin SDA ve RST pinleri; SCK,
// MOSI, MISO Uno'da 13, 11, 12'dir
const int SS_PIN = 10;
const int RST_PIN = 9;
const int SERVO_PIN = 6;
const int GREEN_LED = 5;
const int RED_LED = 4;
const int BUZZER_PIN = 8;
// Servonun kilitli ve açık açısı
const int LOCKED_ANGLE = 0;
const int OPEN_ANGLE = 90;
// Kapının açık kalma süresi (ms)
const unsigned long OPEN_TIME = 5000;
// Kart ekleme modu bu kadar sürer (ms)
const unsigned long ADD_TIME = 10000;
// EEPROM: 0. bayt işaret, 1. kart sayısı,
// sonra 4'er baytlık kart numaraları.
// İlk kart yönetici kartıdır.
const byte MAX_CARDS = 10;
// Bu sayıyı değiştirip yüklersen bütün
// kartlar silinir
const byte EEPROM_MARK = 77;
MFRC522 rfid(SS_PIN, RST_PIN);
Servo lock;
byte cardCount = 0;
bool addMode = false;
unsigned long addStart = 0;
void beep(int ms) {
tone(BUZZER_PIN, 2000);
delay(ms);
noTone(BUZZER_PIN);
}
// Kart okunduysa numarasını uid'e yazar
bool readCard(byte uid[4]) {
if (!rfid.PICC_IsNewCardPresent()) return false;
if (!rfid.PICC_ReadCardSerial()) return false;
for (byte i = 0; i < 4; i++) {
uid[i] = rfid.uid.uidByte[i];
}
rfid.PICC_HaltA();
return true;
}
void printCard(byte uid[4]) {
Serial.print("Kart:");
for (byte i = 0; i < 4; i++) {
Serial.print(uid[i] < 0x10 ? " 0" : " ");
Serial.print(uid[i], HEX);
}
Serial.println();
}
// Kayıtlı kartın sırası (0: yönetici),
// kayıtsızsa -1
int findCard(byte uid[4]) {
for (byte k = 0; k < cardCount; k++) {
bool same = true;
for (byte i = 0; i < 4; i++) {
if (EEPROM.read(2 + k * 4 + i) != uid[i]) same = false;
}
if (same) return k;
}
return -1;
}
void addCard(byte uid[4]) {
for (byte i = 0; i < 4; i++) {
EEPROM.update(2 + cardCount * 4 + i, uid[i]);
}
cardCount++;
EEPROM.update(0, EEPROM_MARK);
EEPROM.update(1, cardCount);
}
// Sondaki kartı silinenin yerine taşı
void removeCard(int k) {
cardCount--;
for (byte i = 0; i < 4; i++) {
EEPROM.update(2 + k * 4 + i, EEPROM.read(2 + cardCount * 4 + i));
}
EEPROM.update(1, cardCount);
}
void openDoor() {
digitalWrite(GREEN_LED, HIGH);
beep(100);
lock.write(OPEN_ANGLE);
delay(OPEN_TIME);
lock.write(LOCKED_ANGLE);
digitalWrite(GREEN_LED, LOW);
Serial.println("Kapı kilitlendi.");
}
void deny() {
digitalWrite(RED_LED, HIGH);
beep(600);
delay(400);
digitalWrite(RED_LED, LOW);
}
void setup() {
Serial.begin(9600);
pinMode(GREEN_LED, OUTPUT);
pinMode(RED_LED, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
lock.attach(SERVO_PIN);
lock.write(LOCKED_ANGLE);
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.");
while (true) {
digitalWrite(RED_LED, !digitalRead(RED_LED));
delay(300);
}
}
if (EEPROM.read(0) == EEPROM_MARK) {
cardCount = min(EEPROM.read(1), MAX_CARDS);
}
if (cardCount == 0) {
Serial.println("Yönetici kartını okut.");
} else {
Serial.print("Kilit hazır, kayıtlı kart: ");
Serial.println(cardCount);
}
}
void loop() {
// Ekleme modu kendi kendine kapanır
if (addMode && millis() - addStart >= ADD_TIME) {
addMode = false;
digitalWrite(GREEN_LED, LOW);
Serial.println("Kart ekleme modu kapandı.");
}
byte uid[4];
if (!readCard(uid)) return;
printCard(uid);
if (cardCount == 0) {
addCard(uid);
Serial.println("Yönetici kartı kaydedildi.");
beep(100);
delay(100);
beep(100);
return;
}
int k = findCard(uid);
if (k == 0) {
// Yönetici kartı ekleme modunu açar
addMode = true;
addStart = millis();
digitalWrite(GREEN_LED, HIGH);
beep(100);
Serial.println("Ekleme modu: eklenecek ya da silinecek kartı okut.");
} else if (addMode) {
addMode = false;
digitalWrite(GREEN_LED, LOW);
if (k > 0) {
removeCard(k);
Serial.println("Kart silindi.");
} else if (cardCount >= MAX_CARDS) {
Serial.println("Kart listesi dolu.");
} else {
addCard(uid);
Serial.println("Kart eklendi.");
}
beep(100);
} else if (k > 0) {
Serial.println("İzin verildi: kapı açılıyor.");
openDoor();
} else {
Serial.println("Bu kart kayıtlı değil.");
deny();
}
}
Seri Monitörde göreceğin
Yönetici kartını okut. Kart: DE AD BE EF Yönetici kartı kaydedildi. Kart: 04 7B 2E 05 Bu kart kayıtlı değil. Kart: DE AD BE EF Ekleme modu: eklenecek ya da silinecek kartı okut. Kart: 3A F2 11 9C Kart eklendi. Kart: 3A F2 11 9C İzin verildi: kapı açılıyor. Kapı kilitlendi.
Bir kablo yerinde değilse
RC522 bulunamadı, kabloları kontrol et.
Sonuç
Seri Monitörü 9600 baud'da aç. İlk açılışta "Yönetici kartını okut." yazar: kitteki beyaz kartı ya da mavi anahtarlığı okuyucunun üstüne 1-2 cm yaklaştır; iki kısa bip duyarsın, bu kart artık yönetici kartıdır. Kayıtsız bir kart okutunca kırmızı LED yanar ve uzun bir bip çalar. Kart eklemek için yönetici kartını okut: yeşil LED yanar ve 10 saniyelik ekleme modu açılır; bu sırada yeni kartı okut, "Kart eklendi." yazar. Kayıtlı bir kartı okutunca yeşil LED yanar, kısa bir bip çalar, servo 90°'ye dönüp kapıyı 5 saniye açar ve sonra yeniden kilitler. Kayıtlı bir kartı silmek için önce yönetici kartını, sonra silinecek kartı okut. Kartlar EEPROM'da kalır; Arduino'yu çıkarıp taksan da tanınır. Her kartın numarası Seri Monitöre yazılır. "RC522 bulunamadı" yazıyor ve kırmızı LED yanıp sönüyorsa okuyucunun kablolarına, özellikle SDA (10), SCK (13), MOSI (11), MISO (12) ve 3.3V'a bak; pin başlığı lehimsizse ya da gevşekse okuyucu cevap vermez. Kart hiç okunmuyorsa kartı okuyucunun ortasına ve daha yakına tut. Bütün kartları silmek için koddaki EEPROM_MARK sayısını değiştirip yeniden yükle.
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