Mahir Arduino Sketch dan Elektro secara praktek

22 - Basic LCD Kontrol

Pendahuluan
Pada projek ini akan digunakan LCD untuk menampilkan text dan simbol. Tipe display ini sering digunakan untuk kalkulator atau jam alarm. Banyak contoh proyek Ardunino menggunakan juga, jadi adalah penting untuk memahami dan tahu bagaimana cara menggunakan LCD.

Untuk mengontrol LCD diperlukan driver chip, chip ini sudah built in didalam modul LCD. Driver chip yang paling popular adalah Hitachi HD44780 (or compatible), dan paling umum digunakan.

Membuat proyek berbasiskan LCD cukup mudah karena sudah tersedia library yang bisa digunakan untuk mengakses LCD.

Arduino IDE sendiri sudah tersedia library, LiquidCrystal.h, dimana sudah memiliki fitur-fitur penting untuk mengakses LCD. Pada proyek ini, kita akan gunakan library ini.


Komponen
  • 16x2 Backlit LCD
  • Current Limiting Resistor (Backlight)
  • Contrast Setting Resistor atau pot


LCD yang digunakan adalah LCD dengan HD44780 driver. Silakan memilih warna yang diinginkan, dipasaran tersedia berbagai warna seperti text merah background hitam, atau tulisan hitam dengan background hijau atau biru. Yang penting, LCD yang akan digunakan memiliki backlight dan bisa menampilkan 16 kolom dan 2 baris karakter text.

Skema




Skema pada proyek kali ini cukup simple. Yang diperlukan adalah datasheet LCD yang digunakan. Silakan perhatikan tabel diatas untuk pin yang digunakan.

Data pins 0 to 3 tidak digunakan, karena kita akan menggunakan mode 4-bit. Untuk LCD umumnya skema pada gambar diatas bisa langsung digunakan. (Namun untuk keamanan, cek data sheet LCD yang digunakan)

Contrast Adjustment pin pada LCD harus dihubungkan dengan current-limiting resistor untuk mengatur contrast yang diinginkan. Resistor dengan nilai sekitar 10KΩ sudah bisa digunakan.

Jika kesulitan mencari resistor dengan nilai tersebut, gunakan potentiometer denga value antara 4KΩ - 10KΩ dengan kaki kiri dihubungkan dengan +5V,  kaki kanan dihubungkan dengan ground, dan kaki tengah dihubungkan dengan contrast adjustment pin (pin 3 pada kasus ini, bisa berbeda pada LCD yang Anda gunakan).

Dengan menggunakan potentiometer, kita dapat memutar knob untuk melakukan adjustment contrast.

Backlight dari LCD yang digunakan pada artikel ini membutuhkan 4.2V, oleh karena itu ditambahkan current-limiting resistor antara +5V dan LED power supply pin (pin 15 pada kasus ini).

Tentu saja kita bisa menggunakan PWM pin pada Arduino, namun untuk proyek ini, kita tidak menggunakan cara ini.

Setelah skema sudah sesuai, kita sudah bisa memasukan kode.

Code

#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // create an lcd object and assign the pins

void setup() {
  lcd.begin(16, 2); // Set the display to 16 columns and 2 rows
}

void loop() {
  // run the 7 demo routines
  basicPrintDemo();
  displayOnOffDemo();
  setCursorDemo();
  scrollLeftDemo();
  scrollRightDemo();
  cursorDemo();
  createGlyphDemo();
}

void basicPrintDemo() {
  lcd.clear(); // Clear the display
  lcd.print("Basic Print"); // print some text
  delay(2000);
}

void displayOnOffDemo() {
  lcd.clear(); // Clear the display
  lcd.print("Display On/Off"); // print some text
  for(int x=0; x < 3; x++) { // loop 3 times
    lcd.noDisplay(); // turn display off
    delay(1000);
    lcd.display(); // turn it back on again
    delay(1000);
  }
}

void setCursorDemo() {
  lcd.clear(); // Clear the display
  lcd.print("SetCursor Demo"); // print some text
  delay(1000);
  lcd.clear(); // Clear the display
  lcd.setCursor(5,0); // cursor at column 5 row 0
  lcd.print("5,0");
  delay(2000);
  lcd.setCursor(10,1); // cursor at column 10 row 1
  lcd.print("10,1");
  delay(2000);
  lcd.setCursor(3,1); // cursor at column 3 row 1
  lcd.print("3,1");
  delay(2000);
}

void scrollLeftDemo() {
  lcd.clear(); // Clear the display
  lcd.print("Scroll Left Demo");
  delay(1000);
  lcd.clear(); // Clear the display
  lcd.setCursor(7,0);
  lcd.print("Beginning");
  lcd.setCursor(9,1);
  lcd.print("Arduino");
  delay(1000);
  for(int x=0; x<16; x++) {
    lcd.scrollDisplayLeft(); // scroll display left 16 times
    delay(250);
  }
}

