#include <Wire.h>
#include <MFRC522.h>
#include <Keypad.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
#define SS_PIN 5
#define RST_PIN 4
#define BUZZER_PIN 15
#define SWITCH_PIN 2
#define RELAY_PIN 16
MFRC522 rfid(SS_PIN, RST_PIN);
RTC_DS3231 rtc;
LiquidCrystal_I2C lcd(0x27, 16, 2);
const byte ROWS = 4, COLS = 4;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {13, 12, 14, 27};
byte colPins[COLS] = {26, 25, 33, 32};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
const char* validRFID = "abcd1234"; // Simulated RFID tag ID
char enteredOTP[5];
char generatedOTP[5];
void setup() {
Serial.begin(115200);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(SWITCH_PIN, INPUT_PULLUP);
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
Wire.begin();
rfid.PCD_Init();
rtc.begin();
lcd.init();
lcd.backlight();
lcd.print("Scan RFID");
rtc.adjust(DateTime(2025, 3, 2, 9, 0, 0)); // Simulated exam time
}
void loop() {
if (!checkTime()) {
lcd.clear();
lcd.print("Time Restricted");
delay(2000);
lcd.clear();
lcd.print("Scan RFID");
return;
}
if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) {
String tag = readRFID();
if (tag == validRFID) {
generateAndSendOTP();
if (verifyOTP()) {
unlockSystem();
} else {
tamperAlert();
}
} else {
lcd.clear();
lcd.print("Invalid RFID");
delay(2000);
}
lcd.clear();
lcd.print("Scan RFID");
rfid.PICC_HaltA();
}
if (digitalRead(SWITCH_PIN) == LOW) {
tamperAlert();
}
}
String readRFID() {
String tag = "";
for (byte i = 0; i < rfid.uid.size; i++) {
tag += String(rfid.uid.uidByte[i], HEX);
}
return tag;
}
void generateAndSendOTP() {
randomSeed(millis());
for (int i = 0; i < 4; i++) {
generatedOTP[i] = '0' + random(0, 10);
}
generatedOTP[4] = '\0';
lcd.clear();
lcd.print("OTP Sent");
Serial.println("SMS: Your OTP: " + String(generatedOTP)); // Simulated GSM
lcd.clear();
lcd.print("Enter OTP");
}
bool verifyOTP() {
int pos = 0;
while (pos < 4) {
char key = keypad.getKey();
if (key && isDigit(key)) {
enteredOTP[pos] = key;
lcd.setCursor(pos, 1);
lcd.print(key);
pos++;
}
}
enteredOTP[4] = '\0';
return (strcmp(enteredOTP, generatedOTP) == 0);
}
void unlockSystem() {
lcd.clear();
lcd.print("Access Granted");
digitalWrite(RELAY_PIN, HIGH);
delay(2000);
digitalWrite(RELAY_PIN, LOW);
lcd.clear();
lcd.print("Scan RFID");
}
void tamperAlert() {
digitalWrite(BUZZER_PIN, HIGH);
lcd.clear();
lcd.print("Leak Detected");
Serial.println("SMS: System Tampered!"); // Simulated GSM
delay(2000);
digitalWrite(BUZZER_PIN, LOW);
lcd.clear();
lcd.print("Scan RFID");
}
bool checkTime() {
DateTime now = rtc.now();
DateTime examTime(2025, 3, 2, 9, 0, 0);
return (now >= examTime && now <= examTime + TimeSpan(0, 0, 5, 0)); // 5-min window
}