← All Projects

RFID Door Lock System with RC522

126 viewsMarch 2, 2026
ArduinoRFIDRC522ServoSecuritySPI

A contactless door lock system using the MFRC522 RFID reader and a servo motor as the locking mechanism. Authorized RFID cards or keyfobs unlock the door, while unauthorized tags trigger a denial buzzer.

Components & Supplies

×1Arduino Uno R3
×1MFRC522 RFID Reader Module
×2RFID Card (13.56 MHz MIFARE)
×1SG90 Servo Motor
×1Active Buzzer
×1Red LED (5mm)
×1Green LED (5mm)

Circuit Connections

ComponentPinPinComponent
ArduinoD10→SDARC522
ArduinoD13→SCKRC522
ArduinoD11→MOSIRC522
ArduinoD12→MISORC522
ArduinoD9→RSTRC522
Arduino3.3V→VCCRC522
ArduinoD3 (PWM)→SignalServo

Overview

This RFID door lock reads 13.56 MHz MIFARE tags using the MFRC522 module over SPI. When a known UID is detected, the servo rotates to unlock the door and a green LED lights up. Unknown cards trigger a red LED and buzzer.

You can store multiple authorized UIDs in an array. The system logs all access attempts to serial for review.

arduino— RFID Lock Sketch
#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>

#define SS_PIN 10
#define RST_PIN 9

MFRC522 rfid(SS_PIN, RST_PIN);
Servo lockServo;

const int greenLED = 6;
const int redLED = 7;
const int buzzerPin = 5;

// Authorized UID (replace with your card)
byte authorizedUID[] = {0xA1, 0xB2, 0xC3, 0xD4};

void setup() {
  Serial.begin(9600);
  SPI.begin();
  rfid.PCD_Init();
  lockServo.attach(3);
  lockServo.write(0);
  pinMode(greenLED, OUTPUT);
  pinMode(redLED, OUTPUT);
  pinMode(buzzerPin, OUTPUT);
  Serial.println("RFID Door Lock Ready");
}

bool checkUID(byte *uid, byte size) {
  if (size != 4) return false;
  for (byte i = 0; i < 4; i++) {
    if (uid[i] != authorizedUID[i]) return false;
  }
  return true;
}

void loop() {
  if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) return;

  Serial.print("UID: ");
  for (byte i = 0; i < rfid.uid.size; i++) {
    Serial.print(rfid.uid.uidByte[i], HEX);
    Serial.print(" ");
  }
  Serial.println();

  if (checkUID(rfid.uid.uidByte, rfid.uid.size)) {
    Serial.println("ACCESS GRANTED");
    digitalWrite(greenLED, HIGH);
    lockServo.write(90);
    delay(5000);
    lockServo.write(0);
    digitalWrite(greenLED, LOW);
  } else {
    Serial.println("ACCESS DENIED");
    digitalWrite(redLED, HIGH);
    for (int i = 0; i < 3; i++) {
      digitalWrite(buzzerPin, HIGH);
      delay(200);
      digitalWrite(buzzerPin, LOW);
      delay(100);
    }
    digitalWrite(redLED, LOW);
  }

  rfid.PICC_HaltA();
  rfid.PCD_StopCrypto1();
}