#include <Keypad.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
// 定義密碼存儲數量
#define MAX_PASSWORDS 20
#define MAX_IDS 20
// 定義管理員密碼
#define ADMIN_PASSWORD "49502521"
// 初始化 LCD 顯示器
LiquidCrystal_I2C lcd(0x27, 16, 2);
// 初始化鍵盤按鈕陣列
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};
byte colPins[COLS] = {5, 4, 3, 2};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// 儲存所有密碼
String passwords[MAX_PASSWORDS];
String ids[MAX_IDS];
// 目前儲存的密碼數量
int passwordCount = 0;
int idCount = 0;
// 是否已經輸入管理員密碼
bool isAdminEntered = false;
bool noPassword = false;
Servo myservo;
void setup() {
Serial.begin(115200);
// 初始化 LCD 顯示器
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Enter Password:");
passwords[passwordCount] = "49502521";
passwordCount++;
ids[idCount] = "49502521";
idCount++;
pinMode(15,OUTPUT);
pinMode(16,OUTPUT);
pinMode(17,OUTPUT);
myservo.attach(10);
myservo.write(0);
}
void loop() {
// 等待按下按鈕'#'
char key = keypad.waitForKey();
// 檢查管理員密碼
if (!isAdminEntered && key == '#') {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Enter Admin");
lcd.setCursor(0, 1);
lcd.print("Password:");
// 等待輸入管理員密碼
uint32_t password_in=WaitAdmin();
// 檢查管理員密碼是否正確
if (String(password_in) == ADMIN_PASSWORD) {
EnteredAdminMode();
}
else {
isAdminEntered = false;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Wrong Password");
delay(500);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Enter Password:");
}
}
else{
NormalMode(key);
}
}
void EnteredAdminMode(){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("New Password:");
lcd.setCursor(0, 1);
String password = "";
while (password.length() < 8) {
char key = keypad.waitForKey();
if (key != NO_KEY) {
password += key;
lcd.setCursor(password.length() - 1, 1);
lcd.print("*");
}
}
// 將新密碼儲存到密碼陣列中
passwords[passwordCount] = password;
passwordCount++;
// 顯示成功訊息
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Password Saved");
isAdminEntered = false;
delay(500);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Enter Password:");
}
uint32_t WaitAdmin(){
String password = "";
while (password.length() < 8) {
char key = keypad.waitForKey();
if (key != NO_KEY) {
password += key;
if(password.length()==1){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Enter Admin");
}
lcd.setCursor(password.length() - 1, 1);
lcd.print("*");
}
}
return password.toInt();
}
void NormalMode(char key){
String password = "";
password += key;
lcd.setCursor(password.length() - 1, 1);
lcd.print("*");
while (password.length() < 8) {
char key = keypad.waitForKey();
if (key != NO_KEY) {
password += key;
lcd.setCursor(password.length() - 1, 1);
lcd.print("*");
}
}
for (int i = 0; i < MAX_PASSWORDS; i++) {
if (String(password) == passwords[i]) {
noPassword = false;
AccessGranted();
break;
}
else {
noPassword = true;
}
}
if(noPassword){
AccessDenied();
}
}
void AccessGranted(){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Access Granted!");
tone(17,2200,200);
digitalWrite(15,1);
tone(17,2300);
delay(40);
noTone(17);
delay(80);
tone(17,2300);
delay(40);
noTone(17);
myservo.write(90);
delay(900);
digitalWrite(15,0);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Enter Password:");
myservo.write(0);
}
void AccessDenied(){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Access Denied!");
digitalWrite(16,1);
tone(17,1600);
delay(40);
noTone(17);
delay(90);
tone(17,1600);
delay(40);
noTone(17);
delay(900);
digitalWrite(16,0);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Enter Password:");
}