← All Projects

RFID Door Lock System with RC522

345 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
ArduinoD10SDARC522
ArduinoD13SCKRC522
ArduinoD11MOSIRC522
ArduinoD12MISORC522
ArduinoD9RSTRC522
Arduino3.3VVCCRC522
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.

arduinoRFID 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();
}