Pendahuluan
Biasanya product IoT untuk berinteraksi dengan user, digunakan mobile atau web application. Namun, adakalanya kita perlu menampilkan informasi pada device. Untuk produk yang memiliki kebutuhan tersebut, dapat digunakan LCD.
LCD mudah didapatkan dengan harga yang terjangkau. Ukuran yang disediakan juga bervariasi, contoh, 16×2, yang berarti tersedia 16 columns dan 2 rows, total dapat ditampilkan 32 characters dalam satu waktu.
LCD dapat beroperasi dalam 4-bit mode atau 8-bit mode, yang menunjukan jumlah data lines
untuk menjalankan LCD. Hal ini terlalu mahal bagi GPIO resources pada ESP32.
Oleh karena perlu digunakan I2C adapter module untuk mengurangi jumlah pins menjadi two, yaitu serial data (SDA) dan serial clock (SCL). Contoh adapter modul:
Ada juga tersedia LCD screens yang sudah terpasang I2C adapter, jadi lebih mudah digunakan.
Pada modul ini kita akan membuat aplikasi temperature yang ditampilkan ke LCD. Berikut component yang digunakan.
Component
- 16×2 LCD (HD44780 controller chip) with I2C adapter
- Logic converter, 3.3 V-5 V
- 5 V power source for the screen
- DHT11
Diagram
Bagian atas breadboard menggunakan V logic, dan bagian bawah untuk 3.3 V logic. Pastikan semua pins dari ESP32 devkit dihubungkan kebagian bawah breadboard.
Code
Pertama kita perlu tambahkan pada platformio.ini untuk path external library yang digunakan baik untuk LCD screen dan DHT11 sensor.
Library LCD sudah tersedia dalam esp-idf-lib, jika tidak ada, dapat didownload di GitHub: https://github.com/maxsydney/ESP32-HD44780
build_flags = -DCONFIG_I2CDEV_TIMEOUT=100000 monitor_speed = 115200 lib_extra_dirs = ../../common/esp-idf-lib/components
LCD library memerlukan timeout value untuk I2C communication. Kita sediakan melalui property
a build flag, CONFIG_I2CDEV_TIMEOUT
//bagian import #include <freertos/FreeRTOS.h> #include <freertos/task.h> #include <string.h> #include <stdio.h> #include <driver/i2c.h> #include <HD44780.h> #include <dht.h> #define LCD_ADDR 0x27 #define SDA_PIN 21 #define SCL_PIN 22 #define LCD_COLS 16 #define LCD_ROWS 2 #define DHT11_PIN 17 //bagian init hardware static void init_hw(void) { LCD_init(LCD_ADDR, SDA_PIN, SCL_PIN, LCD_COLS, LCD_ROWS); } //bagian menampilkan temperature ke LCD void show_dht11(void *param) { char buff[17]; int16_t temperature, humidity; uint8_t read_cnt = 0; while (true) { vTaskDelay(2000 / portTICK_PERIOD_MS); LCD_clearScreen(); if (dht_read_data(DHT_TYPE_DHT11, (gpio_num_t)DHT11_PIN, &humidity, &temperature) == ESP_OK) { temperature /= 10; humidity /= 10; memset(buff, 0, sizeof(buff)); sprintf(buff, "Temp: %d", temperature); LCD_home(); LCD_writeStr(buff); memset(buff, 0, sizeof(buff)); sprintf(buff, "Hum: %d", humidity); LCD_setCursor(0, 1); LCD_writeStr(buff); } else { LCD_home(); memset(buff, 0, sizeof(buff)); sprintf(buff, "Failed (%d)", ++read_cnt); LCD_writeStr(buff); } } } //bagian main function void app_main(void) { init_hw(); xTaskCreate(show_dht11, "dht11", configMINIMAL_STACK_SIZE * 4, NULL, 5, NULL); }
Penjelasan Code
Bagian import library
Header file untuk LCD library adalah HD44780.h. Kita definisikan beberapa macros, yang digunakan untuk I2C communication dengan LCD module.
Bagian Init Hardware
Pada fungsi init_hw, kita hanya inisialisasi LCD module menggunakan fungsi LCD_init, dengan paramter I2C bus address, I2C data dan clock pins, serta ukuran LCD dalam columns dan rows.
Bagian Menampilkan Temperature
Dalam while loop, kita clear screen dengan perintah LCD_clearScreen dan baca data dari DHT11
setiap 2 seconds.
Untuk menulis ke screen adalah dengan pergi ke lokasi dimana teks akan ditulis. Kemudian send text ke LCD.
Untuk menampilkan temperature, kita gunakan fungsi LCD_home untuk memindahkan cursor ke column = 0, row = 0) dan panggil LCD_writeStr dengan parameter berisi temperature string.
Fungsi untuk menentukan posisi kursor adalah LCD_setCursor, memerlukan parameter column dan row positions.
Kemudian kita kita handle DHT11 read failures. Jika gagal membaca dari DHT11, kita tampilkan error message pada LCD.
Bagian Main Function
Pada app_main sangat simple, pertama inisialisasi hardware kemudian jalankan task dengan fungsi show_dht11 sebagai parameter.
Sampai disini kita sudah berhasil menggunakan LCD untuk menampilkan informasi. Pada modul berikutnya kita akan gunakan tipe display OLED.