#include <SPI.h>
#include <MFRC522.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// --- Hardware Pins ---
#define SS_PIN 10
#define RST_PIN 9
#define RELAY_PIN 8
#define GREEN_LED 7
#define RED_LED 6
#define BUZZER_PIN 5
#define PIR_PIN 4
// --- Display Setup ---
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// --- RFID Setup ---
MFRC522 rfid(SS_PIN, RST_PIN);
void setup() {
Serial.begin(115200);
SPI.begin();
rfid.PCD_Init();
pinMode(RELAY_PIN, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
pinMode(RED_LED, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(PIR_PIN, INPUT);
digitalWrite(RELAY_PIN, LOW); // Ensure relay starts OFF
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
for(;;);
}
showStandby();
Serial.println("System Active. Scan ANY card to open...");
}
void loop() {
// 1. Check for Motion (PIR Sensor)
if (digitalRead(PIR_PIN) == HIGH) {
securityAlert();
showStandby();
}
// 2. Check for RFID Cards
// If no card is present, the code just keeps looping
if (!rfid.PICC_IsNewCardPresent()) return;
if (!rfid.PICC_ReadCardSerial()) return;
// 3. Logic: ANY card detected will trigger access
Serial.println("Card detected! Opening relay...");
grantAccess();
// Finish reading and return to standby
rfid.PICC_HaltA();
showStandby();
}
void showStandby() {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(20, 15);
display.println("SECURE TERMINAL");
display.setCursor(25, 40);
display.println("TAP ANY CARD");
display.display();
}
void grantAccess() {
display.clearDisplay();
display.setCursor(25, 20);
display.setTextSize(2);
display.println("GRANTED");
display.display();
digitalWrite(GREEN_LED, HIGH);
digitalWrite(RELAY_PIN, HIGH); // <--- RELAY TURNS ON HERE
tone(BUZZER_PIN, 1500, 500);
delay(5000); // Keep relay on for 5 seconds
digitalWrite(RELAY_PIN, LOW); // <--- RELAY TURNS OFF HERE
digitalWrite(GREEN_LED, LOW);
}
void securityAlert() {
display.clearDisplay();
display.setCursor(15, 20);
display.setTextSize(2);
display.println("WARNING!");
display.setCursor(20, 45);
display.setTextSize(1);
display.println("Motion Detected");
display.display();
digitalWrite(RED_LED, HIGH);
tone(BUZZER_PIN, 2000, 100);
delay(500);
digitalWrite(RED_LED, LOW);
}Ground Board
5v Board
Card Scanner
Relay for Door Opening and Lock
OLED Display
Loading
mfrc522
mfrc522
DISPLAY
Motion Sensor
Buzzer & Led indication & Alarm