#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <MFRC522.h>
#include <SD.h>
#include <RTClib.h>
// LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
// RFID
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);
// SD
#define SD_CS 4
File myFile;
// RTC
RTC_DS1307 rtc;
// Single LED & Buzzer
#define ledPin 6
#define buzzer 5
// Mapping UID to Names
struct Card {
String uid;
String name;
};
// Add your cards here
Card cards[] = {
{"2041E959", "UMAIR"},
{"1080FB59", "ALI"},
{"20007D14", "SARAH"},
{"23A1291A", "Jack"}
};
const int numCards = sizeof(cards)/sizeof(cards[0]);
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buzzer, OUTPUT);
Serial.begin(9600);
SPI.begin();
lcd.init();
lcd.backlight();
// Welcome Screen
lcd.setCursor(0,0);
lcd.print("RFID Attendance");
lcd.setCursor(0,1);
lcd.print("System Starting");
delay(2000);
lcd.clear();
// Initialize RFID
mfrc522.PCD_Init();
delay(1000);
Serial.println("RFID Initialized");
// Initialize SD
lcd.print("Checking SD...");
if (!SD.begin(SD_CS)) {
lcd.clear();
lcd.print("SD Failed!");
Serial.println("SD Initialization Failed!");
while(1);
}
lcd.clear();
lcd.print("SD Ready");
Serial.println("SD Ready");
delay(1500);
lcd.clear();
// Initialize RTC
lcd.print("Checking RTC...");
if (!rtc.begin()) {
lcd.clear();
lcd.print("RTC Error!");
Serial.println("RTC Initialization Failed!");
while(1);
}
lcd.clear();
lcd.print("RTC Ready");
Serial.println("RTC Ready");
delay(1500);
lcd.clear();
}
void loop() {
showDateTime();
if (mfrc522.PICC_IsNewCardPresent()) {
Serial.println("Card detected!");
if (mfrc522.PICC_ReadCardSerial()) {
Serial.println("Card serial read!");
handleCard();
} else {
Serial.println("Failed to read card serial");
}
}
}
void showDateTime() {
DateTime now = rtc.now();
lcd.setCursor(0,0);
lcd.print("Time: ");
lcd.print(now.hour());
lcd.print(":");
if(now.minute()<10) lcd.print("0");
lcd.print(now.minute());
lcd.setCursor(0,1);
lcd.print("Scan RFID Card ");
delay(1000);
}
void handleCard() {
// Read UID
String uid = "";
for (byte i = 0; i < mfrc522.uid.size; i++) {
if(mfrc522.uid.uidByte[i] < 0x10) uid += "0"; // leading zero
uid += String(mfrc522.uid.uidByte[i], HEX);
}
uid.toUpperCase();
Serial.print("Card UID: "); Serial.println(uid);
// Find name
String cardName = "Unknown";
for (int i=0; i<numCards; i++) {
if (uid == cards[i].uid) {
cardName = cards[i].name;
break;
}
}
// LED + Buzzer feedback
for(int i=0; i<3; i++) {
digitalWrite(ledPin,HIGH);
tone(buzzer, 2000);
delay(200);
digitalWrite(ledPin,LOW);
noTone(buzzer);
delay(100);
}
// LCD Display
lcd.clear();
lcd.setCursor(0,0);
lcd.print("WELCOME");
lcd.setCursor(0,1);
lcd.print(cardName);
// Serial Monitor
Serial.print("Welcome "); Serial.println(cardName);
// Save to SD
DateTime now = rtc.now();
myFile = SD.open("DATA.txt", FILE_WRITE);
if (myFile) {
myFile.print(cardName); myFile.print(" ");
if(now.hour()<10) myFile.print("0");
myFile.print(now.hour()); myFile.print(":");
if(now.minute()<10) myFile.print("0");
myFile.print(now.minute()); myFile.print(" ");
if(now.day()<10) myFile.print("0");
myFile.print(now.day()); myFile.print("/");
if(now.month()<10) myFile.print("0");
myFile.print(now.month()); myFile.print("/");
myFile.print(now.year());
myFile.println();
myFile.close();
Serial.println("Data saved to SD");
} else {
Serial.println("Failed to open DATA.txt");
}
delay(3000); // show message
lcd.clear();
// Reset RFID
mfrc522.PICC_HaltA();
mfrc522.PCD_StopCrypto1();
}