Menggunakan OLED Pada ESP32

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.

OLED 128×64

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.

Sharing is caring:

Leave a Comment