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

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

在4行x4列的按鈕鍵盤上,第一個鍵是在第1行和第1列(R1C1)之間建立連接。2是R1C2,3是R1C3,5是R2C1 ...等。4×4按鍵鍵盤分成列、行兩組,共有8個接腳,可連接Arduino的Pin腳,本實作連接 Pin 2 ~ Pin 9。
程式庫(Library)安裝方法請參考另一篇文章: Arduino筆記:安裝 Arduino IDE 程式庫(Library)。
常見的數字薄膜鍵盤有兩種: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;
}
[實作結果]
[參考資料]
- Randomnerdtutorials:Arduino Membrane Keypad Tutorial
- Circuitbasics:How to set up a keypad on an Arduino

抱歉問的問題跟文章無關
回覆刪除請問電磁閥可以從哪裡取得?
電子材料行嗎
我先前是在拍賣網站買的,可以直接搜尋比價後訂購。
刪除請問有辦法更動密碼嗎
回覆刪除改第7行 char Master[Password_Length] = "147*2580"; //密碼 中""內文字即可
回覆刪除哇哇 我做得出來 太感謝大大分享了QQ
回覆刪除請問一下如果是用esp8266做的話 程式需要改那些
回覆刪除張貼留言