身分識別專題

密碼身分識別+繼電器動作與LED顯示

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

int relay = 3;          //設定繼電器腳位

int LEDred = 4;          //設定密碼正確時LED亮紅燈

int LEDblue = 5;         //設定密碼錯誤時LED亮藍燈

int bzz = 6; //蜂鳴器

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

  pinMode(relay,OUTPUT); // 設定繼電器

  pinMode(LEDred,OUTPUT);

  pinMode(LEDblue,OUTPUT);

  pinMode(bzz, OUTPUT); //設定蜂鳴器

  digitalWrite(relay,HIGH); // 設定繼電器狀態

  digitalWrite(LEDred,HIGH); // 設定紅燈LED初始狀態

  digitalWrite(LEDblue,LOW); // 設定藍燈LED初始狀態

}


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"); 

        digitalWrite(relay,LOW);    // 繼電器打開

        digitalWrite(LEDred,LOW);   // LED紅燈亮

        digitalWrite(LEDblue,HIGH); // LED藍燈滅

        tone(6, 523, 500);          //蜂鳴器0.5秒

        Serial.println("open");

        C = 0;

        V = 0;

        delay(2000);                // 延時 2 秒

        digitalWrite(relay,HIGH);   // 繼電器關閉

        digitalWrite(LEDred,HIGH);  // LED紅燈滅

        digitalWrite(LEDblue,LOW);  // LED藍燈亮

        LCD.setCursor(8,2);

        LCD.print("           ");   // 清除 LCD 上字元

        LCD.setCursor(8,3);

        LCD.print("           "); 

        break;

      }

    }

  }

}