twitter


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.



Rangkaian percobaan


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.

0 komentar:

Posting Komentar