ESP32 - LCD 16x2 dengan komunikasi I2C

LCD 16×2 ini memiliki 16 Kolom dan 2 Baris. Ada banyak kombinasi yang tersedia seperti, 8×1, 8×2, 10×2, 16×1, dll. Tetapi yang paling banyak digunakan adalah LCD 16 × 2. Jadi, totalnya (16×2=32) 32 karakter dan masing-masing karakter terdiri dari 5×8 Pixel Dots. Dari sekian banyak ukuran display, ukuran 16x2 merupakan yang sering digunakan pada project embedded dan lain sebagainya. Hal lain yang tak kalah penting untuk deperhatikan adalah type IC interface pada LCD tersebut. Kebanyakan LCD 16x2 menggunakan Interface IC HD44780.  Display ini memungkinkan untuk di kontrol dengan menggunakan komunikasi I2C. Salah satu keuntungannya adalah menghemat pin I/O. Apabila kita menggunakan data bus paralel (db4-db7) maka memerlukan 4 pin I/O, sedangkan dengan I2C kita hanya memerlukan 2 pin (SDA & SCL). Diperlukan modul tambahan  yaitu I2C IIC Module LCD Serial Adapter. Modul ini Support untuk LCD ukuran 16x2 dan 20x4.
1. Wiring
Untuk wiring cukup mudah. Hubungkan pin power ke 5V (VIN), pin SDA ke D21, dan SCL ke D22.

2. Program
Sebelum memulai, instalasi terlebih dahulu library untuk modul I2C ini. Library yang digunakan adalah LiquidCrystal I2C by Marco Schwartz 

Setelah instalasi library, bisa lanjut dicoba code dibawah untuk uji coba dan memahami fungsi. Fungsi dari library ini tidak jauh berbeda dengan library LCD bawaan arduino, sehingga cukup mudah di pahami.
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup(){
 // initialize the LCD
 lcd.begin();
 lcd.print("Hello, world!");
  delay(2000);
}

void loop(){
  lcd.clear();
  delay(2000);
 lcd.setCursor(0,0);
  lcd.print("Hi, This is OK?");
  delay(2000);
  lcd.setCursor(0,1);
  lcd.print("From Arducoding");
  delay(5000);
}

ESP32 LCD I2C communication
Hasil Program
*Apabila setelah upload program tidak muncul karakter, maka cek kembali wiringnya sesuai dengan skema, dan atau putar potensio meter pada I2C module (warna biru) hingga karakter pada LCD muncul.

Implementasi
Sebagai contoh dari penggunaan metode ini (LCD I2C), mari kita coba menggabungkannya dengan sensor DHT 22. 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
ESP32 Temperature Monitor


#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include "DHT.h"

#define DHTPIN 5     // Digital pin connected to the DHT sensor
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321

// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(115200);
  Serial.println(F("DHTxx test!"));
  dht.begin();
  lcd.begin();

  //intro gak penting
  lcd.setCursor(0,0);
  lcd.print("   Temperature");
  lcd.setCursor(0,1);
  lcd.print("     Monitor");
  delay(2000);
  lcd.clear();
}

void loop() {
  // Wait a few seconds between measurements.
  delay(1000);
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println(F("Failed to read from DHT sensor!"));
    lcd.setCursor(0,0);  lcd.print("No Sensor!");
    return;
  }

  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);

  Serial.print(F("Humidity: "));
  Serial.print(h);
  Serial.print(F("%  Temperature: "));
  Serial.print(t);
  Serial.print(F("°C "));
  Serial.print(f);
  Serial.print(F("°F  Heat index: "));
  Serial.print(hic);
  Serial.print(F("°C "));
  Serial.print(hif);
  Serial.println(F("°F"));

  //Display data ke LCD =>tampung di data string
  String print_temp = "Temp: ";  print_temp += String(t); print_temp += " C";
  String print_humd = "Humd: ";  print_humd += String(h); print_humd += " %";
  lcd.setCursor(0,0);  lcd.print(print_temp);
  lcd.setCursor(0,1);  lcd.print(print_humd);
  
}


ESP32 Temperature monitor