Proyek 17 – Basic LCD

Lesson kali ini akan membahas hal Basic dari komponen LCD, salah satu komponen penting untuk display.

Proyek ini menggunakan LCD untuk menampilkan text dan simbol. Tipe display ini sering digunakan untuk kalkulator atau jam alarm.

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

Proyek berbasiskan LCD cukup mudah dikerjakan, karena library untuk mengakses LCD sudah tersedia.

Arduino IDE juga menyediakan library tersebut, LiquidCrystal.h, fiturnya cukup lengkap untuk mengakses LCD. Proyek ini menggunakan library tersebut.

Komponen

  • 16×2 Backlit LCD
  • Current Limiting Resistor (Backlight)
  • Contrast Setting Resistor atau pot

LCD yang digunakan adalah LCD dengan HD44780 driver. LCD ini tersedia dengan beberapa pilihan warna, silakan memilih warna yang diinginkan. Hal penting diperhatikan adalah, memiliki backlight dan bisa menampilkan 16 kolom dan 2 baris karakter text.

Skema

Proyek Arduino Basic LCD

Skema cukup simple. Hal yang diperlukan adalah datasheet LCD yang digunakan. Silakan perhatikan tabel diatas untuk pin yang digunakan.

Data pins 0 to 3 tidak digunakan, karena proyek 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 sulit mendapatkan resistor dengan nilai diatas, dapat menggunakan 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).

Adjustment contrast dapat dilakukan dengan memutar knob potentiometer.

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

Sketch

#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 Sketch

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 buat 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 mode 4-bit, kita hanya menggunakan 4 dari 8 datapins yang tersedia.

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

Namun, library yang digunakan library yang sudah mendukung, jadi tidak perlu khawatir akan hal tersebut. Namun bila space dan waktu menjadi perhatian, ada baiknya menggunakan mode 8-bit.

Menggunakan 4-bit ada keuntungan yaitu menghemat 4 pins yang dapat digunakan untuk komponen lainnya.

Pada fungsi setup(), inisialisasi ukuran 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 fungsi loop akan menjalankan 7 demo routine yang didukung librari LiquidCrystal.h.

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

Routine basicPrintDemo() 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 dikirim akan ditulis, kursor akan berada diakhir text. Ketika text berikutnya ditambahkan, akan mulai dari posisi tersebut.

Cursor akan kembali ke default setiap perintah clear() dipanggil.

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.

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);
   }
 }

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 16×2 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 smiley face dan sad face. 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);
  }
}
Sharing is caring: