#include <SPI.h>
#include <MFRC522.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
#include "RTClib.h"
// RFID
#define SS_PIN 21
#define RST_PIN 22
MFRC522 mfrc522(SS_PIN, RST_PIN);
// LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
// LED
#define LED_PIN 5
// RTC
RTC_DS3231 rtc;
// إعداد EEPROM
#define MAX_STUDENTS 20 // أقصى عدد طلاب
#define EEPROM_START 0 // بداية تخزين البيانات في EEPROM
#define NAME_LENGTH 16 // طول اسم الطالب
#define UID_LENGTH 8 // طول UID (HEX) بدون مسافات
struct Student {
char uid[UID_LENGTH+1];
char name[NAME_LENGTH+1];
};
Student students[MAX_STUDENTS];
void setup() {
Serial.begin(115200);
SPI.begin();
mfrc522.PCD_Init();
Wire.begin(16,17); // SDA=16, SCL=17
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Scan your card...");
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
// بدء RTC
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
// تحميل بيانات الطلاب من EEPROM
loadStudentsFromEEPROM();
Serial.println("System Ready.");
}
void loop() {
if (!mfrc522.PICC_IsNewCardPresent()) return;
if (!mfrc522.PICC_ReadCardSerial()) return;
String uidStr = "";
for (byte i = 0; i < mfrc522.uid.size; i++) {
if (mfrc522.uid.uidByte[i] < 0x10) uidStr += "0";
uidStr += String(mfrc522.uid.uidByte[i], HEX);
}
uidStr.toUpperCase();
String studentName = "Unknown";
for (int i=0; i<MAX_STUDENTS; i++) {
if (uidStr.equals(String(students[i].uid))) {
studentName = String(students[i].name);
break;
}
}
// الحصول على الوقت والتاريخ من RTC
DateTime now = rtc.now();
char buffer[30];
sprintf(buffer, "%02d/%02d/%04d %02d:%02d:%02d",
now.day(), now.month(), now.year(),
now.hour(), now.minute(), now.second());
// طباعة سجل في Serial Monitor
Serial.print(buffer);
Serial.print(" - ");
Serial.println(studentName);
// عرض الاسم على LCD
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Student:");
lcd.setCursor(0,1);
lcd.print(studentName);
if (studentName != "Unknown") digitalWrite(LED_PIN, HIGH);
else digitalWrite(LED_PIN, LOW);
delay(3000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Scan your card...");
digitalWrite(LED_PIN, LOW);
mfrc522.PICC_HaltA();
}
// === وظائف EEPROM ===
void loadStudentsFromEEPROM() {
for (int i=0; i<MAX_STUDENTS; i++) {
int addr = EEPROM_START + i*(UID_LENGTH+NAME_LENGTH);
for (int j=0; j<UID_LENGTH; j++) students[i].uid[j] = EEPROM.read(addr+j);
students[i].uid[UID_LENGTH] = '\0';
for (int j=0; j<NAME_LENGTH; j++) students[i].name[j] = EEPROM.read(addr+UID_LENGTH+j);
students[i].name[NAME_LENGTH] = '\0';
}
}
void saveStudentToEEPROM(int index, String uid, String name) {
if (index<0 || index>=MAX_STUDENTS) return;
int addr = EEPROM_START + index*(UID_LENGTH+NAME_LENGTH);
for (int i=0; i<UID_LENGTH; i++) EEPROM.write(addr+i, i<uid.length()? uid[i] : 0);
for (int i=0; i<NAME_LENGTH; i++) EEPROM.write(addr+UID_LENGTH+i, i<name.length()? name[i] : 0);
EEPROM.commit();
loadStudentsFromEEPROM();
}