#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN 9
#define SS_PIN 10
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
// byte rowPins[ROWS] = {9, 8, 7, 6}; // Kết nối với hàng của bàn phím
// byte colPins[COLS] = {5, 4, 3, 2}; // Kết nối với cột của bàn phím
// Kết nối hàng với các chân analog
byte rowPins[ROWS] = {A3, A2, A1, A0};
// Kết nối cột với các chân digital
byte colPins[COLS] = {5,4,3,2};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
LiquidCrystal_I2C lcd(0x27, 16, 2);
MFRC522 rfid(SS_PIN, RST_PIN);
const String pinMessageRow1 = "SCAN RFID CARD ";
const String pinMessageRow2 = "OR PIN: ";
bool firstRun = true; // Biến đánh dấu lần chạy đầu tiên
char pin[5] = "1234"; // Mã PIN ban đầu
char inputPin[5] = "";
byte inputIndex = 0;
bool authenticated = false;
byte authMode = 0; // 0: PIN, 1: RFID
unsigned long authTime = 0; // Thời gian bắt đầu xác thực
const unsigned long AUTH_TIMEOUT = 5000; // Thời gian xác thực (5 giây)
void setup() {
pinMode(13, OUTPUT); // Đèn đỏ
pinMode(12, OUTPUT); // Đèn xanh
pinMode(11, OUTPUT); // Đèn vàng (ví dụ cho chức năng nâng cao)
digitalWrite(13, HIGH); // Bật đèn đỏ ban đầu
Serial.begin(9600);
SPI.begin();
rfid.PCD_Init();
lcd.init();
lcd.backlight();
lcd.clear();
showMessage();
}
void loop() {
if (firstRun) {
// Thiết lập mã PIN và thẻ RFID
lcd.clear();
lcd.print("Set New PIN:");
setNewPin();
lcd.clear();
lcd.print("Scan RFID Tag:");
// setNewRfidTag();
firstRun = false;
lcd.clear();
showMessage();
inputIndex = 0;
}
if (authenticated) {
// Giai đoạn 4: Chức năng nâng cao
char key = keypad.getKey();
unsigned long currentTime = millis();
if (key == '#' || currentTime - authTime > AUTH_TIMEOUT) {
authenticated = false;
digitalWrite(12, LOW); // Tắt đèn xanh
digitalWrite(13, HIGH); // Bật đèn đỏ
lcd.clear();
showMessage();
inputIndex = 0;
memset(inputPin, 0, sizeof(inputPin));
} else if (key == 'A') {
// Thay đổi trạng thái đèn vàng
digitalWrite(11, !digitalRead(11));
}
} else {
// Giai đoạn 1 và 2: Nhập PIN hoặc quét RFID
char key = keypad.getKey();
if (key) {
if (key == '*') {
inputIndex = 0;
memset(inputPin, 0, sizeof(inputPin));
lcd.clear();
showMessage();
} else if (inputIndex < 4) {
inputPin[inputIndex] = key;
// lcd.setCursor(inputIndex, 1);
lcd.print("*");
inputIndex++;
}
if (inputIndex == 4) {
// Giai đoạn 3: Kiểm tra tính hợp lệ
authMode = 0;
if (strcmp(inputPin, pin) == 0) {
authenticated = true;
authTime = millis();
digitalWrite(13, LOW); // Tắt đèn đỏ
digitalWrite(12, HIGH); // Bật đèn xanh
lcd.clear();
lcd.print("Authenticated");
} else {
for (byte i = 0; i < 5; i++) {
digitalWrite(13, HIGH);
delay(200);
digitalWrite(13, LOW);
delay(200);
}
lcd.clear();
lcd.print("Access Denied");
delay(1000);
lcd.clear();
showMessage();
inputIndex = 0;
memset(inputPin, 0, sizeof(inputPin));
}
}
}
// Kiểm tra RFID
if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) {
authMode = 1;
String rfidTag = "";
for (byte i = 0; i < rfid.uid.size; i++) {
rfidTag.concat(String(rfid.uid.uidByte[i], HEX));
}
rfid.PICC_HaltA();
// Kiểm tra tính hợp lệ của RFID
if (rfidTag == "YOUR_RFID_TAG") { // Thay thế bằng RFID tag hợp lệ
authenticated = true;
digitalWrite(13, LOW); // Tắt đèn đỏ
digitalWrite(12, HIGH); // Bật đèn xanh
lcd.clear();
lcd.print("Authenticated");
} else {
for (byte i = 0; i < 5; i++) {
digitalWrite(13, HIGH);
delay(200);
digitalWrite(13, LOW);
delay(200);
}
lcd.clear();
lcd.print("Access Denied");
delay(1000);
lcd.clear();
showMessage();
}
}
}
}
void showMessage() {
lcd.setCursor(0, 0);
lcd.print(pinMessageRow1);
lcd.setCursor(0, 1);
lcd.print(pinMessageRow2);
}
void setNewPin() {
memset(pin, 0, sizeof(pin));
inputIndex = 0;
while (inputIndex < 4) {
char key = keypad.getKey();
if (key && isDigit(key)) {
pin[inputIndex] = key;
lcd.setCursor(inputIndex, 1);
lcd.print("*");
inputIndex++;
}
}
lcd.clear();
lcd.print("New PIN set.");
delay(1000);
}
void setNewRfidTag() {
String rfidTag = "";
while (rfidTag == "") {
if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) {
for (byte i = 0; i < rfid.uid.size; i++) {
rfidTag.concat(String(rfid.uid.uidByte[i], HEX));
}
rfid.PICC_HaltA();
}
}
lcd.clear();
lcd.print("New Tag set.");
delay(1000);
}