#include <SPI.h>
#include <MFRC522.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <Servo.h>
#define RST_PIN 9 // Configuring RFID pins
#define SS_PIN 10
#define BUZZER_PIN 8
#define SERVO_PIN 7
#define YELLOW_LED 4
#define GREEN_LED 5
#define RED_LED 6
#define KNOWN_BUTTON_PIN 3
#define UNKNOWN_BUTTON_PIN 2
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance
LiquidCrystal_I2C lcd(0x27, 20, 4); // Set the LCD address to 0x27 for a 20 chars and 4 line display
RTC_DS1307 rtc;
Servo servo;
void setup() {
Serial.begin(9600);
SPI.begin(); // Init SPI bus
mfrc522.PCD_Init(); // Init MFRC522
Wire.begin(); // Init I2C communication
lcd.init(); // Init LCD
lcd.backlight();
pinMode(BUZZER_PIN, OUTPUT); // Set pin modes
pinMode(SERVO_PIN, OUTPUT);
pinMode(YELLOW_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
pinMode(RED_LED, OUTPUT);
pinMode(KNOWN_BUTTON_PIN, INPUT_PULLUP);
pinMode(UNKNOWN_BUTTON_PIN, INPUT_PULLUP);
digitalWrite(YELLOW_LED, HIGH); // Yellow LED always on
servo.attach(SERVO_PIN); // Attach servo motor
servo.write(0); // Initially, servo at 0 degrees
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
if (!rtc.isrunning()) {
Serial.println("RTC is NOT running!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void loop() {
DateTime now = rtc.now();
// Step 2: Display initial message
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sinothile's Projects");
lcd.setCursor(0, 1);
lcd.print(" UNISA EngTech Hons");
lcd.setCursor(0, 2);
lcd.print("RFID Based Passport ");
lcd.setCursor(0, 3);
lcd.print(" For Border Control");
noTone(BUZZER_PIN); // The 'noTone' code will stop the tone playing on pin 8
digitalWrite(GREEN_LED, LOW);
digitalWrite(RED_LED, LOW);
servo.write(0); // Rotate servo 0 degrees
delay(5000); // Delay for 5 seconds
// Step 3: Display current date and time
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("DATE: ");
lcd.print(now.year()); lcd.print("/");
lcd.print(now.month()); lcd.print("/");
lcd.print(now.day());
lcd.setCursor(0, 1);
lcd.print("TIME: ");
if (now.hour() < 10) lcd.print("0");
lcd.print(now.hour() % 12 == 0 ? 12 : now.hour() % 12); lcd.print(":"); // 12-hour format
if (now.minute() < 10) lcd.print("0");
lcd.print(now.minute()); lcd.print(":");
if (now.second() < 10) lcd.print("0");
lcd.print(now.second());
lcd.print(now.hour() < 12 ? " AM" : " PM");
lcd.setCursor(17, 0);
switch(now.dayOfTheWeek()) {
case 0: lcd.print("SUN"); break;
case 1: lcd.print("MON"); break;
case 2: lcd.print("TUE"); break;
case 3: lcd.print("WED"); break;
case 4: lcd.print("THU"); break;
case 5: lcd.print("FRI"); break;
case 6: lcd.print("SAT"); break;
}
lcd.setCursor(0, 2);
lcd.print(" Scan Your Card ");
lcd.setCursor(0, 3);
lcd.print(" To The RFID Reader.");
delay(5000); // Delay for 5 seconds
// Step 4: Scan RFID card
if ((mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) || digitalRead(KNOWN_BUTTON_PIN) == LOW || digitalRead(UNKNOWN_BUTTON_PIN) == LOW) {
String cardID = "";
if (!(digitalRead(KNOWN_BUTTON_PIN) == LOW || digitalRead(UNKNOWN_BUTTON_PIN) == LOW)) {
for (byte i = 0; i < mfrc522.uid.size; i++) {
cardID += String(mfrc522.uid.uidByte[i] < 0x10 ? "0" : "");
cardID += String(mfrc522.uid.uidByte[i], HEX);
}
cardID.toUpperCase();
}
if (cardID == "YOUR_KNOWN_CARD_ID" || digitalRead(KNOWN_BUTTON_PIN) == LOW) { // Replace YOUR_KNOWN_CARD_ID with actual ID
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sinothile Mhlongo");
lcd.setCursor(0, 1);
lcd.print("DOB: 2010/10/10");
lcd.setCursor(0, 2);
lcd.print("Gender: Female");
lcd.setCursor(0, 3);
lcd.print("Gate is open. Pass");
digitalWrite(GREEN_LED, HIGH);
digitalWrite(RED_LED, LOW);
tone(BUZZER_PIN, 5000, 20000); // Make a sound
servo.write(180); // Rotate servo 180 degrees
delay(20000); // Delay for 20 seconds
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Card is FAILED:");
lcd.setCursor(0, 1);
lcd.print("UNKNOWN CARD");
lcd.setCursor(0, 2);
lcd.print("Please Scan the");
lcd.setCursor(0, 3);
lcd.print("Right Card");
digitalWrite(GREEN_LED, LOW);
digitalWrite(RED_LED, HIGH);
tone(BUZZER_PIN, 300, 20000); // Make a different sound
servo.write(0); // Rotate servo 0 degrees
delay(20000); // Delay for 20 seconds
}
mfrc522.PICC_HaltA();
}
}