Kali ini akan saya bahas tentang bagaimana memanfaatkan LCD 2×16 (berbasis HD44780). Yang dibutuhkan adalah board Arduino UNO atau yang kompatibel, atau menggunakan mikrokontroler AVR apa saja (pengin tahu caranya? klik disini) serta rangkaian LCD sebagaimana digunakan pada LCD Shield produksi DFRobot.com. Oiya Arduino IDE-nya tetap digunakan (pake saja versi terbaru juga oke).

LCD Shield produk DFRobot.com

Rangkaian yang digunakan merujuk LCD Shield (klik PDF). Ada 2 hal yang saya coba cantumkan gambarnya disini.

  • Gambar 1 merupakan gambar antarmuka LCD 2×16 menggunakan jalur data 4-bit (bisa juga 8-bit, tapi 4-bit lebih ngirit dan jalurnya bisa digunakan untuk keperluan lainnya).
  • Gambar 2 merupakan antarmuka pushbutton yang menggunakan konsep pembagi tegangan. Maksudnya? Jika selama ini tombol atau pushbutton disambung ke pin mikrokontroler langsung nah yang ini beda! Kita gunakan rangkaian pembagi tegangan yang dihubungkan ke AD0 (masukan analog pertama) dari board Arduino-nya.

Gambar 1. Antarmuka LCD 4-bit

Gambar 2. Antarmuka tombol ke masukan A0

Ringkasan Cara Kerja

  • Cara kerja LCD 2×16 menggunakan antarmuka 4-bit bisa dibaca maupun diperlajari melalui datasheet PDF-nya;
  • Unduh pustaka LCD untuk Arduino disini;
  • Cara kerja tombol menggunakan rangkaian 5 (lima) tingkat pembagi tegangan, yang intinya adalah penggunaan resistor (perhatikan Gambar 2). Jika tidak ada satupun tombol yang ditekan maka A0 tersambung ke Vcc melalui R2 (22K).
  • Jika tombol SELECT ditekan maka terjadi penjumlahan resistor secara seri (R2+R3+R4+R5+R6) kemudian menuju GND. Demikian juga dengan masing-masing tombol yang ditekan akan menghasilkan nilai tegangan yang berbeda-beda, menyesuaikan R totaslnya, hal inilah yang digunakan untuk mendeteksi tombol mana yang ditekan (lihat pada penjelasan program).

Listing Program

