#include <SPI.h>
#include <MFRC522.h>
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
#define SS_PIN 10
#define RST_PIN 9
#define LED_YASHIL 2
#define LED_QIZIL 3
MFRC522 rfid(SS_PIN, RST_PIN);
RTC_DS1307 rtc;
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Tizimga kiritilgan xodim kartasi UID kodi
byte xodim_UID[] = {0x1A, 0x2B, 0x3C, 0x4D};
// Ish boshlanish vaqti: 09:00
const int ISH_SOATI = 9;
const int ISH_DAQIQASI = 0;
void setup() {
Serial.begin(9600);
SPI.begin();
rfid.PCD_Init();
lcd.init();
lcd.backlight();
rtc.begin();
pinMode(LED_YASHIL, OUTPUT);
pinMode(LED_QIZIL, OUTPUT);
lcd.print("Tizim Tayyor...");
}
void loop() {
if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) return;
bool xodimTogri = true;
for (byte i = 0; i < 4; i++) {
if (rfid.uid.uidByte[i] != xodim_UID[i]) {
xodimTogri = false;
break;
}
}
DateTime hozir = rtc.now();
lcd.clear();
if (xodimTogri) {
lcd.setCursor(0, 0);
lcd.print("Aliyev A.");
// Kechikishni hisoblash algoritmi
int joriyDaqiqaUtsin = (hozir.hour() * 60) + hozir.minute();
int ishDaqiqaUtsin = (ISH_SOATI * 60) + ISH_DAQIQASI;
lcd.setCursor(0, 1);
if (joriyDaqiqaUtsin <= ishDaqiqaUtsin) {
// Vaqtida kelgan holat
lcd.print("Vaqtida keldi");
digitalWrite(LED_YASHIL, HIGH);
delay(1000);
digitalWrite(LED_YASHIL, LOW);
Serial.println("Xodim: Aliyev A. | Holati: Vaqtida keldi | Soat: " + String(hozir.hour()) + ":" + String(hozir.minute()));
} else {
// Kechikib kelgan holat
int kechikish = joriyDaqiqaUtsin - ishDaqiqaUtsin;
lcd.print("Kechikdi: " + String(kechikish) + " m");
digitalWrite(LED_QIZIL, HIGH);
delay(1000);
digitalWrite(LED_QIZIL, LOW);
Serial.println("Xodim: Aliyev A. | Holati: KECHIKDI (" + String(kechikish) + " daqiqa) | Soat: " + String(hozir.hour()) + ":" + String(hozir.minute()));
}
} else {
lcd.print("Noma'lum Karta!");
digitalWrite(LED_QIZIL, HIGH);
delay(500);
digitalWrite(LED_QIZIL, LOW);
}
delay(2000);
rfid.PICC_HaltA();
}