๐Ÿ” RFID + Keypad Door Lock System

Arduino-based access control system using RFID authentication followed by PIN verification.

๐Ÿ”ง Main Components

โš™๏ธ Supporting Parts

โš ๏ธ VERY IMPORTANT RULES
โ€ข RFID โ†’ 3.3V ONLY (NEVER 5V)
โ€ข Servo โ†’ External 5V ONLY
โ€ข ALL GND MUST BE COMMON

๐Ÿ”Œ RFID RC522 Connections

RFID PinArduino Pin
SDAD10
SCKD13
MOSID11
MISOD12
RSTD9
VCC3.3V
GNDGND

โŒจ๏ธ Keypad Connections

Keypad PinArduino Pin
R1D2
R2D3
R3D4
R4D5
C1D6
C2D7
C3D8
C4A5

๐Ÿšช Servo Motor Connections

Servo WireConnect To
RedExternal +5V
Black / BrownGND (Common)
Yellow / OrangeA1
โœ” 1000ยตF capacitor across Servo +5V and GND is MANDATORY

๐Ÿ”” Buzzer

Buzzer PinArduino Pin
+A0
-GND

๐Ÿ’ก LEDs

LEDArduino PinResistor
Blue (System ON)A2220ฮฉ โ†’ GND
Green (Access OK)A3220ฮฉ โ†’ GND
Red (Access Denied)A4220ฮฉ โ†’ 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;
    }
  }
}