身分安全識別控制

#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;

      }

    }

  }

}