5. PROYEK LAYAR LCD DAN OLED DENGAN ARDUINO
LCD (Liquid Crystal Display) adalah suatu jenis media tampilan yang menggunakan kristal cair sebagai penampil utama. Terdapat beberapa ukuran LCD yang dapat diterapkan pada Arduino, perbedaannya adalah jumlah baris dan kolom yang bisa ditampung. Setiap baris dan kolom mewakili banyaknya karakter, misalnya LCD 16X2 berarti LCD terdiri dari 16 kolom dan 2 baris (total 32 karakter), ada pula yang berukuran LCD 16X4 yang terdiri dari 16 kolom, 4 baris (total 64 karakter), seperti tampak Gambar 5.1 dan Gambar 5.2.
Gambar 5.1. LCD 16X2 Karakter Gambar 5.2. LCD 16X4 Karakter Ada dua cara untuk mengakses LCD melalui Arduino, yaitu:
- Paralel, memanfaatkan semua pin LCD 16X2 yang ada. Kekurangannya adalah boros penggunaan pin Arduino dan instalasi lebih rumit.
- Serial, memanfaatkan module 12C pada LCD 16X2, dimana pin yang dibutuhkan cuma 2 yaitu SDA dan SCL. Kelebihannya adalah hemat pin Arduino sehingga pin kosong bisa digunakan untuk kebutuhan Iainnya dan instalasi sederhana. Sedangkan kekurangannya adalah harus menambah module 12C.
Sedangkan OLED (Organic Light-Emitting Diode) atau diode cahaya organik adalah sebuah semikonduktor sebagai pemancar cahaya yang terbuat dari lapisan organik. OLED digunakan dalam teknologi elektroluminensi, seperti pada aplikasi tampilan layaL Teknologi ini terkenal fleksibel karena ketipisannya. Berbagai jenis produk OLED dapat diimplementasikan pada Arduino dengan resolusi berbeda-beda. Pada umumnya OLED menggunakan antarrnukał interface 12C seperti tampak pada Gambar 5.3 dan Gambar 5.4.
Gambar 5.3 Modul OLED Resolusi 128X32 Gambar 5,4 Modul OLED Resolusi 128X64
5.1 Proyek LCD 16X2 Secara Paralel
Proyek ini bertujuan menampilkan string ke LCD 16X2 secara paralel dengan memanfaatkan semua pin yang ada. Proyek ini juga disertai dengan pengaturan tingkat kecerahan backlight LCD dengan menggunakan Trimer / Potensiometer.
Gambar 5.5. Pinout LCD 16X2
Diagram Sketch
Kebutuhan Bahan
Bahan | Jumlah | Nilai | Keterangan |
Modul LCD | 1 pcs | ||
Variable Resistor /
Potensiometer / Trimmer |
1 pcs | 5K- 10K | ![]() ![]() |
Resistor % watt | 1 pcs | 220 Ohm |
Rangkai semua komponen seperti pada Diagram Sketch. Kemudian buka aplikasi IDE Android dan tambahkan library Liquid Crystal dari menu Sketch
Kode Program
#include <LiquidCrystal.h>
// Membuat objek LCD. Parameter: (rs, enable, d4, d5, d6, d7) const int rs = 12, enable = 11,d4=5,d5=4,d6=3,d7=2; LiquidCrystal lcd(rs, enable, d4, d5, d6,d7); void setup(){ // Inisialisasi interface ke layar LCD dan menentukan dimensi lebar dan ting-gi dari layar lcd.begin(16,2); } void loop() { lcd.print(“Arduino”);// Cetak “Arduino” pada LCD delay(3000); lcd.setCursor(2,1); //Atur lokasi teks dimulai dari kolom 2 baris 1 lcd.print(“LCD Tutorial”); // Cetak “LCD Tutorial” pada LCD delay(3000); // Tunda 3 detik lcd.clear(); // Membersihkan layar lcd.blink(); // Kedip kursor LCD delay(4000); // Tunda 4 detik lcd.setCursor(7,1); // Atur lokasi teks dimulai dari kolom 4 baris 1 delay(3000); // Tunda 3 detik lcd.noBlink(); // Mematikan kedip kursor LCD lcd.cursor(); // Menampilkan underscore/garis bawah pada posisi karakter berikutnya delay(4000); // Delay 4 detik lcd.noCursor(); // Menyembunyikan kursor LCD lcd.clear(); // Membersihkan layar LCD } |
Jika kode program sukses diupload ke Arduino maka Anda bisa mengatur tingkat kecerahan background LCD dengan cara memutar trimmer/potensiometer dengan obeng ke kiri atau ke kanan.
5.2 Proyek LCD 16X2 Secara Serial 12C Dengan Modul LCM1602
Proyek LCD 16X2 mode serial menggunakan protokol komunikasi data Bus 12C (inter-integrated circuit) yang membutuhkan tambahan module LCM1602.
Penggunaan protokol komunikasi Bus 12C ditandai oleh penggunaan pin SDA (serial data) dan SCL (serial clock). Module LCM1602 bertindak sebagai alat konversi dari mode paralel ke serial. Module LCM1602 disolderkan di bagian belakang LCD seperti tampak pada Gambar 5.8.
Setelah module LCM1602 disolder ke module LCD1602, selanjutnya hubungkan VCC module LCM1602 ke tegangan 5volt Arduino, hubungkan GND LCM1602 ke GND Arduino, hubungkan pin SDA LCM1602 ke pin A5 (pin SDA Arduino) dan hubungkan pin SCL LCM1602 ke pin A4 (pin SCL Arduino).
Langkah berikutnya adalah menambahkan library Arduino-LiquidCrystal-12C. library-master.zip ke IDE Arduino. Terdapat tiga cara untuk instalasi library baru ke dalam IDE Arduino:
- Install Library Secara Online
Buka aplikasi IDE Arduino, pilih menu Sketch-> Include Library -> Manage Libraries. Kemudian cari dengan kata kunci Liquid Crystal, seperti tampak pada Gambar 5.10.
Secara default instalasi library akan ditempatkan pada folder C:\Users\Nama User\Documents\Arduino\libraries, tergantung konfirgurasi foldersketchbook Arduino. Lokasi direktori sketchbook Arduino dapat dilihat di menu File Preferences Sketchbook location seperti tampak pada Gambar 5.11.
- Install Library Melalui File ZIP
Download library Liquid_Crystal_I2C di https://github.com/fdebrabanderArduino-LiquidCrystal-12C-library Kemudian pilih menu Sketch
• Instalasi Library Secara Manual
Download library Liquid_Crystal_12C di https://github.com/fdebrabanderArduino-LiquidCrystal-12C-library. kemudian uraikan file Arduino. LiquidCrystal-12C-library-master.zip ke folder C:\\Program Files\ Arduino\libraries seperti tampak pada Gambar 5.10. Setelah itu lakukan refresh aplikasi IDE Arduino dengan cara menutup dan membuka kernbali IDE Arduino.
Catatan: Anda dapat memilih salah satu cara dari tiga cara instalasi libraty di atas. Untuk proyek selanjutnya akan berlaku sama jika terdapat penambahan library baru, sehingga kami tidak akan mengulasnya kembali bagaimana cara instalasi library ke dalam IDE Arduino
Kode Program
#include <Wire.h>
#include <LiquidCrystal_I2C.h> // String yang dicetak ke LCD char array1[ ] = “ Horeee aku bisa Arduino Sekarang” ; char array2[ ] = “ Hello, World!”; int tunda =500; // waktu tunda // Inisialisasi library // Atur alamat LC pada 0x27 untuk tampilan LCD 16 karakter 2 baris LiquidCrystal_I2C lcd(0x27, 16, 2); void setup() { // Inisialisasi LCD lcd.init(); // Menghidupkan backlight lcd.backlight(); } void loop() { lcd.setCursor(15, 0); // set kursor kolom 15, baris 0 for (int positionCounter1 = 0; positionCounter1 < 26; positionCounter1++) lcd.scrollDisplayLeft(); //Scroll konten dari layar ke kiri. lcd.print(array1[positionCounter1]); // Cetak pesan ke LCD. delay(tunda); //tunda 500 microseconds } lcd.clear( ); // Bersihkan layar LCD dan memposisikan kursor di kiri atas pojok. lcd.setCursor(15, 1); // set kursor di kolom 15, baris 1 for(int positionCounter = 0; positionCounter < 26; positionCounter++) lcd.scrollDisplayLeft(); //Scroll konten layar satu spasi ke kiri. lcd.print(array2[positionCounter]); // Cetak pesan ke LCD. delay(tunda); // Tunda 500 microseconds lcd.clear(); // Bersihkan layar LCD dan memposisikan kursor di kiri atas pojok. } |
Kode program tersebut di atas adalah untuk membuat tulisan berjalan pada LCD 12C. Sekarang kita coba kembangkan lagi proyek deteksi suhu udara dengan sensor LM35 yang sudah kita buat sebelumnya, yaitu menampilkan hasil pengukuran suhu ke layar LCD 12C. Berikut diagram sketchnya
Kode Program
Kode Program
#include <Wire.h> #include <LiquidCrystal_I2C.h> int pinRelay = 8; // Pin S Relay ke Pin 8 Arduino int pinLED=9; // Pin LED Resistor ke Pin 9 Arduino int pinLM35=A0; // pin LM35 ke Pin A0 Arduino(analog) // Atur alamat LC pada ex27 untuk tampilan LCD 16 karakter 2 baris LiquidCrystal_I2C lcd(0x27, 16, 2); void setup(){ lcd.init(); // Inisialisasi LCD lcd.backlight(); // Menghidupkan backlight lcd.setCursor(0, 0); lcd.print(“INDIKATOR SUHU”); // tampilkan di LCD delay(4000); // tunda 4 detik lcd.clear(); Serial.begin(9600); pinMode(pinLED, OUTPUT); pinMode(pinRelay, OUTPUT); pinMode(pinLM35, INPUT); } void loop() { int suhucelcius = getTemperatureCel(pinLM35); int suhufarenheit = celsius_to_fahrenheit(suhucelcius); // Tampilkan suhu ke LCD lcd.clear(); // Bersihkan layar LCD lcd.setCursor(0,0); lcd.print(“Celcius: “ + String(suhucelcius)); lcd.setCursor(0,1); lcd.print(“Farenheit: “ + String(suhufarenheit)); // Menampilkan nilai sensor LM35 Serial.println(“Temperatur Celcius: “ + String(suhucelcius) +“ – “ +“Faren-heit: “ + String(suhufarenheit)); delay(1000); if(suhucelcius >=34){ // Mengaktifkan relay ON dan menghidupkan kipas angin // jika temperatur lebih dari sama dengan 34 derajat celcius digitalwrite(pinLED, HIGH); digitalwrite(pinRelay, HIGH); } else { digitalwrite(pinLED, LOW); digítalWrite(pinRelay, LOW); } } int getTemperatureCel(int pin){ int val = analogRead(pin); float mv=( val / 1024.0) * 5000; float cel= mv/ 10; return(cel); } int celsius_to_fahrenheit(float cel) { float farh =(cel * 9) / 5 + 32; return (farh); } |
5.3 Menampilkan Tanggal & Jam di Layar OLED
Proyek ini bertujuan untuk menampilkan informasi tanggal dan jam secara realtime ke layar OLED yang beresolusi 128×64 pixel. Untuk mendapatkan informasi tanggal dan jam dibutuhkan modul real-time clock RTC-DS3231 seperti tampak pada Gambar 5.15.
Gambar 5.15 Rea/ Time Clock DS3231
Bahan | Jumlah | Nilai | |
Modul OLED Pixel SSDI 306 | 1 pcs | ![]() ![]() |
|
Modul Real Time Clock DS3231 | 1 pcs | ![]() ![]() |
|
Resistor ¼ watt | 2 pcs | 4.7K |
Kebutuhan Bahan
Rangkai semua komponen seperti tampak pada diagram sketch. Di sini ditambahkan resistor pull-up bernilai 4.7K ohm yang terhubung dengan tegangan positif dan terhubung pula dengan pin SDA dan pin SCL dari modul OLED dan modul RTC. Fungsi utama resistor pull-up dan pull-down (bila resistor terhubung ke ground) adalah untuk mencegah kesalahan pembacaan akibat nilai mengambang (floating) pada suatu rangkaian, agar terdefinisi menjadi nilai “HIGH” dan “LOW” dengan benar.
Rangkaian pull-down atau pull-up sering digunakan pada push-button atau rangkaian yang berbagi sumber daya secara bersama pada diagaram sketch di atas, dimana anatarmuka lc pin SDA dan pin SCL pada modul RTC-DS3231 dan modul OLED saling terhubung ke pin SDA dan pin SCL Arduino.
Pada contoh proyek kali ini dibutuhkan tiga library pendukung, antara lain:
- Library Adafruit_GFX.h untuk menangani modul OLED, download di https://github.c@m/adafruit/Adafruit-GFX-Library
- Library Adafruit_SSD1306.h untuk menangani modul OLED, download di https://github.com/_adafruit/Adafruit SSD1306
- Library Adafruit_TFTLCD.h untuk menangani modul OLED, download di
- https://github.com/adafruit/T_FTLCD-Library
- Library DS3231.h untuk menangani modul RTC DS3231, download di http://www.rinkydinkelectronics.com/download.php?f=DS3231.zip. Khusus library ini sebaiknya diinstal secara offline melalui file .zip-nya.
Instal semua library file .zip di atas melalui menu Sketch -> Include Library Add .ZIP Library atau instal secara online pada menu Sketch -> include Library -> Managed Libraries.
Berikut fungsi-fungsi di dalam library DS3231 yang sering digunakan:
- setTime (hour,minute,second);
fungsi : Setting/adjust waktu pada RTC
contoh : rtc.setTime (10, 30, 00); //jam 10 menit 30 detik 00
- setDate (date,month,year);
fungsi : Setting/adjust tanggal pada RTC
contoh : rtc.setDate (1, 8, 2016); //tanggal 1 Agustus 2016
- setDow (uint8_t dow);
fungsi Setting/adjust urutan Hari dalam Minggu (0-6 untuk minggusabtu), setDow akan berpengaruh pada setDate
contoh : rtc.setDow (1); //setting hari sebagai Senin
- getTimeStr ();
fungsi : Mengambil data Waktu dari RTC,hasil berupa String
contoh : rtc.getTimeStr(); > > result : 09:30:33 //jam 9, menit ke 30, detik ke 33
- getDateStr ();
fungsi : Mengambil data Tanggal dari RTC,hasil berupa String
contoh : rtc.getDateStr(); >>result : 01.05.2016 //tanggal 1 Mei 2016
- getDowStr (uint8_t);
fungsi : Mengambil data nama Hari dari RTC,hasil berupa String (English Name)
contoh : rtc.getDowStr(); > > Result : Monday //day Long
contoh : rtc.getDowStr(1); >>Result : Mon //day Short
contoh : rtc.getDowStr(2); >>Result : Monday //day Long
- getMonthStr (uint8_t);
fungsi Mengambil data nama Bulan dari RTC,hasil berupa String (English Name)
contoh . rtc.getMonthStr(); > > Result : January //day Long
contoh . rtc.getMonthStr(1); >>Result : Jan //day Short
contoh rtc.getMonthStr(2); >>Result : January //day Long
Kode Program
#include <SPI.h>
#include <Wire.h> #include <DS3231.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <Adafruit_TFTLCD.h> #include <Fonts/FreeSansBold18pt7b.h> #define OLED_RESET 4 Adafruit_SSD1306 display(OLED_RESET); DS3231 rtc(SDA,SCL); //DS3231 rtc(); void setup(){ rtc.begin(); // setting tanggal dilakukan hanya satu kali, disesuaikan dengan tanggal komputer // selanjutnya beri tanda remark “//” agar tidak diset ulang // Bila RTC DS3231 di isi battery maka tidak perlu set tanggal lagi // //—————————————— // rtc.setDOW(MONDAY); // Set Day-of-Week to SUNDAY // rtc.setTime(10,17,8);// set the time to 12:00:00(24hr format) // rtc.setDate(17,9, 2018); // Set the date to June 6th,2017 //—————————————— display. begin(5S01306_SwITCHCAPVCC, ex3C); // inisialisasi OLED 128×64 atau 0.96” display.clearDisplay(); // Bersihkan layar OLED display.setTextColor(WHITE); // Atur warna tulisan putih display.setFont(&FreeSansBold18pt7b); // Ubah jenis foont, cek di folder C:\ rogram Files (x86)\Arduino\libraries\Adafruit-GFX-Library-master display.setCursor(ø, 27); // Posisi koordinat tulisan (x,y) display.print(“DS”); // Cetak tulisan ‘DS’ display.setFont(); // Kembalikan jenis font menjadi normal display.setCursor(75, 7); // Posisi koordinat tulisan(x,y) display.println(“Hore”); // Cetak tulisan display.setCursor(56, 16); // Posisi koordinat tulisan(x,y) display.println(“Aku Bisa !!”); display.fllRect(53, 2, 73, 2, WHITE); display.fillRect(53, 26, 73, 2, WHITE); display.display(); // Terapkan konfgurasi OLED delay(4000); display.clearDisplay(); // Bersihkan layar OLED display.setFont(); // Kembalikan jenis font menjadi normal display.setTextColor(WHITE); display. setCursor(22, 14); display·println(“Proyek OLED”); display.display(); delay(5000); display.clearDisplay(); } void loop(){ tampilHari(); } void tampilHari() { String jam, menit, detik; Time waktu = rtc.getTime(); display.clearDisplay(); display.setTextColor(WHITE); display.setTextSize(2); display. setCursor(0,0); if (waktu.hour <10) { jam = “0” + String(waktu.hour); } else{ jam = String(waktu.hour); } íf (waktu.min < 10) { menit = “0” + String(waktu.min); } else { menit = String(waktu.min); } if(waktu.sec < 10) { detik =“0”+ String(waktu.sec); } else { detik = String(waktu.sec); } display.print(jam +“:” + menit); display.setTextSize(1); display. setFont(&FreeSansBold18pt7b); display.setCursor(76,28); display.print(detik); display.setFont(); display.drawRect(70, θ, 51, 32, WHITE); display.setTextSize(1); display.setCursor(0, 16); display.print(rtc.getDoWStr()); display.setCursor(8, 25); display-print(rtc. getDateStr()); display.display(); } |