之前有寫過一篇使用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做的話 程式需要改那些
回覆刪除張貼留言