๐ RFID + Keypad Door Lock System
Arduino-based access control system using RFID authentication followed by PIN verification.
๐ง Main Components
- Arduino UNO / Nano
- RFID RC522 Module
- RFID Cards / Tags
- 4ร4 Matrix Keypad
- Servo Motor (SG90 / MG90)
- Buzzer
- Blue, Green, Red LEDs
โ๏ธ Supporting Parts
- 3 ร 220ฮฉ resistors (LEDs)
- 1000ยตF capacitor (Servo noise protection)
- External 5V power supply (Servo)
- Breadboard & jumper wires
โ ๏ธ VERY IMPORTANT RULES
โข RFID โ 3.3V ONLY (NEVER 5V)
โข Servo โ External 5V ONLY
โข ALL GND MUST BE COMMON
๐ RFID RC522 Connections
| RFID Pin | Arduino Pin |
| SDA | D10 |
| SCK | D13 |
| MOSI | D11 |
| MISO | D12 |
| RST | D9 |
| VCC | 3.3V |
| GND | GND |
โจ๏ธ Keypad Connections
| Keypad Pin | Arduino Pin |
| R1 | D2 |
| R2 | D3 |
| R3 | D4 |
| R4 | D5 |
| C1 | D6 |
| C2 | D7 |
| C3 | D8 |
| C4 | A5 |
๐ช Servo Motor Connections
| Servo Wire | Connect To |
| Red | External +5V |
| Black / Brown | GND (Common) |
| Yellow / Orange | A1 |
โ 1000ยตF capacitor across Servo +5V and GND is MANDATORY
๐ Buzzer
| Buzzer Pin | Arduino Pin |
| + | A0 |
| - | GND |
๐ก LEDs
| LED | Arduino Pin | Resistor |
| Blue (System ON) | A2 | 220ฮฉ โ GND |
| Green (Access OK) | A3 | 220ฮฉ โ GND |
| Red (Access Denied) | A4 | 220ฮฉ โ GND |
๐ Arduino Source Code
#include
#include
#include
#include
/* ---------- RFID ---------- */
#define SS_PIN 10
#define RST_PIN 9
MFRC522 rfid(SS_PIN, RST_PIN);
/* ---------- LEDs ---------- */
#define BLUE_LED A2
#define GREEN_LED A3
#define RED_LED A4
/* ---------- BUZZER ---------- */
#define BUZZER A0 // confirmed working
/* ---------- SERVO ---------- */
#define SERVO_PIN A1
Servo doorServo;
/* ---------- KEYPAD ---------- */
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {2,3,4,5};
byte colPins[COLS] = {6,7,8,A5}; // A0 used by buzzer
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
/* ---------- AUTH DATA ---------- */
String MASTER_PIN = "123";
/* ---- ALLOWED RFID CARDS ---- */
String RFID_1 = "6CD7A602";
String RFID_2 = "6CBC0C05";
String RFID_3 = "B31AD426";
String RFID_4 = "A3048529";
/* ---------- SERVO CONFIG ---------- */
int SERVO_OPEN_ANGLE = 90;
int SERVO_CLOSE_ANGLE = 0;
int DOOR_OPEN_TIME = 3000;
/* ---------- SYSTEM STATE ---------- */
enum State { WAIT_RFID, WAIT_PIN };
State systemState = WAIT_RFID;
String enteredPIN = "";
/* ---------- BUZZER FUNCTIONS ---------- */
void beepShort() {
tone(BUZZER, 1000);
delay(200);
noTone(BUZZER);
}
void beepLong() {
tone(BUZZER, 1000);
delay(1000);
noTone(BUZZER);
}
void beepDouble() {
beepShort();
delay(200);
beepShort();
}
/* ---------- RFID FUNCTIONS ---------- */
String readUID() {
String uid = "";
for (byte i = 0; i < rfid.uid.size; i++) {
if (rfid.uid.uidByte[i] < 0x10) uid += "0";
uid += String(rfid.uid.uidByte[i], HEX);
}
uid.toUpperCase();
return uid;
}
void resetRFID() {
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
}
/* ---------- SETUP ---------- */
void setup() {
Serial.begin(9600);
SPI.begin();
rfid.PCD_Init();
pinMode(BLUE_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
pinMode(RED_LED, OUTPUT);
pinMode(BUZZER, OUTPUT);
doorServo.attach(SERVO_PIN);
doorServo.write(SERVO_CLOSE_ANGLE);
digitalWrite(BLUE_LED, HIGH);
Serial.println("SYSTEM READY");
Serial.println("SCAN RFID");
}
/* ---------- LOOP ---------- */
void loop() {
/* ===== RFID STAGE ===== */
if (systemState == WAIT_RFID) {
if (!rfid.PICC_IsNewCardPresent()) return;
if (!rfid.PICC_ReadCardSerial()) return;
String uid = readUID();
Serial.print("UID: ");
Serial.println(uid);
if (
uid == RFID_1 ||
uid == RFID_2 ||
uid == RFID_3 ||
uid == RFID_4
) {
Serial.println("RFID OK - ENTER PIN");
digitalWrite(GREEN_LED, HIGH);
beepShort();
delay(500);
digitalWrite(GREEN_LED, LOW);
systemState = WAIT_PIN;
} else {
Serial.println("INVALID RFID");
digitalWrite(RED_LED, HIGH);
beepLong();
digitalWrite(RED_LED, LOW);
}
resetRFID();
delay(500);
return;
}
/* ===== PIN STAGE ===== */
if (systemState == WAIT_PIN) {
char key = keypad.getKey();
if (!key) return;
if (key == '*') {
enteredPIN = "";
Serial.println("PIN CLEARED");
}
else if (key == '#') {
if (enteredPIN == MASTER_PIN) {
Serial.println("ACCESS GRANTED");
digitalWrite(GREEN_LED, HIGH);
beepDouble();
doorServo.write(SERVO_OPEN_ANGLE);
delay(DOOR_OPEN_TIME);
doorServo.write(SERVO_CLOSE_ANGLE);
digitalWrite(GREEN_LED, LOW);
} else {
Serial.println("WRONG PIN");
digitalWrite(RED_LED, HIGH);
beepLong();
digitalWrite(RED_LED, LOW);
}
enteredPIN = "";
systemState = WAIT_RFID;
Serial.println("SCAN RFID");
}
else {
enteredPIN += key;
}
}
}