keypad-2-2

Arduino操作輸入的方法還不少,最簡單的當然是按鈕相關的元件了。但如果輸入變得複雜,像是要輸入密碼之類的,可能就要考慮使用鍵盤模組了。

Arduino的鍵盤種類相當多,有薄膜的、機械式的,5x4、4x4、4x3,4x1...等等,其中最常被使用的,就是薄膜式的4x4、4x3,基本上這兩款的使用方法一模一樣,我們先以4x4版本來做說明。

鍵盤的程式並不難,其實可以不用函式庫就能自行寫出來,但為了方便,傑森還是習慣用函式庫,選擇的是最常見的Adafruit Keypad函庫。

keypad-4

再來就是接線囉,4x4和4x3薄膜鍵盤的接線算是所有鍵盤裡面最簡單的了!

  • 列(ROWS)的腳位:從最左邊算起4個PIN。(11, 10, 9, 8)
  • 行(COLS)的腳位:定義完列後,剩下的4個腳位就是行的腳位了。(7, 6, 5, 4)
  • 為了方便接線,建議用公對公的杜邦線去連接鍵盤和Arduino。

keypad-3

傑森將範例程式keypad_test加以簡化改寫,程式很簡單,先定義是幾行幾列的鍵盤。

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] = {11, 10, 9, 8}; //定義列的腳位
byte colPins[COLS] = {7, 6, 5, 4}; /定義行的腳位

設定工作基本上就是這樣了,主要的語法customKeypad.tick()必須寫在loop裡,這樣才會不斷偵測使用者按了什麼鍵,再來就是判斷按了什麼鍵。

while(customKeypad.available()){
    keypadEvent e = customKeypad.read();
    Serial.print((char)e.bit.KEY);
    if(e.bit.EVENT == KEY_JUST_PRESSED) Serial.println(" pressed"); 
    //按下的狀態是KEY_JUST_PRESSED
    else if(e.bit.EVENT == KEY_JUST_RELEASED) Serial.println(" released");  
    //放開的狀態是KEY_JUST_RELEASED
  }

程式到這裡算是完成囉!以下分別附上4x4、4x3的範例,至於還有一款比較少見的5x4,使用方法也完全相同,只是腳位多了,大家就自行改寫囉!

4x4薄膜鍵盤範例程式

//4x4薄膜鍵盤範例程式

#include "Adafruit_Keypad.h"

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] = {11, 10, 9, 8}; //定義列的腳位
byte colPins[COLS] = {7, 6, 5, 4}; //定義行的腳位

//初始化鍵盤
Adafruit_Keypad customKeypad = Adafruit_Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS);

void setup() {
  Serial.begin(9600);
  customKeypad.begin();
  Serial.println("KeyPad Test...");
}

void loop() {
  // 開始偵測使用者的按鍵狀態
  customKeypad.tick();

  //判斷按了哪一個鍵
  while(customKeypad.available()){
    keypadEvent e = customKeypad.read();
    Serial.print((char)e.bit.KEY);
    if(e.bit.EVENT == KEY_JUST_PRESSED) Serial.println(" pressed"); 
    //按下的狀態是KEY_JUST_PRESSED
    else if(e.bit.EVENT == KEY_JUST_RELEASED) Serial.println(" released");  
    //放開的狀態是KEY_JUST_RELEASED
  }

  delay(10);
}

4x3薄膜鍵盤範例程式

//4x4薄膜鍵盤範例程式

#include "Adafruit_Keypad.h"

const byte ROWS = 4; // 列數(橫的)
const byte COLS = 3; // 行數(直的)
//鍵盤上每一個按鍵的名稱
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
byte rowPins[ROWS] = {11, 10, 9, 8}; //定義列的腳位
byte colPins[COLS] = {7, 6, 5}; //定義行的腳位
                                  

//初始化鍵盤
Adafruit_Keypad customKeypad = Adafruit_Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS);

void setup() {
  Serial.begin(9600);
  customKeypad.begin();
  Serial.println("KeyPad Test...");
}

void loop() {
  // 開始偵測使用者的按鍵狀態
  customKeypad.tick();

  //判斷按了哪一個鍵
  while(customKeypad.available()){
    keypadEvent e = customKeypad.read();
    Serial.print((char)e.bit.KEY);
    if(e.bit.EVENT == KEY_JUST_PRESSED) Serial.println(" pressed"); 
    //按下的狀態是KEY_JUST_PRESSED
    else if(e.bit.EVENT == KEY_JUST_RELEASED) Serial.println(" released");  
    //放開的狀態是KEY_JUST_RELEASED
  }

  delay(10);
}