#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <IRremote.h>
#include <dht.h>
#include <RTClib.h>
// Khai báo cấu hình
#define I2C_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_LINES 2
#define PIN_LED 13
#define DHT22_PIN 11
RTC_DS3231 rtc;
dht DHT;
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
const byte KEYPAD_ROWS = 4;
const byte KEYPAD_COLS = 4;
byte rowPins[KEYPAD_ROWS] = {5, 4, 3, 2};
byte colPins[KEYPAD_COLS] = {A3, A2, A1, A0};
char keys[KEYPAD_ROWS][KEYPAD_COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, KEYPAD_ROWS, KEYPAD_COLS);
String correctCode = "1234";
String manageCode = "0000";
//bool isLocked = true;
bool LED = false;
// Danh sách ID và trạng thái điểm danh
const int userCount = 3;
String userList[userCount] = {"1001", "1002", "1003"};
bool attendanceStatus[userCount] = {false, false, false};
// Hiển thị trạng thái điểm danh
void displayAttendance() {
//khi nhấn nút trên điều khiển thì sẽ hiển thị
lcd.clear();
lcd.print("Diem danh:");
for (int i = 0; i < userCount; i++) {
lcd.setCursor(0,1);
lcd.print(userList[i] + ": ");
lcd.print(attendanceStatus[i] ? "OK" : "Chua");
delay(2000);
lcd.clear();
}
}
// Điểm danh với ID
void saveAttendance(String id) {
lcd.clear();
bool found = false;
for (int i = 0; i < userCount; i++) {
if (userList[i] == id) {
found = true;
if (!attendanceStatus[i]) {
attendanceStatus[i] = true; // Cập nhật trạng thái
lcd.print("ID: " + id);
lcd.setCursor(0, 1);
lcd.print("Diem danh OK!");
} else {
lcd.print("ID: " + id);
lcd.setCursor(0, 1);
lcd.print("Da diem danh!");
}
break;
}
}
if (!found) {
lcd.print("ID khong hop le!");
}
delay(2000);
lcd.clear();
}
// Xử lý nhập mã điểm danh
void processAttendance() {
lcd.clear();
lcd.print("Nhap ID:");
String enteredID = "";
while (true) {
char key = keypad.getKey();
if (key == '#') { // Hủy nhập
lcd.clear();
return;
} else if (key == 'D') { // Xác nhận ID
if (enteredID.length() > 0){
saveAttendance(enteredID);
return;
}
} else if (key >= '0' && key <= '9') { // Nhập số
enteredID += key;
lcd.setCursor(0, 1);
lcd.print(enteredID);
}
}
}
// Xử lý nhập mật khẩu mở khóa
void processPassword() {
lcd.clear();
lcd.print("Enter Code:");
String enteredCode = "";
while (enteredCode.length() < 4) {
char key = keypad.getKey();
if (key && key >= '0' && key <= '9') {
enteredCode += key;
lcd.print('*');
}
}
if(enteredCode == manageCode){
displayAttendance();
}
else if (enteredCode == correctCode) {
//unlock();
lcd.clear();
lcd.print("Unlocked!");
delay(1000);
processAttendance(); // Gọi điểm danh sau khi mở khóa
} else {
lcd.clear();
lcd.print("Wrong Code!");
delay(1000);
}
}
void setup() {
lcd.begin(LCD_COLUMNS, LCD_LINES);
pinMode(PIN_LED, OUTPUT);
//lock();
lcd.print("Welcome!");
delay(1000);
lcd.clear();
}
void loop() {
processPassword();
}