Organic Light-Emitting Diode (OLED) displays memiliki beberapa keunggulan dibandingkan LCD:
- Penggunaan energy lebih rendah karena tidak diperlukan backlight.
- Response time cepat.
- Sudah terintegrasi I2C communication.
- Lebih tipis.
Kekurangannya adalah harga cukup mahal.
Masih seperti modul sebelumnya, kali ini kita akan gunakan OLED sebagai display
Component
- 1.3″ OLED display dengan SH1106 driver chip.
- DHT11.
Driver chip support 3.3 V logic level, kita dapat sambungkan langsung dengan ESP32. Kita juga tidak perlu eksternal power source karena OLED rendah daya, yaitu lebih kecil dari 11 mA.
Diagram
Code
Original Library untuk oled dapat download di https://github.com/lexus2k/ssd1306, namun perlu diperlukan sedikit perubahan struktur direktori agar compatible dengan platformio, Anda dapat gunakan library yang sudah diupdate dengan download di: https://drive.google.com/drive/folders/1dSDqmBXG-c1GZz4a_52NqICNphwcpCJQ?usp=sharing
Simpan library yang diatas pada folder lib. Atau dapat path dapat definisikan pada platformio.ini
monitor_speed = 115200 lib_extra_dirs = ../../common/components ../../common/esp-idf-lib/components
Kita perlu ubah ekstension dari main.c menjadi main.cpp, agar PlatformIO menggunakan C++ compiler (karena OLED library di-develope dalam C++).
//bagian import library #include "dht.h" #include "ssd1306.h" #include <freertos/FreeRTOS.h> #include <freertos/task.h> #include <stdio.h> #define DHT11_PIN 17 #define OLED_CLK 22 #define OLED_SDA 21 extern "C" void app_main(void); //bagian hardware init static void init_hw(void) { ssd1306_128x64_i2c_initEx(OLED_CLK, OLED_SDA, 0); } //bagian menggambar ke screen static void draw_screen(void) { ssd1306_clearScreen(); ssd1306_setFixedFont(ssd1306xled_font8x16); ssd1306_printFixed(0, 0, "Temp", STYLE_NORMAL); ssd1306_printFixed(0, 32, "Hum", STYLE_NORMAL); } //bagian display hasil reading ke screen static void display_reading(int temp, int hum) { char buff[10]; ssd1306_setFixedFont(ssd1306xled_font6x8); sprintf(buff, "%d", temp); ssd1306_printFixedN(48, 0, buff, STYLE_BOLD, 2); sprintf(buff, "%d", hum); ssd1306_printFixedN(48, 32, buff, STYLE_BOLD, 2); } //bagian read dht11 static void read_dht11(void* arg) { int16_t humidity = 0, temperature = 0; while(1) { vTaskDelay(2000 / portTICK_PERIOD_MS); dht_read_data(DHT_TYPE_DHT11, (gpio_num_t)DHT11_PIN, &humidity, &temperature); display_reading(temperature / 10, humidity / 10); } } //bagian main app void app_main() { init_hw(); draw_screen(); xTaskCreate(read_dht11, "dht11", configMINIMAL_STACK_SIZE * 8, NULL, 5, NULL); }
Penjelasan Code
Bagian Import
Untuk driver OLED, gunakan ssd1306.h.
Kita juga perlu menambahkan perintah extern “C” void app_main(void); Agar C++
compiler berhasil melakukan kompilasi.
Bagian init hardware
ssd1306_128x64_i2c_initEx untuk menginisialisasi OLED driver dengan informasi I2C.
128×64 in pada fungsi menunjukan width dan height dari OLED dalam pixels.
Bagian draw dan write screen
draw_screen akan print labels pada screen. Pertama, kita clear screen dengan perintah ssd1306_clearScreen dan set font menjadi ssd1306xled_font8x16 dengan perintah ssd1306_setFixedFont.
Kemudian panggil perintah ssd1306_printFixed untuk print Temp string pada lokasi (column = 0, row = 0) dalam pixels.
Untuk humidity, kita print pada lokasi (column = 0, row = 32), bagian tengah dari screen.
Gunakan fungsi display_reading untuk update screen dengan data temperature
dan humidity terakhir. Ketika dijalankan, font akan diupdate ke ssd1306xled_
font6x8, kemudian values di print ke screen dengan memanggil ssd1306_printFixedN.
Parameter terakhir dari fungsi akan scales ukuran font sebesar N, dalam code adalah 2.
Bagian Read Temperatur
Fungsi read_dht11 adalah task callback untuk membaca dari DHT11 setiap 2 seconds. Kemudian akan memanggil fungsi display_reading untuk menampilkan values pada OLED screen.
Bagian Main Function
Fungsi app_main akan memanggil init hardware, menggambar labels, lalu pass control ke fungsi read_dht11.
Sampai disini kita sudah berhasil menggunakan OLED sebagai display.
Masih ada banyak display lain yang dapat digunakan, kita hanya akan membahas 2 jenis display yang umum digunakan.