Building a DIY smart lock using Arduino is an excellent project for enhancing home security while learning about electronics and programming. This guide will walk you through the process of creating a smart lock that you can control with RFID (Radio Frequency Identification) cards or a keypad. Let’s dive into the step-by-step process.
Table of Contents
1. Gather Materials and Tools
You’ll need the following components for the project:
- Arduino Uno: The microcontroller that controls the smart lock.
- Servo Motor: Responsible for physically locking and unlocking the door.
- RFID Module (RC522): For reading RFID tags or cards to control access.
- Keypad (optional): As an alternative input method for unlocking.
- Relay Module: Allows you to control a high-powered lock or solenoid.
- Breadboard and Jumper Wires: For connecting the components.
- Power Supply: Such as a battery pack or USB power for the Arduino.
- Locking Mechanism: You can use a solenoid lock or create a custom locking mechanism using the servo motor.
- Buzzer and LEDs (optional): To provide audio and visual feedback on the lock status.

2. Set Up the RFID Module
- Wiring: Connect the RFID module to the Arduino using jumper wires. The RC522 RFID module usually has the following pins:
- SDA to pin 10
- SCK to pin 13
- MOSI to pin 11
- MISO to pin 12
- RST to pin 9
- GND to ground
- VCC to 3.3V
- Install RFID Library: Download and install the MFRC522 library from the Arduino IDE library manager. This library will allow the Arduino to interact with the RFID module.
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 rfid(SS_PIN, RST_PIN);
void setup() {
Serial.begin(9600);
SPI.begin();
rfid.PCD_Init();
Serial.println("Place your card to the reader...");
}
void loop() {
if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) {
Serial.print("Card UID: ");
for (byte i = 0; i < rfid.uid.size; i++) {
Serial.print(rfid.uid.uidByte[i], HEX);
}
Serial.println();
rfid.PICC_HaltA();
}
}
3. Control the Lock Mechanism with a Servo Motor
- Wiring: Connect the servo motor to the Arduino.
- Servo signal pin to digital pin 6
- VCC to 5V
- GND to ground
- Code: Use the Servo library to control the motor’s rotation, which will lock or unlock the door based on RFID input.
#include <Servo.h>
Servo myServo;
void setup() {
myServo.attach(6); // Attach the servo to pin 6
myServo.write(90); // Set the initial position (locked)
}
void unlockDoor() {
myServo.write(0); // Rotate servo to unlock position
delay(5000); // Keep the door unlocked for 5 seconds
myServo.write(90); // Return to locked position
}
4. Integrating RFID with the Lock
- After reading the RFID card, compare its UID (Unique Identification Number) with the stored authorized IDs. If it matches, trigger the servo to unlock the door.

void loop() {
if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) {
String cardUID = "";
for (byte i = 0; i < rfid.uid.size; i++) {
cardUID += String(rfid.uid.uidByte[i], HEX);
}
Serial.print("Card UID: ");
Serial.println(cardUID);
// Check if the UID matches the authorized card
if (cardUID == "12ab34cd") {
Serial.println("Access granted.");
unlockDoor();
} else {
Serial.println("Access denied.");
}
rfid.PICC_HaltA();
}
}
5. Adding a Keypad for Alternative Access
- If you want a backup access method, you can connect a keypad to the Arduino. You’ll need the Keypad library.
- Wiring: Connect the rows and columns of the keypad to the appropriate pins on the Arduino.
- Code: Set up a passcode and add it to the main program.

#include <Keypad.h>
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] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
String inputCode = "";
String correctCode = "1234";
void loop() {
char key = keypad.getKey();
if (key) {
inputCode += key;
Serial.println(inputCode);
if (inputCode.length() == 4) {
if (inputCode == correctCode) {
Serial.println("Access granted.");
unlockDoor();
} else {
Serial.println("Access denied.");
}
inputCode = "";
}
}
}
6. Enhancing the System with LEDs and Buzzers
- LEDs: You can add LEDs to indicate lock status. A green LED for access granted and a red LED for access denied.
- Buzzer: Add a buzzer to sound an alert when access is denied or granted.

int greenLED = 7;
int redLED = 8;
int buzzer = 9;
void setup() {
pinMode(greenLED, OUTPUT);
pinMode(redLED, OUTPUT);
pinMode(buzzer, OUTPUT);
}
void unlockDoor() {
digitalWrite(greenLED, HIGH); // Turn on green LED
tone(buzzer, 1000, 200); // Sound the buzzer
myServo.write(0); // Unlock
delay(5000);
digitalWrite(greenLED, LOW);
myServo.write(90); // Relock
}
7. Testing and Deployment
- Test the smart lock using both the RFID and keypad methods.
- Mount the lock securely on the door with the servo attached to the locking mechanism.

Conclusion
By following this guide, you’ll be able to build a customizable DIY smart lock using Arduino, RFID, and keypad input. With this setup, you can improve your home security and gain practical experience with Arduino-based projects.