Bài viết hướng dẫn các bạn phương pháp sử dụng module 4×4 với một thư viện khá hay trên Arduino.
I.Giới thiệu Bàn phím ma trận 4×4 (matrix keypad 4×4)
Trên đây là hình ảnh sơ đồ nguyên lý của module bàn phím 4×4. Tuy có đến 16 nút nhấn, nghĩa là nếu làm một cách thông thường (dùng chân digital) thì chúng ta phải cần đến 16 chân Arduino để đọc. Nhưng với bàn phím này, chúng ta chỉ cần dùng 8 chân (4 chân hàng ngang (row), và 4 chân cột dọc (column)).
Để kiểm tra một nút có được nhấn hay không? Họ sẽ sử dụng phương pháp quét được mô tả bằng đoạn mã giả như sau:
Với mỗi hàng (R1 đến R4), Chọn ra hàng Ri
- Cấp cực âm (0v) cho hàng Ri
- Nếu điện áp ở chân Cj bất kì là dương (INPUT PULLUP) => chưa nhấn
- Nếu điện áp ở chân Cj bất kì là âm (INPUT PULLUP) => đang nhấn
II.Hướng dẫn sử dụng module này với board Arduino
Bạn hoàn toàn có thể tự làm một chương trình để sử dụng theo thuật toán trên. Tuy nhiên, sẽ rất khó cho một newbie để làm các hiệu ứng trên nút nhấn khác như: nhấn giữ, nhấn double click,… Nên mình sẽ hướng dẫn các bạn sử dụng một thư viện khá phổ biến trong Arduino, đó là thư viện Keypad.
III.Nối dây
Arduino | Keypad |
5 | R1 |
6 | R2 |
7 | R3 |
8 | R4 |
9 | C1 |
10 | C2 |
11 | C3 |
12 | C4 |
IV.Mã lập trình (code)
#include Keypad.h
//Bạn có thể tham khảo thêm tại: https://github.com/Chris--A/Keypad/blob/master/examples/HelloKeypad/HelloKeypad.ino
const byte rows = 4; //số hàng
const byte columns = 4; //số cột
int holdDelay = 700; //Thời gian trễ để xem là nhấn 1 nút nhằm tránh nhiễu
int n = 3; //
int state = 0; //nếu state =0 ko nhấn,state =1 nhấn thời gian nhỏ , state = 2 nhấn giữ lâu
char key = 0;
//Định nghĩa các giá trị trả về
char keys[rows][columns] =
{
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'},
};
byte rowPins[rows] = {5, 6, 7, 8}; //Cách nối chân với Arduino
byte columnPins[columns] = {9, 10, 11, 12};
//cài đặt thư viện keypad
Keypad keypad = Keypad(makeKeymap(keys), rowPins, columnPins, rows, columns);
void setup() {
Serial.begin(9600);//bật serial, baudrate 9600
}
void loop() {
char temp = keypad.getKey();
if ((int)keypad.getState() == PRESSED) {
if (temp != 0) {
key = temp;
}
}
if ((int)keypad.getState() == HOLD) {
state++;
state = constrain(state, 1, n-1);
delay(holdDelay);
}
if ((int)keypad.getState() == RELEASED) {
key += state;
state = 0;
//Xuất lên Máy tính để xem kết quả
Serial.println(key);
}
delay(100);