// pass 1234
// Nút # >> kiểm tra mật khẩu
// Nút * >> thay đổi mật khẩu
#include <Keypad.h>
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
//#include <MFRC522.h>
#include <Servo.h>
// #define SS_PIN 10
// #define RST_PIN 9
#define SERVO_PIN 11 // Servo
#define PASSWORD_LENGTH 4
const byte ROWS = 4;
const byte COLS = 3;
char keys[ROWS][COLS] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
byte rowPins[ROWS] = {2, 3, 4, 5};
byte colPins[COLS] = {A1, A2, A3};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
LiquidCrystal_I2C lcd(0x27, 16, 2); // Địa chỉ I2C LCD và kích thước LCD
char password[PASSWORD_LENGTH + 1] = "1234"; // Mật khẩu mặc định
char enteredPassword[PASSWORD_LENGTH + 1];
const int lockPin = 6; // Chân kết nối relay để mở cửa
const int buzzerPin = 7; // Chân kết nối buzzer
const int buttonPin = 8; // Chân kết nối nút bấm
int buttonState = HIGH; // Trạng thái nút nhấn
int lastState = HIGH; // Trạng thái nút nhấn trước đó
bool isLocked = true;
// MFRC522 mfrc522(SS_PIN, RST_PIN);
Servo servo;
void setup() {
Serial.begin(9600);
lcd.init();
lcd.begin(16, 2); // Khởi tạo LCD
lcd.backlight();
lcd.clear();
lcd.print("-- SMART LOCK --");
pinMode(lockPin, OUTPUT); // Khởi tạo chân kết nối relay
digitalWrite(lockPin, HIGH); // Khóa cửa ban đầu
pinMode(buzzerPin, OUTPUT); // Khởi tạo chân kết nối buzzer
pinMode(buttonPin, INPUT_PULLUP); // Khởi tạo chân kết nối nút nhấn
// SPI.begin();
// mfrc522.PCD_Init();
// mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max);
servo.attach(SERVO_PIN);
Serial.begin(9600);
isLocked = true;
servo.write(0);
}
void loop() {
// if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) {
// handleRFID();
// }
// if (digitalRead(buttonPin) == LOW) {
// lcd.clear();
// lcd.print("XXXXXXXXXXXXXX");
// }
//checkLock();
checkButton();
//checkLock();
// if (digitalRead(buttonPin == LOW))
// {
// isLocked = !isLocked;
// digitalWrite(lockPin, isLocked ? HIGH : LOW);
// if (isLocked == false){
// unlock();
// } else {
// lock();
// }
// }
char key = keypad.getKey();
if (key)
{
if (key == '#') {
checkPassword();
} else if (key == '*') {
changePassword();
} else {
addKeyToEnteredPassword(key);
}
}
}
void checkPassword() {
// so sánh mật khẩu
if (strcmp(enteredPassword, password) == 0) {
//unlock();
lcd.clear();
beep(isLocked ? 1 : 2);
unlock();
delay(2000);
lcd.clear();
lcd.print("-- SMART LOCK --");
clearEnteredPassword();
} else {
lcd.clear();
lcd.print(" Wrong password");
Serial.println("Wrong password");
beep(5);
lock();
delay(2000);
lcd.clear();
lcd.print("-- SMART LOCK --");
clearEnteredPassword();
}
}
void changePassword() {
lcd.clear();
lcd.print("Set new password");
char newpassword[PASSWORD_LENGTH + 1];
clearEnteredPassword();
for (int i = 0; i < PASSWORD_LENGTH; i++) {
char key = keypad.waitForKey();
lcd.setCursor(i+6, 1);
lcd.print('*');
newpassword[i] = key;
}
newpassword[PASSWORD_LENGTH] = '\0';
strcpy(password, newpassword);
isLocked = true;
lcd.clear();
lcd.print("Password changed");
beep(3);
delay(2000);
lcd.clear();
lcd.print("-- SMART LOCK --");
}
void addKeyToEnteredPassword(char key) {
int passwordLength = strlen(enteredPassword);
if (passwordLength < PASSWORD_LENGTH) {
enteredPassword[passwordLength] = key;
enteredPassword[passwordLength + 1] = '\0';
lcd.setCursor(passwordLength +6, 1);
lcd.print('*');
}
}
void clearEnteredPassword() {
lcd.setCursor(0, 1);
lcd.print(" "); // Xóa dòng thứ 2
enteredPassword[0] = '\0';
}
// void button() {
// isLocked = !isLocked;
// digitalWrite(lockPin, isLocked ? HIGH : LOW);
// }
void checkLock() {
if (isLocked == false){
servo.write(90);
}
if (isLocked == true){
servo.write(0);
}
digitalWrite(lockPin, isLocked ? HIGH : LOW);
//delay (1000);
}
void checkButton() {
buttonState = digitalRead(buttonPin); // Đọc trạng thái của nút nhấn
if (buttonState == LOW) {
// unlock();
// delay(10000);
// lock();
if (isLocked == false) {
lock();
} else {
unlock();
}
}
}
void unlock() {
isLocked = false;
servo.write(90);
digitalWrite(lockPin,LOW);
Serial.println("unlocked");
lcd.setCursor(0, 1);
lcd.print(" unlocked ");
beep(1);
delay (1000);
}
// Chương trình con khoá cửa
void lock() {
isLocked = true;
servo.write(0);
digitalWrite(lockPin,HIGH);
Serial.println("locked");
lcd.setCursor(0, 1);
lcd.print(" locked ");
beep(2);
delay (1000);
}
//UNCOMMENT
// void handleRFID() {
// // Đọc ID thẻ RFID
// String rfid = "";
// for (byte i = 0; i < mfrc522.uid.size; i++) {
// rfid.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? "0" : ""));
// rfid.concat(String(mfrc522.uid.uidByte[i], HEX));
// }
// mfrc522.PICC_HaltA();
// // Kiểm tra ID thẻ RFID
// if (rfid == "xxx") { // Thay thế "xxx" bằng ID của thẻ RFID
// // Mở khóa
// unlock();
// }
// }
void beep(int times) {
for (int i = 0; i < times; i++) {
digitalWrite(buzzerPin, HIGH);
delay(200);
digitalWrite(buzzerPin, LOW);
delay(200);
}
}