身分安全識別控制
#include <Keypad.h>
#include <Wire.h> // 包含 Wire.h 標頭檔
#include <LiquidCrystal_I2C.h> // 包含 LiquidCrystal_I2C.h 標頭檔
#define Addr 0x27 // 定義 I2C 位址
LiquidCrystal_I2C LCD(0x27,20,4); // 宣告 LCD 為 20*4
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] = {22,24,26,28};
byte colPins[COLS] = {36,34,32,30};
byte Pass_set[4] = {'0','0','0','0'}; // 預設密碼陣列,可以改成8碼,將[4]改成[8],數字加到8個
byte Pass_in[4] = {}; // 儲存輸入密碼陣列
int C = 0; // 可以比對輸入數字數量
int V=0; // 驗證密碼正確與否
int mode = 0;
Keypad keynum = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void setup(){
Serial.begin(9600);
LCD.init(); //LCD 初始化
LCD.backlight(); //LCD 背光燈
LCD.setCursor(5,0); // 游標移至第 5 行第 0 列位置
LCD.print("Smart Home"); // 在 LCD 顯示「Smart Home
}
void loop(){
LCD.setCursor(3,1); // 游標移至第 3 行第 1 列位置
LCD.print("==INPUT PASS=="); //LCD 顯示「==INPUT PASS==」
while(1){ // 輸入密碼迴圈
char key = keynum.getKey(); // 讀取按鍵值
if(key != NO_KEY){ // 判斷是否按下按鍵
if (key >= 48 & key <= 57){ // 判斷按下字元是否介於「0~F」
if(C<4){ // 判斷 4 位密碼是否輸入完成
Pass_in[C]=key; // 按鍵值儲存在陣列 Pass_in[c] 內
C++; // 陣列值加「1」
LCD.setCursor(7+C,2); //LCD 游標移至「7+C,2」
LCD.print(key); //LCD 上顯示按鍵值,可將(key)改成(****)做為遮蔽密碼之用
}
}
if (key == '*'){ //「*」鍵為更正密碼
C = 0;
LCD.setCursor(8,2);
LCD.print(" "); // 清除 LCD 密碼字元
}
if (key == '#'){ //「#」鍵為密碼輸入確認鍵
if(C==4){ // 判斷是否 4 位密碼
for (int jj = 0;jj<=3;jj++) Serial.println(Pass_in[jj]);
C = 0;
for (int ii=0;ii<=3;ii++){ // 比對密碼
if(Pass_set[ii]==Pass_in[ii]) V = 1; // 比對密碼密碼正確時 ,V = 1
else {
V = 0; // 比對密碼密碼錯誤時 , V = 0
LCD.setCursor(8,3); //LCD 上顯示「error」
LCD.print("error");
delay(2000); // 延時 2 秒
LCD.setCursor(8,2); // 清除 LCD 上密碼
LCD.print(" ");
LCD.setCursor(8,3);
LCD.print(" ");
break; // 跳出輸入密碼迴圈
}
}
}
}
if (V==1){ // 判斷 V = 1( 輸入密碼正確 )
LCD.setCursor(8,2);
LCD.print(" ");
LCD.setCursor(8,3); //LCD 上顯示「OPEN」
LCD.print("OPEN");
Serial.println("open");
C = 0;
V = 0;
delay(2000); // 延時 2 秒
LCD.setCursor(8,2);
LCD.print(" "); // 清除 LCD 上字元
LCD.setCursor(8,3);
LCD.print(" ");
break;
}
}
}
}