Arduino筆記(68):用4x4薄膜鍵盤密碼控制磁閥開關

之前有寫過一篇使用RFID 控制電磁閥開關的文章:Arduino筆記(23):無線射頻 RFID 控制電磁閥開關,另一個管制門禁的方法是使用鍵盤輸入密碼,密碼正確時可以進入,錯誤就無法啟動電磁閥開關,今天的實作要使用密碼作為門禁進出的管制措施。



常見的數字薄膜鍵盤有兩種:3×4和4×4,4x4多了一排英文字母ABCD。薄膜鍵盤是由行和列組成的矩陣。每個鍵都分配給某個行和列(參見下圖)。

source: circuitdigest

在4行x4列的按鈕鍵盤上,第一個鍵是在第1行和第1列(R1C1)之間建立連接。2是R1C2,3是R1C3,5是R2C1 ...等。4×4按鍵鍵盤分成列、行兩組,共有8個接腳,可連接Arduino的Pin腳,本實作連接 Pin 2 ~ Pin 9。

[安裝Keypad程式庫]

本實作需要安裝以下程式庫:
程式庫(Library)安裝方法請參考另一篇文章:  Arduino筆記:安裝 Arduino IDE 程式庫(Library)

[材料]

  • Arduino Uno x 1
  • 4x4 Keypad x 1
  • 繼電器 Relay x 1
  • 1602 LCD顯示器 x 1
  • LCD I2C 轉接模組 x 1 
  • 1.5V電池 x 4
  • 電池座 x 1
  • 麵包板 x 1
  • 連接線 x n 條


[接線與電路圖]


[程式]

在程式中寫入固定的密碼「147*2580」八碼,當輸入的密碼跟這組一樣時,才會將 Pin 12 寫入高電位,啟動繼電器讓電磁閥動作。
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>

#define Password_Length 9 

int signalPin = 12;

char Data[Password_Length]; 
char Master[Password_Length] = "147*2580";  //密碼
byte data_count = 0, master_count = 0;
bool Pass_is_good;
char customKey;

const byte ROWS = 4;
const byte COLS = 4;

// 定義鍵盤的陣列
char hexaKeys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};

// 鍵盤行列對應的 Pin
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};

Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

LiquidCrystal_I2C lcd(0x27, 16, 2);  

void setup(){
  lcd.init(); 
  lcd.backlight();
  pinMode(signalPin, OUTPUT);
}

void loop(){

  lcd.setCursor(0,0);
  lcd.print("Enter Password:");

  // 取得按下的鍵值
  customKey = customKeypad.getKey();
  if (customKey){
    Data[data_count] = customKey; 
    lcd.setCursor(data_count,1); 
    lcd.print(Data[data_count]); 
    data_count++; 
    }

  if(data_count == Password_Length-1){
    lcd.clear();

    if(!strcmp(Data, Master)){
      lcd.print("Correct");
      // 設定啟動 Relay 
      digitalWrite(signalPin, HIGH); 
      delay(5000);
      digitalWrite(signalPin, LOW);
      }
    else{
      lcd.print("Incorrect");
      delay(1000);
      }
    
    lcd.clear();
    clearData();  
  }
}

void clearData(){
  while(data_count !=0){
    Data[data_count--] = 0; 
  }
  return;
}

[實作結果]


[參考資料]

6 留言

  1. 抱歉問的問題跟文章無關
    請問電磁閥可以從哪裡取得?
    電子材料行嗎

    回覆刪除
    回覆
    1. 我先前是在拍賣網站買的,可以直接搜尋比價後訂購。

      刪除
  2. 請問有辦法更動密碼嗎

    回覆刪除
  3. 改第7行 char Master[Password_Length] = "147*2580"; //密碼 中""內文字即可

    回覆刪除
  4. 哇哇 我做得出來 太感謝大大分享了QQ

    回覆刪除
  5. 請問一下如果是用esp8266做的話 程式需要改那些

    回覆刪除

張貼留言

較新的 較舊