#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <MFRC522.h>
// LCD setup (I2C address usually 0x27 or 0x3F)
LiquidCrystal_I2C lcd(0x27, 16, 2);
// RFID setup
#define SS_PIN 7
#define RST_PIN 10
MFRC522 rfid(SS_PIN, RST_PIN);
// Button pins
#define MANUAL_UNLOCK_BUTTON 2
#define LOCK_BUTTON1 3
#define LOCK_BUTTON2 4
// LED pins
#define RED_LED 13
#define GREEN_LED 5
// Relay pin
#define RELAY 6
// Variables
bool doorLocked = true;
String authorizedCard = "01020304"; // Replace with your card's UID
void setup() {
Serial.begin(9600);
// Initialize pins
pinMode(RED_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
pinMode(RELAY, OUTPUT);
pinMode(MANUAL_UNLOCK_BUTTON, INPUT_PULLUP);
pinMode(LOCK_BUTTON1, INPUT_PULLUP);
pinMode(LOCK_BUTTON2, INPUT_PULLUP);
// Initialize LCD
lcd.init();
lcd.backlight();
// Initialize RFID
SPI.begin();
rfid.PCD_Init();
// Display startup messages
displayStartupMessage();
// Set initial door state
lockDoor();
}
void loop() {
// Check RFID card
if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) {
String cardUID = getCardUID();
if (cardUID == authorizedCard) {
if (doorLocked) {
unlockDoor();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Door Opened");
lcd.setCursor(0, 1);
lcd.print("Welcome!");
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Door is already");
lcd.setCursor(0, 1);
lcd.print("opened");
delay(2000);
displayDoorStatus();
}
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Access Denied");
lcd.setCursor(0, 1);
lcd.print("Invalid Card");
delay(2000);
displayDoorStatus();
}
rfid.PICC_HaltA();
}
// Check manual unlock button (pin 2)
if (digitalRead(MANUAL_UNLOCK_BUTTON) == LOW) {
delay(50); // Debounce
while(digitalRead(MANUAL_UNLOCK_BUTTON) == LOW);
if (doorLocked) {
unlockDoor();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Door Opened");
lcd.setCursor(0, 1);
lcd.print("Manually");
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Door is already");
lcd.setCursor(0, 1);
lcd.print("opened");
}
delay(2000);
displayDoorStatus();
}
// Check lock button 1 (pin 3)
if (digitalRead(LOCK_BUTTON1) == LOW) {
delay(50); // Debounce
while(digitalRead(LOCK_BUTTON1) == LOW);
if (!doorLocked) {
lockDoor();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Door Closed");
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Door already");
lcd.setCursor(0, 1);
lcd.print("closed");
}
delay(2000);
displayDoorStatus();
}
// Check lock button 2 (pin 4)
if (digitalRead(LOCK_BUTTON2) == LOW) {
delay(50); // Debounce
while(digitalRead(LOCK_BUTTON2) == LOW);
if (!doorLocked) {
lockDoor();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Door Closed");
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Door already");
lcd.setCursor(0, 1);
lcd.print("closed");
}
delay(2000);
displayDoorStatus();
}
}
void displayStartupMessage() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Smart Door");
lcd.setCursor(0, 1);
lcd.print("System");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Mohammed Saleh");
lcd.setCursor(0, 1);
lcd.print("Yahyawi High");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("School");
delay(1500);
displayDoorStatus();
}
void displayDoorStatus() {
lcd.clear();
if (doorLocked) {
lcd.setCursor(0, 0);
lcd.print("Door Locked");
} else {
lcd.setCursor(0, 0);
lcd.print("Door Unlocked");
}
}
void unlockDoor() {
doorLocked = false;
digitalWrite(RED_LED, LOW);
digitalWrite(GREEN_LED, HIGH);
digitalWrite(RELAY, HIGH); // Activate relay to unlock
}
void lockDoor() {
doorLocked = true;
digitalWrite(RED_LED, HIGH);
digitalWrite(GREEN_LED, LOW);
digitalWrite(RELAY, LOW); // Deactivate relay to lock
}
String getCardUID() {
String uid = "";
for (byte i = 0; i < rfid.uid.size; i++) {
uid += String(rfid.uid.uidByte[i] < 0x10 ? "0" : "");
uid += String(rfid.uid.uidByte[i], HEX);
}
uid.toUpperCase();
return uid;
}