Antarmuka ESP 32 Menggunakan LCD 128x64 (ST7920)

Penggunaan Display LCD bertujuan untuk menampilkan sesuatu yang ingin disampaikan kepada user pengguna. Dengan ukuran yang bermacam-macam, kita dapat memilih LCD sesuai yang kita butuhkan. Beberapa hal yang perlu dipertimbangkan adalah ukuran casing yang kita gunakan dalam project board, panjang karakter yang akan ditampilkan, ukuran font, dan lain sebagainya. Dalam posting ini saya akan mencoba mengaplikasikan Graphic LCD 128x64 pada ESP 32. Modul LCD ini memiliki koneksi parallel 4bit / 8bit atau serial SPI (hanya perlu 3 pin). 

1. Wiring
Pin I/O yang diperlukan adalah 2 pin SPI (MOSI(23), SCK(18) ), 2 pin digital, dan pastinya pin power baik 3.3V maupun 5V (VIN).  
ESP32 with LCD ST7920
Wiring Diagram
2. Library
Untuk saat ini, baru library U8g2lib yang saya coba untuk ESP32 ini dan hasilnya program dapat bekerja dengan baik. Sebelum memulai silahkan tambahkan library tersebut terlebih dahulu.
ESP32 with LCD 128x64 (ST7920)

3. Program
Just say "hello" untuk program ujicoba pada LCD ST7920 ini,
#include <Arduino.h>
#include <U8g2lib.h>

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

U8G2_ST7920_128X64_1_HW_SPI u8g2(U8G2_R0, /* CS=*/ 16, /* reset=*/ 17); //ESP32, E=clock=18, RW=data=23, RS=CS

void setup(void) {
  u8g2.begin();
}

void loop(void) {
  u8g2.setFont(u8g2_font_ncenB14_tr);
  u8g2.firstPage();
  do {
    u8g2.setCursor(0, 20);
    u8g2.print(F("Hello World!"));
  } while ( u8g2.nextPage() );
  delay(1000);
}

Interfacing ESP32 with LCD 128x64

Contoh lainnya adalah program counting. Dapat dicoba dengan code dibawah ini
#include <Arduino.h>
#include <U8g2lib.h>

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

U8G2_ST7920_128X64_1_HW_SPI u8g2(U8G2_R0, /* CS=*/ 16, /* reset=*/ 17); //E=clock=18, RW=data=23, RS=CS

void setup(void) {
  u8g2.begin();  
}

uint8_t m = 24;

void loop(void) {
  char m_str[3];
  strcpy(m_str, u8x8_u8toa(m, 2));    /* convert m to a string with two digits */
  u8g2.firstPage();
  do {
    u8g2.setFont(u8g2_font_logisoso62_tn);
    u8g2.drawStr(0,63,"8");
    u8g2.drawStr(33,63,":");
    u8g2.drawStr(50,63,m_str);
  } while ( u8g2.nextPage() );
  delay(1000);
  m++;
  if ( m == 60 )
    m = 0;
}

ESP32 LCD 128x64 (ST7920)

ESP32 LCD 128x64 (ST7920)

Implementasi
Sebagai contoh penggunaan LCD ini, berikut saya tambahkan program DHT 22 untuk pengukuran suhu dan kelembaban. REQUIRES the following Arduino libraries (silahkan install terlebihdahulu library berikut):
- DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library
- Adafruit Unified Sensor Lib: https://github.com/adafruit/Adafruit_Sensor

#include <Arduino.h>
#include <U8g2lib.h>
#include "DHT.h"

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

#define DHTPIN 21       //pin digital 21
#define DHTTYPE DHT22   

char t_string[5]; 
char h_string[5];
float t_float;
float h_float;

U8G2_ST7920_128X64_1_HW_SPI u8g2(U8G2_R0, /* CS=*/ 16, /* reset=*/ 17); //ESP32, E=clock=18, RW=data=23, RS=CS
DHT dht(DHTPIN, DHTTYPE);
void setup() {
  u8g2.begin();  
  dht.begin();
  u8g2.setColorIndex(1); 
}

void loop() {
  u8g2.firstPage();
  do {
    draw_data();
  } while ( u8g2.nextPage() );
  delay(1000);
 
}

void draw_data(){
  h_float = dht.readHumidity();
  t_float = dht.readTemperature();
  u8g2.clearBuffer();  
  u8g2.setFontMode(1);
  u8g2.setFont(u8g2_font_logisoso20_tr); 
  u8g2.drawFrame(0,0,128,31);            // upper frame
  u8g2.drawFrame(0,33,128,31);           // lower frame
  
  // convert floats into char u8g strings    
  u8g2.drawStr( 15, 27, "T: ");       
  dtostrf(t_float, 3, 1, t_string);
  u8g2.drawStr(40,27, t_string);
  u8g2.drawStr(100,27, "C"); 

  u8g2.drawStr(15,60, "H: ");             
  dtostrf(h_float, 3, 1, h_string);
  u8g2.drawStr(40,60, h_string);
  u8g2.drawStr(100,60, "%"); 
}

 ESP 32 Menggunakan LCD 128x64