Nava KlfZ Moslemi
Published © GPL3+

Smart RFID Access Control: Secure Door Lock with Arduino

This project is a secure access control system that uses RFID technology to manage entry to restricted areas.

BeginnerShowcase (no instructions)1 hour132
Smart RFID Access Control: Secure Door Lock with Arduino

Things used in this project

Story

Read more

Custom parts and enclosures

ماژول های مورد نیاز

Schematics

Schematics

Code

arduino

Arduino
#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 5
#define RST_PIN 9
#define RELAY 3
#define BUZZER 2
#define YELLOW_LED 4
#define GREEN_LED 6
#define RED_LED 7
#define ACCESS_DELAY 2000
#define DENIED_DELAY 1000

MFRC522 mfrc522(SS_PIN, RST_PIN);

void setLeds(bool yellow, bool green, bool red) {
  digitalWrite(YELLOW_LED, yellow);
  digitalWrite(GREEN_LED, green);
  digitalWrite(RED_LED, red);
}

void setup() {
  Serial.begin(9600);
  SPI.begin();
  mfrc522.PCD_Init();
  pinMode(RELAY, OUTPUT);
  pinMode(BUZZER, OUTPUT);
  pinMode(YELLOW_LED, OUTPUT);
  pinMode(GREEN_LED, OUTPUT);
  pinMode(RED_LED, OUTPUT);
  
  digitalWrite(RELAY, HIGH);
  setLeds(LOW, LOW, LOW);
  Serial.println("System Ready. Scan your card...");
}

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

  //   
  setLeds(HIGH, LOW, LOW);

  String content = "";
  for (byte i = 0; i < mfrc522.uid.size; i++) {
    content += String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    content += String(mfrc522.uid.uidByte[i], HEX);
  }
  content.toUpperCase();

  Serial.print("Scanned UID: ");
  Serial.println(content);

  if (content.substring(1) == "44 1D 43 02" || content.substring(1) == "A3 B4 85 13") {
    Serial.println("Access Granted");
    setLeds(LOW, HIGH, LOW);
    digitalWrite(RELAY, LOW);
    delay(ACCESS_DELAY);
    digitalWrite(RELAY, HIGH);
  } else {
    Serial.println("Access Denied");
    setLeds(LOW, LOW, HIGH);
    tone(BUZZER, 300, DENIED_DELAY);
    delay(DENIED_DELAY);
  }

  //   LED
  setLeds(LOW, LOW, LOW);
  mfrc522.PICC_HaltA();
  mfrc522.PCD_StopCrypto1();
}

windows form

Python
import tkinter as tk
from tkinter import ttk, messagebox
import serial
import serial.tools.list_ports
from datetime import datetime
import threading

#  UID  (      )
AUTHORIZED_TAGS = {
    "44 1D 43 02": "  ",
    "A3 B4 85 13": "  "
}

class RFIDApp:
    def __init__(self, root):
        self.root = root
        self.root.title("   RFID")
        self.root.geometry("500x400")
        
        self.ser = None
        self.running = False
        
        #    
        self.create_widgets()
        
        #      
        self.auto_connect_arduino()
    
    def create_widgets(self):
        #    
        settings_frame = ttk.LabelFrame(self.root, text=" ")
        settings_frame.pack(pady=10, padx=10, fill="x")
        
        self.port_combo = ttk.Combobox(settings_frame)
        self.port_combo.pack(side="left", padx=5, pady=5)
        
        refresh_btn = ttk.Button(settings_frame, text=" ", command=self.update_ports)
        refresh_btn.pack(side="left", padx=5)
        
        connect_btn = ttk.Button(settings_frame, text="", command=self.toggle_connection)
        connect_btn.pack(side="left", padx=5)
        
        #  
        self.status_label = ttk.Label(self.root, text=": ", foreground="red")
        self.status_label.pack(pady=5)
        
        #   
        self.message_text = tk.Text(self.root, height=10, state="disabled")
        self.message_text.pack(pady=10, padx=10, fill="both", expand=True)
        
        #  
        exit_btn = ttk.Button(self.root, text="", command=self.on_close)
        exit_btn.pack(pady=5)
    
    def auto_connect_arduino(self):
        ports = serial.tools.list_ports.comports()
        for port in ports:
            if "Arduino" in port.description:
                self.connect_to_port(port.device)
                return
        self.update_ports()
    
    def update_ports(self):
        ports = [port.device for port in serial.tools.list_ports.comports()]
        self.port_combo["values"] = ports
        if ports:
            self.port_combo.current(0)
    
    def toggle_connection(self):
        if self.ser and self.ser.is_open:
            self.stop_serial()
        else:
            port = self.port_combo.get()
            if port:
                self.connect_to_port(port)
    
    def connect_to_port(self, port):
        try:
            self.ser = serial.Serial(
                port=port,
                baudrate=9600,
                timeout=1
            )
            self.running = True
            threading.Thread(target=self.read_serial, daemon=True).start()
            self.status_label.config(text=f":   {port}", foreground="green")
        except Exception as e:
            messagebox.showerror("", f" :\n{str(e)}")
    
    def stop_serial(self):
        self.running = False
        if self.ser:
            self.ser.close()
        self.status_label.config(text=": ", foreground="red")
    
    def read_serial(self):
        buffer = ""
        while self.running and self.ser.is_open:
            try:
                data = self.ser.readline().decode("utf-8").strip()
                if data:
                    if "UID:" in data:
                        uid = data.split("UID:")[1].strip()
                        self.process_rfid(uid)
            except UnicodeDecodeError:
                continue
            except Exception as e:
                print(f"Error: {str(e)}")
                self.stop_serial()
    
    def process_rfid(self, uid):
        self.root.after(0, self.update_ui, uid)
    
    def update_ui(self, uid):
        now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        log_entry = f"[{now}] UID  : {uid}\n"
        
        self.message_text.config(state="normal")
        self.message_text.insert("end", log_entry)
        self.message_text.see("end")
        self.message_text.config(state="disabled")
        
        if uid in AUTHORIZED_TAGS:
            user = AUTHORIZED_TAGS[uid]
            success_msg = f"   \n: {user}\n{now}"
            self.show_message(success_msg, "green")
            #      
            if self.ser:
                self.ser.write(b'OPEN')
        else:
            error_msg = f"   \nUID: {uid}\n{now}"
            self.show_message(error_msg, "red")
    
    def show_message(self, message, color):
        top = tk.Toplevel(self.root)
        top.title(" ")
        top.geometry("300x150")
        
        label = ttk.Label(top, text=message, foreground=color, font=("Tahoma", 12))
        label.pack(pady=20)
        
        ok_btn = ttk.Button(top, text="", command=top.destroy)
        ok_btn.pack(pady=10)
    
    def on_close(self):
        self.stop_serial()
        self.root.destroy()

if __name__ == "__main__":
    root = tk.Tk()
    app = RFIDApp(root)
    root.mainloop()

Credits

Nava Klf
2 projects • 3 followers
Z Moslemi
2 projects • 1 follower

Comments