Pada posting sebelumnya, kita sudah mencoba menampilkan sesuatu di LCD.
Sekarang kita coba menampilkan suatu karakter di LCD menggunakan input sebuah keypad.
Peralatan yang digunakan :
·
Arduino Uno + konektor
·
Keypad ukuran 4x4
·
Potensiometer 10K
·
Resistor 220 ohm
·
Kabel tembaga
·
LCD 2x16
·
Breadboard (optional)
·
Peralatan solder (optional)
Keypad yang digunakan dalam
percobaan ini adalah keypad 4x4. Gambar di bawah adalah gambar dari keypad yang
digunakan.
Rangkaian keypad |
Keypad tersebut
memiliki 8 buah
pin dengan rangkaian kabel seperti pada gambar. Dapat dilihat pin 1
(paling kiri) - 4 terhubung masing-masing ke kolom 1-4 dan pin 5-8
terhubung ke masing-masing baris 1-4.
LCD yang digunakan sama
dengan LCD yang digunakan pada percobaan
sebelumnya. Meskipun demikian, pemasangan pin berbeda dengan
percobaan sebelumnya.
Pada percobaan ini jumlah kabel yang digunakan
sangat banyak sehingga perlu hati-hati dalam pemasangan. Pastikan rangkaian
terpasang dengan benar sebelum alat dinyalakan untuk mencegah kerusakan.
Source code
#include <LiquidCrystal.h>
const int numRows = 4; //Konstanta jumlah baris pada keypad
const int numCols = 4; //Konstanta jumlah kolom pada keypad
const int debounceTime = 100; //Debouncer
const int rowPins[numRows] = { 7, 6, 5, 4 }; //Pin untuk baris 1-4
const int colPins[numCols] = { 3, 2, A1, A0 };//Pin unttuk kolom 1-4
// Pemetaan baris dan kolom ke karakter
const char keymap[numRows][numCols] = {
{ '1', '2', '3', 'A' } ,
{ '4', '5', '6', 'B' } ,
{ '7', '8', '9', 'C' } ,
{ '*', '0', '#', 'D' }
};
// Inisialisasi pin LCD
LiquidCrystal lcd(8, 9, 10 ,11, 12, 13);
void setup(){
lcd.begin(2, 16); //Inisialisasi jumlah baris dan kolom pada LCD
for (int row = 0; row <
numRows; row++){
pinMode(rowPins[row],INPUT); // Pin baris sebagai input
digitalWrite(rowPins[row],HIGH); // Mengaktifkan pull-up resistor
}
for (int column = 0; column
< numCols; column++){
pinMode(colPins[column],OUTPUT); // Pin kolom sebagai output
digitalWrite(colPins[column],HIGH);
}
}
void loop(){
char key = getKey();
if( key != 0) {
lcd.print(key); //Print ke LCD
}
}
char getKey(){
char key = 0; // Belum ada karakter yang dimasukkan
for(int column = 0; column
< numCols; column++){
digitalWrite(colPins[column],LOW); // Memeriksa kkolom
for(int row = 0; row <
numRows; row++) {
if(digitalRead(rowPins[row]) == LOW){
delay(debounceTime); //
debounce
while(digitalRead(rowPins[row]) == LOW) //Menunggu tombol dilepas
;
key =
keymap[row][column];
}
}
digitalWrite(colPins[column],HIGH);
}
return key; //Mengembalikan karakter
}
Penjelasan
Pertama pin-pin yang digunakan
oleh keypad dan LCD diinisialisasi. Pin yang digunakan oleh keypad adalah pin
7, 6, 5, dan 4 untuk baris 1-4 dan pin 3, 2, A1,dan A0 untuk kolom 1-4 dan pin
13-8 untuk LCD. Kemudian dilakukan pemetaan dari input baris dan kolom ke karakter
pada keypad. Setelah itu semua pin baris dan kolom keypad diberikan nilai HIGH.
Pada program terdapat
sebuah fungsi getKey() untuk mendapatkan sebuah karakter dari input keypad. Pertama-tama
dilakukan pengecekan terhadap setiap kolom untuk baris yang ditekan. Kolom yang
sedang dicek diberi nilai LOW. Kemudian dalam kolom tersebut dicek apakah ada
baris yang bernilai LOW. Pin baris pada percobaan ini bersifat sebagai pull-up resistor. Pull-up resistor memiliki nilai HIGH ketika rangkaian terbuka.
Rangkaian pada keypad bersifat
terbuka pada keadaan normal sehingga tidak ada arus yang mengalir. Ketika sebuah
tombol ditekan, maka rangkaian menjadi tertutup pada baris dan kolom yang bersangkutan.
Karena rangkaian tertutup, pin baris menjadi bernilai LOW. Karakter akan
diperoleh dengan memasukkan indeks baris dan kolom aktif pada matriks karakter.
Pada fungsi loop(), program menjalankan fungsi
getKey() secara berulang dan memeriksa apakah getKey() mengembalikan suatu
karakter. Jika ya, karakter tersebut akan ditampilkan ke LCD.