void scrollRightDemo() {
  lcd.clear(); // Clear the display
  lcd.print("Scroll Right");
  lcd.setCursor(0,1);
  lcd.print("Demo");
  delay(1000);
  lcd.clear(); // Clear the display
  lcd.print("Beginning");
  lcd.setCursor(0,1);
  lcd.print("Arduino");
  delay(1000);
  for(int x=0; x<16; x++) {
    lcd.scrollDisplayRight(); // scroll display right 16 times
    delay(250);
  }
}

void cursorDemo() {
  lcd.clear(); // Clear the display
  lcd.cursor(); // Enable cursor visible
  lcd.print("Cursor On");
  delay(3000);
  lcd.clear(); // Clear the display
  lcd.noCursor(); // cursor invisible
  lcd.print("Cursor Off");
  delay(3000);
  lcd.clear(); // Clear the display
  lcd.cursor(); // cursor visible
  lcd.blink(); // cursor blinking
  lcd.print("Cursor Blink On");
  delay(3000);
  lcd.noCursor(); // cursor invisible
  lcd.noBlink(); // blink off
}

void createGlyphDemo() {
  lcd.clear();
  byte happy[8] = { // create byte array with happy face
    B00000,
    B00000,
    B10001,
    B00000,
    B10001,
    B01110,
    B00000,
    B00000};

  byte sad[8] = { // create byte array with sad face
    B00000,
    B00000,
    B10001,
    B00000,
    B01110,
    B10001,
    B00000,
    B00000};

  lcd.createChar(0, happy); // create custom character 0
  lcd.createChar(1, sad); // create custom character 1
  for(int x=0; x<5; x++) { // loop animation 5 times
    lcd.setCursor(8,0);
    lcd.write((byte)0); // write custom char 0
    delay(1000);
    lcd.setCursor(8,0);
    lcd.write(1); // write custom char 1
    delay(1000);
  }
}


Pembahasan Kode
Pertama kita panggil library yang digunakan untuk mengontrol LCD. Arduino IDE sudah menyediakan library teserbut, yaitu LiquidCrystal.h. Library ini bagus dan mudah dimengerti dan digunakan.

Ada banyak librari lainnya, contoh dari type LCD juga dapat dilihat di http://www.arduino.cc/playground/Code/LCD

#include <LiquidCrystal.h>


Selanjutnya kita membuat object LiquidCrystal object dengan nama lcd dan mengatur pin yang digunakan.

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); 

2 parameter pertama adalah pin untuk RS (Register Select) dan Enable. 4 parameter terakhir adalah data pin  D4 ke D7. Karena kita menggunakan mode 4-bit, kita hanya menggunakan 4 dari 8 datapins yang tersedia.

Perbedaan antara 4-bit dan 8-bit adalah pada mode 8-bit kita bisa mengirim data 1 byte dalam 1 waktu, pada mode 4-bit kita harus membagi menjadi 4-bit (disebut nibbles). Ini membuat kode menjadi lebih besar dan kompleks.

Namun, dikarenakan kita menggunakan library yang sudah mendukung, kita tidak perlu khawatir akan hal tersebut. Namun bila proyek concern akan space dan waktu, ada baiknya menggunakan mode 8-bit.

Menggunakan 4-bit ada keuntungan yaitu menghemat 4 pins, dimana sangat berguna bila proyek kita memerlukan pin lainnya untuk peralatan lainnya.

Pada fungsi setup(), kita inisialisasi kukuran display, pada contoh ini 16 kolom dan 2 baris.

void setup() {
  lcd.begin(16, 2); // Set the display to 16 columns and 2 rows

}

Pada loop kita akan menjalankan 7 demo rutin,  demo ini menunjukan rutin yang didukung librari LiquidCrystal.h.

void loop() {
  // run the 7 demo routines
  basicPrintDemo();
  displayOnOffDemo();
  setCursorDemo();
  scrollLeftDemo();
  scrollRightDemo();
  cursorDemo();
  createGlyphDemo();

}


basicPrintDemo() digunakan untuk menunjukan cara menggunakan perintah print(). Demo ini sederhana, menunjukan cara menghapus layar denga perintah lcd.clear(), kemudian menulis ke display dengan perintah lcd.print().

Perhatian, jika Anda menginisialisasi object LiquidCrystal object dengan nama contohnya lcd1 maka perintah yang digunakan adalah lcd1.clear() dan lcd1.print()

Perintah print() akan menulis apapun yang diinput dalam tanda kurung pada cursor aktif terakhir. Default awal kursor selalu di kolom 0 dan baris 0, yang berarti ada di kiri atas.

Ketika perintah print() digunakan, text yang kita kirim akan ditulis dilayar, lalu kursor akan berpindah pada akhir text. Setiap text berikutnya ditambahkan akan mulai dari posisi terakhir tersebut.

Cursor akan kembali ke default setiap kita melakukan perintah clear().

void basicPrintDemo() {
  lcd.clear(); // Clear the display
  lcd.print("Basic Print"); // print some text
  delay(2000);

}


Demo kedua untuk menunjukan cara menggunakan perintah display() dan noDisplay().  Perintah ini adalah untuk enable atau disable display.