Awal program sebagai berikut… (Perhatikan pencantuman pustaka “LCD4Bit_mod.h“-nya…
#include <LCD4Bit_mod.h>
//create object to control an LCD.
//number of lines in display=1
LCD4Bit_mod lcd = LCD4Bit_mod(2);
//Key message
char msgs[5][15] = {"Right Key OK ",
                    "Up Key OK    ",
                    "Down Key OK  ",
                    "Left Key OK  ",
                    "Select Key OK" };
int  adc_key_val[5] ={30, 150, 360, 535, 760 };
int  NUM_KEYS = 5;
int  adc_key_in;
int  key=-1;
int  oldkey=-1;

Cantumkan pustaka yang digunakan (dengan instruksi include). Lakukan pembuatan objek LCD (menggunakan pernyataan LCD4bit_mod) kemudian deklarasikan kalimat-kalimat yang nantinya akan ditempilkan pada LCD (pada variabel msgs). Nilai tegangan terbaca pada masing-masing tombol juga disimpan sekalian dalam sebuah variabel larik (adc_key_val[5]), yaitu angka tegangan 30, 150, 360, 535 dan 760. Angka-angka tersebut diperoleh dari hasil dari percobaan sebelumnya. Variabel-variabel lainnya juga sekalian disiapkan (NUM_KEYS, adc_key_in, key dan oldkey).

void setup() {
  pinMode(13, OUTPUT);  //we'll use the debug LED to output a heartbeat

  lcd.init();
  //optionally, now set up our application-specific display settings, overriding whatever the lcd did in lcd.init()
  //lcd.commandWrite(0x0F);//cursor on, display on, blink on.  (nasty!)
  lcd.clear();
  lcd.printIn("KEYPAD testing...");
}

Selanjutnya melengkapi fungsi setup() pada Arduino. LED pada pin 13 tetap bisa kita gunakan (pinMode(13, OUTPUT)), inisialisasi LCD harus dilakukan, sebagaimana tercantum caranya di datasheet LCD berbasis penggerak HD44780, menggunakan lcd.init(). Anda bisa menambahkan beberapa pengaturan LCD tingkat lanjut seperti menghidupkan kursor, blink dan lain sebagainya.

Selanjutnya layar LCD dibersihkan (lcd.clear()) serta menuliskan kalimat pertama di baris pertama LCD (lcd.println(”KEYPAD testing…“)).

void loop()
{
   adc_key_in = analogRead(0);    // read the value from the sensor
   digitalWrite(13, HIGH);
   key = get_key(adc_key_in);    // convert into key press
   if (key != oldkey)	// if keypress is detected
   {
      delay(50);		// wait for debounce time
      adc_key_in = analogRead(0);    // read the value from the sensor
      key = get_key(adc_key_in);    // convert into key press
      if (key != oldkey)
      {
        oldkey = key;
        if (key >=0){
          lcd.cursorTo(2, 0);  //line=2, x=0
  	  lcd.printIn(msgs[key]);
        }
      }
  }
  digitalWrite(13, LOW);
}

Fungsi loop() kita isikan dengan rutin ON/OFF LED pada pin 13 dan melakukan pemantauan tombol yang ditekan, yang selanjutnya akan menampilkan kalimat sesuai dengan tombol yang ditekan. Pertama kali dibaca nilai ADC-0 nya, kemudian LED di pin 13 di-ON-kan, baca nilai ADC, jika nilainya tidak sama dengan nilai sebelumnya berarti ada tombol yang ditekan (if (key != oldkey)). Tunggu hingga tidak bouncing, sekitar 50 milidetik (delay(50)). Kemudian dibaca lagi ADC-0 nya seperti semula untuk menentukan tombol mana yang ditekan, diterjemahkan melalui fungsi get_key(). Apa yang ditampilkan pada LCD menyesuaikan dengan tombol yang ditekan.

// Convert ADC value to key number
int get_key(unsigned int input)
{ int k;
  for (k = 0; k < NUM_KEYS; k++)
  {
    if (input < adc_key_val[k])
    {  return k;  }
  }
  if (k >= NUM_KEYS)
    k = -1;     // No valid key pressed
  return k;
}

Fungsi get_key() digunakan untuk menerjemahkan tombol mana yang ditekan (dari 5 tombol). Diperiksa satu persatu (for (k=0; k<NUM_KEYS; k++)), jika ADC-0 terbaca nilai kurang dari nilai konstan ADC yang telah tersimpan pada larik adc_key_val, maka dikembalikan nilai tombolnya (apakah 0, 1, 2, 3 atau 4). Jika tidak ada tombol ditekan maka dikembalikan nilai -1, demikian seterusnya.

Hasil tampilan pada LCD Shield menggunakan DFRDuino Uno

Program selengkapnya…

#include <LCD4Bit_mod.h>
//create object to control an LCD.
//number of lines in display=1
LCD4Bit_mod lcd = LCD4Bit_mod(2);
//Key message
char msgs[5][15] = {"Right Key OK ",
                    "Up Key OK    ",
                    "Down Key OK  ",
                    "Left Key OK  ",
                    "Select Key OK" };
int  adc_key_val[5] ={30, 150, 360, 535, 760 };
int  NUM_KEYS = 5;
int  adc_key_in;
int  key=-1;
int  oldkey=-1;

void setup() {
  pinMode(13, OUTPUT);  //we'll use the debug LED to output a heartbeat

  lcd.init();
  //optionally, now set up our application-specific display settings,
  //overriding whatever the lcd did in lcd.init()
  //lcd.commandWrite(0x0F);//cursor on, display on, blink on.  (nasty!)
  lcd.clear();
  lcd.printIn("KEYPAD testing...");
}
void loop()
{
   adc_key_in = analogRead(0);    // read the value from the sensor
   digitalWrite(13, HIGH);
   key = get_key(adc_key_in);    // convert into key press
   if (key != oldkey)	// if keypress is detected
   {
      delay(50);		// wait for debounce time
      adc_key_in = analogRead(0);    // read the value from the sensor
      key = get_key(adc_key_in);    // convert into key press
      if (key != oldkey)
      {
        oldkey = key;
        if (key >=0){
          lcd.cursorTo(2, 0);  //line=2, x=0
  	  lcd.printIn(msgs[key]);
        }
      }
  }
  digitalWrite(13, LOW);
}
// Convert ADC value to key number
int get_key(unsigned int input)
{ int k;
  for (k = 0; k < NUM_KEYS; k++)
  {
    if (input < adc_key_val[k])
    {  return k;  }
  }
  if (k >= NUM_KEYS)
    k = -1;     // No valid key pressed
  return k;
}

Ada pertanyaan? Silahkan berkomentar dan semoga bermanfaat..

Tags: , , , ,

6 Responses to “LCD 2×16 karakter dan Arduino”

  1. mlm pak, cara bwt file library tu gmna y??

  2. artikel bagus gan, kunjungan baliknya di CARA PERTAMA MENGGUNAKAN ARDUINO UNO ARGA YUDHA
    atau langsung ke website
    http://www.argayudhaadhiprama......duino-uno/

  3. terimakasih telah berbagi

  4. terima kasih pak atas sharenya

  5. thank you for sharing it’s so helpful

  6. i like this article, thank you for sharing.

Leave a Reply

You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>