void displayOnOffDemo() {
  lcd.clear(); // Clear the display
  lcd.print("Display On/Off"); // print some text
  for(int x=0; x < 3; x++) { // loop 3 times
    lcd.noDisplay(); // turn display off
    delay(1000);
    lcd.display(); // turn it back on again
    delay(1000);
  }

}


Demo berikutnya menunjukan cara mengatur kursor dengan perintah setCursor(). Perintah ini untuk mengarahkan kursor pada kolom dan baris tertentu.

Perintah setCursor() penting untuk mengatur layout dan memastikan kita bisa menulis di posisi yang kita inginkan.

void setCursorDemo() {
  lcd.clear(); // Clear the display
  lcd.print("SetCursor Demo"); // print some text
  delay(1000);
  lcd.clear(); // Clear the display
  lcd.setCursor(5,0); // cursor at column 5 row 0
  lcd.print("5,0");
  delay(2000);
  lcd.setCursor(10,1); // cursor at column 10 row 1
  lcd.print("10,1");
  delay(2000);
  lcd.setCursor(3,1); // cursor at column 3 row 1
  lcd.print("3,1");
  delay(2000);

}

Ada dua cara untuk scrolling text, yaitu scrollDisplayLeft() dan scrollDisplayRight(). Dari namanya cukup jelas scroll ke kiri dan ke kanan. Demo ini akan menunjukan penggunaan perintah ini, pertama akan menulis “Beginning Arduino” pada sebelah kanan displaydan ke kiri sebanyak 16 kali, dimana tulisan akan hilang dari layar.

void scrollLeftDemo() {
  lcd.clear(); // Clear the display
  lcd.print("Scroll Left Demo");
  delay(1000);
  lcd.clear(); // Clear the display
  lcd.setCursor(7,0);
  lcd.print("Beginning");
  lcd.setCursor(9,1);
  lcd.print("Arduino");
  delay(1000);
  for(int x=0; x<16; x++) {
    lcd.scrollDisplayLeft(); // scroll display left 16 times
    delay(250);
  }

}


Demo berikut ini sama, hanya saja mulai menulis di sebelah kiri layar dan di-scroll ke kanan sebanyak 16 kali.

void scrollRightDemo() {
  lcd.clear(); // Clear the display
  lcd.print("Scroll Right");
  lcd.setCursor(0,1);
  lcd.print("Demo");
  delay(1000);
  lcd.clear(); // Clear the display
  lcd.print("Beginning");
  lcd.setCursor(0,1);
  lcd.print("Arduino");
  delay(1000);
  for(int x=0; x<16; x++) {
    lcd.scrollDisplayRight(); // scroll display right 16 times
    delay(250);
  }
}


Sejauh ini cursor tidak tampak. Ada disana namun tidak terlihat  Setiap kita clear layar maka kurso akan kembali ke  kolom 0 dan baris 0. Setelah print, cursor akan ada tepat sesudah karakter terakhir. Demo berikut akan menghapus layar dan menyalakan cursor dengan perintah cursor() dan menulis teks. Cursor akan tampak sesudah text dengan simbol underscore ( _ ).


void cursorDemo() {
  lcd.clear(); // Clear the display
  lcd.cursor(); // Enable cursor visible
  lcd.print("Cursor On");
  delay(3000);
  lcd.clear(); // Clear the display
  lcd.noCursor(); // cursor invisible
  lcd.print("Cursor Off");
  delay(3000);
  lcd.clear(); // Clear the display
  lcd.cursor(); // cursor visible
  lcd.blink(); // cursor blinking
  lcd.print("Cursor Blink On");
  delay(3000);
  lcd.noCursor(); // cursor invisible
  lcd.noBlink(); // blink off
}


Demo terakhir adalah  membuat karakter khusus. Umumnya LCDs punya kemampuan untuk menampilkan karakter tertentu. LCD 16x2  memilik ruang untutk 8 karakter khusus untuk disimpan dalam memory

Karakter ini memiliki ukuran lebar 5 pixels dan tinggi 8 pixels. Display di clear kemudia 2 array dengan tipe byte akan di inisialisasi dengan binary pattern  wajah gembira dan sedih. Binary patterns  memiliki lebar 5 bits.

void createGlyphDemo() {
  lcd.clear();
  byte happy[8] = { // create byte array with happy face
    B00000,
    B00000,
    B10001,
    B00000,
    B10001,
    B01110,
    B00000,
    B00000};

  byte sad[8] = { // create byte array with sad face
    B00000,
    B00000,
    B10001,
    B00000,
    B01110,
    B10001,
    B00000,
    B00000};

  lcd.createChar(0, happy); // create custom character 0
  lcd.createChar(1, sad); // create custom character 1
  for(int x=0; x<5; x++) { // loop animation 5 times
    lcd.setCursor(8,0);
    lcd.write((byte)0); // write custom char 0
    delay(1000);
    lcd.setCursor(8,0);
    lcd.write(1); // write custom char 1
    delay(1000);
  }
}


Artikel sebelumnya  Led Dot Matrix Basic
Artikel selanjutnya LCD display Temperature

No comments:

Post a Comment