Blog Archive

Arduino Indonesia. Gambar tema oleh Storman. Diberdayakan oleh Blogger.

Supported by Electronics 3 in 1

1. Jasa pencetakan PCB single layer dengan harga paling murah.

(Metode Pembuatan dengan Transfer Toner)
>PCB design sendiri (siap cetak) : Rp.150,-/Cm2
>PCB design dari kami : Rp.250,-/Cm2

(Metode Sablon Full Masking dan Silk Screen minimal pemesanan 100 Pcs)
>PCB design sendiri (siap cetak) : Rp.200,-/Cm2
>PCB design dari kami : Rp.250,-/Cm2

2. Jasa perancangan, perakitan, dan pembuatan trainer pembelajaran elektronika untuk SMK dan Mahasiswa.

3. Jasa perancangan, perakitan, dan pembuatan berbagai macam kontroller, sensor, aktuator, dan tranduser.
>Design Rangkaian / Sistem Elektronika
>Design Rangkaian / Sistem Instrumentasi
>Design Rangkaian / Sistem Kendali
>Kerjasama Riset (data atau peralatan)
>Kerjasama Produksi Produk-Produk KIT Elektronika
>Produksi Instrumentasi Elektronika

4. Jasa Pembuatan Proyek, Tugas Akhir, Tugas Laboratorium, PKM, Karya Ilmiah, SKRIPSI, dll

Like My Facebook

Popular Posts

Senin, 15 Desember 2025

Tutorial MicroPython ESP32/ESP8266 - Menampilkan Data di LCD I2C

Pelajari cara mengintegrasikan LCD I2C (Liquid Crystal Display) dengan papan ESP32 dan ESP8266 NodeMCU menggunakan pemrograman MicroPython. Pada artikel ini, Anda akan mempelajari skema pengkabelan LCD ke board, pustaka (library) yang diperlukan, serta cara menulis kode untuk menampilkan teks statis, teks berjalan (scrolling), dan ikon kustom pada layar LCD.

Pengenalan LCD

Salah satu jenis layar tampilan yang paling sederhana dan ekonomis adalah Liquid Crystal Display (LCD). LCD banyak digunakan pada berbagai perangkat elektronik sehari-hari seperti mesin penjual otomatis, kalkulator, meter parkir, dan printer, serta sangat sesuai untuk menampilkan informasi berupa teks maupun ikon berukuran kecil.

 


Ukuran LCD ditentukan berdasarkan jumlah baris (rows) dan kolom (columns) karakter yang dapat ditampilkan pada layar. Sebagai contoh, LCD 16×2 mampu menampilkan 2 baris dengan masing-masing 16 karakter. Tersedia berbagai ukuran LCD, mulai dari 8×1 hingga 40×4.

 

Salah satu metode paling praktis untuk mengendalikan LCD menggunakan mikrokontroler adalah dengan memanfaatkan modul LCD yang telah dilengkapi antarmuka I2C. Pada pembahasan ini, digunakan LCD 16×2 dengan komunikasi I2C.

 

Untuk mengikuti tutorial ini, disarankan menggunakan LCD yang juga mendukung antarmuka I2C. Dari sisi ukuran, Anda bebas memilih sesuai kebutuhan, karena pada umumnya tetap kompatibel dengan konsep dan kode yang digunakan.

LCD dengan Driver I2C

Keunggulan utama LCD berbasis I2C terletak pada kemudahan pengkabelannya. Anda hanya perlu menghubungkan dua jalur komunikasi, yaitu pin SDA (data) dan SCL (clock).



Selain itu, modul LCD I2C umumnya telah dilengkapi dengan potensiometer bawaan yang berfungsi untuk mengatur tingkat kontras antara latar belakang dan karakter yang ditampilkan pada layar. Pada LCD konvensional yang tidak mendukung antarmuka I2C, potensiometer eksternal perlu ditambahkan ke dalam rangkaian untuk melakukan pengaturan kontras.

Pengkabelan LCD I2C ke ESP32/ESP8266

Karena modul LCD ini menggunakan komunikasi I2C, proses pengkabelan menjadi lebih sederhana. Pin I2C pada LCD dihubungkan ke pin I2C bawaan (default) pada ESP32 atau ESP8266. Sementara itu, pin VCC pada modul LCD perlu dihubungkan ke sumber tegangan 5V.

 

Diagram Rangkaian

Diagram berikut dapat digunakan sebagai referensi dalam proses perakitan dan pengkabelan rangkaian.

ESP32 


ESP8266 NodeMCU


Menentukan Alamat I2C LCD

Sebagian besar modul LCD berbasis I2C menggunakan alamat I2C 0x27. Namun, pada beberapa modul, alamat tersebut dapat berbeda. Oleh karena itu, penting untuk memastikan alamat I2C yang digunakan sebelum melanjutkan ke tahap berikutnya. Informasi alamat I2C dapat diperoleh dengan melihat datasheet modul atau dengan menjalankan program pemindai I2C (I2C scanner).

Library LCD – MicroPython

Tersedia berbagai library yang dapat mempermudah komunikasi antara mikrokontroler dan modul LCD. Pada tutorial ini, digunakan kombinasi dua modul MicroPython yang dikembangkan oleh pengguna GitHub dhylands.

 

Ikuti langkah-langkah berikut untuk menginstal dua modul yang diperlukan.

Mengunduh dan Mengunggah lcd_api.py

- Unduh berkas `lcd_api.py`;

- Salin kode tersebut ke dalam sebuah file baru di Thonny IDE;

- Pilih menu File > Save as…, kemudian pilih MicroPython Device;

- Simpan file dengan nama lcd_api.py (nama file tidak boleh diubah).

 

# Provides an API for talking to HD44780 compatible character LCDs.

# https://github.com/dhylands/python_lcd/tree/master/lcd

import time


class LcdApi:

    """Implements the API for talking with HD44780 compatible character LCDs.

    This class only knows what commands to send to the LCD, and not how to get

    them to the LCD.


    It is expected that a derived class will implement the hal_xxx functions.

    """


    # The following constant names were lifted from the avrlib lcd.h

    # header file, however, I changed the definitions from bit numbers

    # to bit masks.

    #

    # HD44780 LCD controller command set


    LCD_CLR = 0x01              # DB0: clear display

    LCD_HOME = 0x02             # DB1: return to home position


    LCD_ENTRY_MODE = 0x04       # DB2: set entry mode

    LCD_ENTRY_INC = 0x02        # --DB1: increment

    LCD_ENTRY_SHIFT = 0x01      # --DB0: shift


    LCD_ON_CTRL = 0x08          # DB3: turn lcd/cursor on

    LCD_ON_DISPLAY = 0x04       # --DB2: turn display on

    LCD_ON_CURSOR = 0x02        # --DB1: turn cursor on

    LCD_ON_BLINK = 0x01         # --DB0: blinking cursor


    LCD_MOVE = 0x10             # DB4: move cursor/display

    LCD_MOVE_DISP = 0x08        # --DB3: move display (0-> move cursor)

    LCD_MOVE_RIGHT = 0x04       # --DB2: move right (0-> left)


    LCD_FUNCTION = 0x20         # DB5: function set

    LCD_FUNCTION_8BIT = 0x10    # --DB4: set 8BIT mode (0->4BIT mode)

    LCD_FUNCTION_2LINES = 0x08  # --DB3: two lines (0->one line)

    LCD_FUNCTION_10DOTS = 0x04  # --DB2: 5x10 font (0->5x7 font)

    LCD_FUNCTION_RESET = 0x30   # See "Initializing by Instruction" section


    LCD_CGRAM = 0x40            # DB6: set CG RAM address

    LCD_DDRAM = 0x80            # DB7: set DD RAM address


    LCD_RS_CMD = 0

    LCD_RS_DATA = 1


    LCD_RW_WRITE = 0

    LCD_RW_READ = 1


    def __init__(self, num_lines, num_columns):

        self.num_lines = num_lines

        if self.num_lines > 4:

            self.num_lines = 4

        self.num_columns = num_columns

        if self.num_columns > 40:

            self.num_columns = 40

        self.cursor_x = 0

        self.cursor_y = 0

        self.implied_newline = False

        self.backlight = True

        self.display_off()

        self.backlight_on()

        self.clear()

        self.hal_write_command(self.LCD_ENTRY_MODE | self.LCD_ENTRY_INC)

        self.hide_cursor()

        self.display_on()


    def clear(self):

        """Clears the LCD display and moves the cursor to the top left

        corner.

        """

        self.hal_write_command(self.LCD_CLR)

        self.hal_write_command(self.LCD_HOME)

        self.cursor_x = 0

        self.cursor_y = 0


    def show_cursor(self):

        """Causes the cursor to be made visible."""

        self.hal_write_command(self.LCD_ON_CTRL | self.LCD_ON_DISPLAY |

                               self.LCD_ON_CURSOR)


    def hide_cursor(self):

        """Causes the cursor to be hidden."""

        self.hal_write_command(self.LCD_ON_CTRL | self.LCD_ON_DISPLAY)


    def blink_cursor_on(self):

        """Turns on the cursor, and makes it blink."""

        self.hal_write_command(self.LCD_ON_CTRL | self.LCD_ON_DISPLAY |

                               self.LCD_ON_CURSOR | self.LCD_ON_BLINK)


    def blink_cursor_off(self):

        """Turns on the cursor, and makes it no blink (i.e. be solid)."""

        self.hal_write_command(self.LCD_ON_CTRL | self.LCD_ON_DISPLAY |

                               self.LCD_ON_CURSOR)


    def display_on(self):

        """Turns on (i.e. unblanks) the LCD."""

        self.hal_write_command(self.LCD_ON_CTRL | self.LCD_ON_DISPLAY)


    def display_off(self):

        """Turns off (i.e. blanks) the LCD."""

        self.hal_write_command(self.LCD_ON_CTRL)


    def backlight_on(self):

        """Turns the backlight on.


        This isn't really an LCD command, but some modules have backlight

        controls, so this allows the hal to pass through the command.

        """

        self.backlight = True

        self.hal_backlight_on()


    def backlight_off(self):

        """Turns the backlight off.


        This isn't really an LCD command, but some modules have backlight

        controls, so this allows the hal to pass through the command.

        """

        self.backlight = False

        self.hal_backlight_off()


    def move_to(self, cursor_x, cursor_y):

        """Moves the cursor position to the indicated position. The cursor

        position is zero based (i.e. cursor_x == 0 indicates first column).

        """

        self.cursor_x = cursor_x

        self.cursor_y = cursor_y

        addr = cursor_x & 0x3f

        if cursor_y & 1:

            addr += 0x40    # Lines 1 & 3 add 0x40

        if cursor_y & 2:    # Lines 2 & 3 add number of columns

            addr += self.num_columns

        self.hal_write_command(self.LCD_DDRAM | addr)


    def putchar(self, char):

        """Writes the indicated character to the LCD at the current cursor

        position, and advances the cursor by one position.

        """

        if char == '\n':

            if self.implied_newline:

                # self.implied_newline means we advanced due to a wraparound,

                # so if we get a newline right after that we ignore it.

                self.implied_newline = False

            else:

                self.cursor_x = self.num_columns

        else:

            self.hal_write_data(ord(char))

            self.cursor_x += 1

        if self.cursor_x >= self.num_columns:

            self.cursor_x = 0

            self.cursor_y += 1

            self.implied_newline = (char != '\n')

        if self.cursor_y >= self.num_lines:

            self.cursor_y = 0

        self.move_to(self.cursor_x, self.cursor_y)


    def putstr(self, string):

        """Write the indicated string to the LCD at the current cursor

        position and advances the cursor position appropriately.

        """

        for char in string:

            self.putchar(char)


    def custom_char(self, location, charmap):

        """Write a character to one of the 8 CGRAM locations, available

        as chr(0) through chr(7).

        """

        location &= 0x7

        self.hal_write_command(self.LCD_CGRAM | (location << 3))

        self.hal_sleep_us(40)

        for i in range(8):

            self.hal_write_data(charmap[i])

            self.hal_sleep_us(40)

        self.move_to(self.cursor_x, self.cursor_y)


    def hal_backlight_on(self):

        """Allows the hal layer to turn the backlight on.


        If desired, a derived HAL class will implement this function.

        """

        pass


    def hal_backlight_off(self):

        """Allows the hal layer to turn the backlight off.


        If desired, a derived HAL class will implement this function.

        """

        pass


    def hal_write_command(self, cmd):

        """Write a command to the LCD.


        It is expected that a derived HAL class will implement this

        function.

        """

        raise NotImplementedError


    def hal_write_data(self, data):

        """Write data to the LCD.


        It is expected that a derived HAL class will implement this

        function.

        """

        raise NotImplementedError


    # This is a default implementation of hal_sleep_us which is suitable

    # for most micropython implementations. For platforms which don't

    # support `time.sleep_us()` they should provide their own implementation

    # of hal_sleep_us in their hal layer and it will be used instead.

    def hal_sleep_us(self, usecs):

        """Sleep for some time (given in microseconds)."""

        time.sleep_us(usecs)  # NOTE this is not part of Standard Python library, specific hal layers will need to override this

 

Mengunduh dan Mengunggah machine_i2c_lcd.py

- Unduh berkas `machine_i2c_lcd.py`;

- Salin kode tersebut ke dalam file baru menggunakan Thonny IDE;

- Pilih menu File > Save as…, lalu pilih MicroPython Device;

- Simpan file dengan namamachine_i2c_lcd.py (nama file harus sesuai dan tidak boleh diubah).

 

# Implements a HD44780 character LCD connected via PCF8574 on I2C.

# This was tested with: https://www.wemos.cc/product/d1-mini.html

# https://github.com/dhylands/python_lcd/blob/master/lcd/machine_i2c_lcd.py


from lcd_api import LcdApi

from time import sleep_ms


# The PCF8574 has a jumper selectable address: 0x20 - 0x27

DEFAULT_I2C_ADDR = 0x27


# Defines shifts or masks for the various LCD line attached to the PCF8574


MASK_RS = 0x01

MASK_RW = 0x02

MASK_E = 0x04

SHIFT_BACKLIGHT = 3

SHIFT_DATA = 4



class I2cLcd(LcdApi):

    """Implements a HD44780 character LCD connected via PCF8574 on I2C."""


    def __init__(self, i2c, i2c_addr, num_lines, num_columns):

        self.i2c = i2c

        self.i2c_addr = i2c_addr

        self.i2c.writeto(self.i2c_addr, bytearray([0]))

        sleep_ms(20)   # Allow LCD time to powerup

        # Send reset 3 times

        self.hal_write_init_nibble(self.LCD_FUNCTION_RESET)

        sleep_ms(5)    # need to delay at least 4.1 msec

        self.hal_write_init_nibble(self.LCD_FUNCTION_RESET)

        sleep_ms(1)

        self.hal_write_init_nibble(self.LCD_FUNCTION_RESET)

        sleep_ms(1)

        # Put LCD into 4 bit mode

        self.hal_write_init_nibble(self.LCD_FUNCTION)

        sleep_ms(1)

        LcdApi.__init__(self, num_lines, num_columns)

        cmd = self.LCD_FUNCTION

        if num_lines > 1:

            cmd |= self.LCD_FUNCTION_2LINES

        self.hal_write_command(cmd)


    def hal_write_init_nibble(self, nibble):

        """Writes an initialization nibble to the LCD.


        This particular function is only used during initialization.

        """

        byte = ((nibble >> 4) & 0x0f) << SHIFT_DATA

        self.i2c.writeto(self.i2c_addr, bytearray([byte | MASK_E]))

        self.i2c.writeto(self.i2c_addr, bytearray([byte]))


    def hal_backlight_on(self):

        """Allows the hal layer to turn the backlight on."""

        self.i2c.writeto(self.i2c_addr, bytearray([1 << SHIFT_BACKLIGHT]))


    def hal_backlight_off(self):

        """Allows the hal layer to turn the backlight off."""

        self.i2c.writeto(self.i2c_addr, bytearray([0]))


    def hal_write_command(self, cmd):

        """Writes a command to the LCD.


        Data is latched on the falling edge of E.

        """

        byte = ((self.backlight << SHIFT_BACKLIGHT) | (((cmd >> 4) & 0x0f) << SHIFT_DATA))

        self.i2c.writeto(self.i2c_addr, bytearray([byte | MASK_E]))

        self.i2c.writeto(self.i2c_addr, bytearray([byte]))

        byte = ((self.backlight << SHIFT_BACKLIGHT) | ((cmd & 0x0f) << SHIFT_DATA))

        self.i2c.writeto(self.i2c_addr, bytearray([byte | MASK_E]))

        self.i2c.writeto(self.i2c_addr, bytearray([byte]))

        if cmd <= 3:

            # The home and clear commands require a worst case delay of 4.1 msec

            sleep_ms(5)


    def hal_write_data(self, data):

        """Write data to the LCD."""

        byte = (MASK_RS | (self.backlight << SHIFT_BACKLIGHT) | (((data >> 4) & 0x0f) << SHIFT_DATA))

        self.i2c.writeto(self.i2c_addr, bytearray([byte | MASK_E]))

        self.i2c.writeto(self.i2c_addr, bytearray([byte]))

        byte = (MASK_RS | (self.backlight << SHIFT_BACKLIGHT) | ((data & 0x0f) << SHIFT_DATA))

        self.i2c.writeto(self.i2c_addr, bytearray([byte | MASK_E]))

        self.i2c.writeto(self.i2c_addr, bytearray([byte]))

 

Setelah modul library berhasil diunggah ke board, Anda dapat memanfaatkan fungsi-fungsi library tersebut di dalam program untuk menampilkan teks pada LCD.

Menampilkan Teks Statis – Contoh Kode

Menampilkan teks statis pada LCD tergolong mudah. Anda hanya perlu menentukan posisi (baris dan kolom) tempat karakter akan ditampilkan, kemudian mengirimkan pesan ke layar LCD. Jika posisi tampilan tidak ditentukan, teks akan ditulis pada ruang pertama yang tersedia.

 

Contoh program berikut menampilkan pesan “Hello, World!” pada baris pertama dan kemudian pada baris kedua layar LCD. Kode ini kompatibel untuk ESP32 maupun ESP8266, dengan catatan Anda perlu mengaktifkan (uncomment) definisi pin yang sesuai untuk ESP8266.


from machine import Pin, SoftI2C

from machine_i2c_lcd import I2cLcd

from time import sleep


# Define the LCD I2C address and dimensions

I2C_ADDR = 0x27

I2C_NUM_ROWS = 2

I2C_NUM_COLS = 16


# Initialize I2C and LCD objects

i2c = SoftI2C(sda=Pin(21), scl=Pin(22), freq=400000)


# for ESP8266, uncomment the following line

#i2c = SoftI2C(sda=Pin(4), scl=Pin(5), freq=400000)


lcd = I2cLcd(i2c, I2C_ADDR, I2C_NUM_ROWS, I2C_NUM_COLS)


lcd.putstr("It's working :)")

sleep(4)


try:

    while True:

        # Clear the LCD

        lcd.clear()

        # Display two different messages on different lines

        # By default, it will start at (0,0) if the display is empty

        lcd.putstr("Hello World!")

        sleep(2)

        lcd.clear()

        # Starting at the second line (0, 1)

        lcd.move_to(0, 1)

        lcd.putstr("Hello World!")

        sleep(2)


except KeyboardInterrupt:

    # Turn off the display

    print("Keyboard interrupt")

    lcd.backlight_off()

    lcd.display_off()

 

Cara Kerja Program

Pada bagian ini, akan dijelaskan secara singkat bagaimana program bekerja serta cara berinteraksi dengan modul LCD.

Mengimpor Library

Langkah awal adalah memanggil seluruh modul yang diperlukan untuk melakukan komunikasi dengan LCD. Pada contoh ini, digunakan antarmuka I2C berbasis perangkat lunak (software I2C).

 

from machine import Pin, SoftI2C

from machine_i2c_lcd import I2cLcd

from time import sleep

 

Konfigurasi Properti LCD

Pada baris kode berikutnya, dilakukan pendefinisian properti LCD yang digunakan. Pada contoh ini, LCD memiliki ukuran 16×2 (2 baris dan 16 kolom) dengan alamat I2C 0x27. Jika modul LCD yang digunakan memiliki dimensi atau alamat I2C yang berbeda, sesuaikan nilai konfigurasi pada baris kode tersebut.

 

# Define the LCD I2C address and dimensions

I2C_ADDR = 0x27

I2C_NUM_ROWS = 2

I2C_NUM_COLS = 16

 

Komunikasi I2C

Selanjutnya, antarmuka I2C diinisialisasi menggunakan pin GPIO 21 dan GPIO 22 pada ESP32, yaitu pin yang digunakan untuk menghubungkan modul LCD.

 

i2c = SoftI2C(sda=Pin(21), scl=Pin(22), freq=400000)

 

Jika Anda menggunakan ESP8266, pastikan untuk menonaktifkan (comment) baris kode sebelumnya dan mengaktifkan (uncomment) baris berikutnya agar menggunakan pin I2C bawaan ESP8266, yaitu GPIO 4 dan GPIO 5.

 

# for ESP8266, uncomment the following line

#i2c = SoftI2C(sda=Pin(4), scl=Pin(5), freq=400000)

 

Setelah instance I2C dibuat, komunikasi I2C dengan modul LCD dapat diinisialisasi menggunakan baris kode berikut.

 

lcd = I2cLcd(i2c, I2C_ADDR, I2C_NUM_ROWS, I2C_NUM_COLS)

 

Selanjutnya, dibuat sebuah objek bernama lcd menggunakan metode `I2cLcd()`, dengan parameter berupa instance I2C, alamat I2C, serta jumlah baris dan kolom LCD. Objek lcd ini kemudian digunakan sebagai representasi layar LCD dalam seluruh pemanggilan fungsi selanjutnya.

Menulis Teks

Setelah komunikasi berhasil dibuat, proses penulisan teks pada LCD dapat dilakukan. Untuk menampilkan teks sederhana, cukup gunakan metode `putstr()` pada objek lcd dengan memasukkan teks yang ingin ditampilkan sebagai parameter. Sebagai contoh:

 

lcd.putstr("It's working :)")

 

Kode tersebut akan menampilkan pesan “It’s working 🙂”. Karena posisi tampilan tidak ditentukan dan layar LCD masih kosong, teks akan ditampilkan mulai dari koordinat (0, 0), yaitu baris pertama dan kolom pertama.

 

Selanjutnya, terdapat perulangan `while` yang secara terus-menerus menampilkan pesan “Hello World!” pada LCD dengan bergantian antara baris atas dan baris bawah, sehingga membentuk pola tampilan sederhana yang berulang.

 

while True:

    # Clear the LCD

    lcd.clear()

    # Display two different messages on different lines

    # By default, it will start at (0,0) if the display is empty

    lcd.putstr("Hello World!")

    sleep(2)

    lcd.clear()

    # Starting at the second line (0, 1)

    lcd.move_to(0, 1)

    lcd.putstr("Hello World!")

    sleep(2)

 

Menghapus Tampilan Layar

Sebelum menampilkan informasi baru, isi layar LCD dihapus terlebih dahulu menggunakan metode `clear()` untuk memastikan tampilan tetap rapi dan tidak saling menumpuk.

 

lcd.clear()

 

Selanjutnya, teks “Hello World!” ditampilkan pada layar LCD. Secara default, penulisan teks dimulai dari sudut kiri atas layar, yaitu pada posisi (0, 0).

 

lcd.putstr("Hello World!")

 

Pesan ini akan ditampilkan pada layar LCD selama dua detik.

 

sleep(2)

 

Setelah itu, layar LCD akan dibersihkan kembali.

 

lcd.clear()

Memindahkan Posisi Kursor

Selanjutnya, digunakan metode `move_to()` yang menerima parameter berupa nomor baris dan kolom, sehingga memungkinkan penentuan posisi awal penulisan teks. Pada contoh ini, posisi kursor diatur ke awal baris kedua LCD, yaitu pada baris 1, kolom 0. Dengan pengaturan ini, pesan “Hello World!” kedua dapat ditampilkan pada baris kedua layar.

Mematikan Lampu Latar (Backlight)

Selain itu, ditambahkan potongan kode untuk mematikan lampu latar LCD apabila program dihentikan akibat interupsi dari keyboard. Untuk keperluan ini, dapat digunakan metode `backlight_off()` dan `display_off()`.

 

except KeyboardInterrupt:

    # Turn off the display

    print("Keyboard interrupt")

    lcd.backlight_off()

    lcd.display_off()

 

Contoh sederhana ini memperlihatkan metode-metode paling umum dan penting untuk berinteraksi dengan modul LCD. Disarankan untuk meninjau berkas `machine_i2c_lcd.py` dan `lcd_api.py` guna memahami fungsi-fungsi lain yang tersedia, serta mencoba metode tambahan yang mungkin berguna sesuai kebutuhan proyek.

Pengujian Program

Unggah dan jalankan kode program pada board ESP32 atau ESP8266. Pada tahap awal, layar LCD akan menampilkan pesan yang menandakan bahwa program berjalan dengan benar.

 


Selanjutnya, pesan “Hello, World!” akan ditampilkan pada baris pertama selama dua detik, kemudian pada baris kedua selama dua detik berikutnya. Proses ini akan terus berulang dalam sebuah loop hingga program dihentikan.


Catatan: Jika Anda ingin program berjalan secara otomatis saat ESP melakukan booting (misalnya tanpa terhubung ke komputer), simpan file program tersebut di board dengan nama `main.py`.

Berkas yang diberi nama `main.py` akan dieksekusi secara otomatis oleh ESP32 atau ESP8266 setiap kali perangkat dinyalakan atau di-reset. Jika file disimpan dengan nama lain, program tetap tersimpan di sistem berkas board, namun tidak akan dijalankan secara otomatis saat booting.

Pemecahan Masalah (Troubleshooting)

Jika tampilan LCD memiliki kontras yang terlalu rendah sehingga karakter sulit terlihat, putar potensiometer yang terdapat di bagian belakang modul untuk menyesuaikan kontras antara karakter dan lampu latar (backlight).

 

Selain itu, pastikan modul LCD diberi catu daya 5V. Penggunaan tegangan 3,3V umumnya tidak mencukupi untuk sebagian besar modul LCD I2C, kecuali jika dinyatakan lain pada datasheet pabrikan.

Menampilkan Teks Berjalan (Scrolling Text)

Teks berjalan pada LCD berguna untuk menampilkan pesan yang panjangnya melebihi lebar layar LCD (dalam contoh ini, lebih dari 16 karakter).

 

Library yang digunakan tidak menyediakan fungsi bawaan khusus untuk menampilkan teks berjalan. Namun, Anda dapat membuat fungsi sendiri dengan menggeser teks ke kiri secara bertahap pada setiap siklus tampilan, seperti ditunjukkan pada contoh program berikut.

 

from machine import Pin, SoftI2C

from machine_i2c_lcd import I2cLcd

from time import sleep


# Define the LCD I2C address and dimensions

I2C_ADDR = 0x27

I2C_NUM_ROWS = 2

I2C_NUM_COLS = 16


# Initialize I2C and LCD objects

i2c = SoftI2C(sda=Pin(21), scl=Pin(22), freq=400000)


# for ESP8266, uncomment the following line

#i2c = SoftI2C(sda=Pin(4), scl=Pin(5), freq=400000)


lcd = I2cLcd(i2c, I2C_ADDR, I2C_NUM_ROWS, I2C_NUM_COLS)


def scroll_message(message, delay=0.3):

    # Add spaces to the beginning of the message to make it appear from the right

    message = " " * I2C_NUM_COLS + message + " "

    # Scroll through the message

    for i in range(len(message) - I2C_NUM_COLS + 1):

        lcd.move_to(0, 0)

        lcd.putstr(message[i:i + I2C_NUM_COLS])

        sleep(delay)


try:

    lcd.clear()

    lcd.putstr("Testing scroll!")

    sleep(2)


    # Define the message to be scrolled

    message_scroll = "This is a scrolling message with more than 16 characters"


    while True:

        # Scroll the message on the LCD

        lcd.clear()

        scroll_message(message_scroll)


except KeyboardInterrupt:

    # Turn off the display when the code is interrupted by the user

    print("Keyboard interrupt")

    lcd.backlight_off()

    lcd.display_off()

 

Cara Kerja Program

Pada contoh ini, dibuat sebuah fungsi sederhana bernama `scroll_message()` yang menerima parameter berupa teks yang akan ditampilkan serta jeda waktu antar pergeseran karakter. Secara default, jeda waktu diatur sebesar 0,3 detik, namun nilainya dapat disesuaikan sesuai dengan kecepatan pergerakan teks yang diinginkan.

 

def scroll_message(message, delay=0.3):

    # Add spaces to the beginning of the message to make it appear from the right

    message = " " * I2C_NUM_COLS + message + " "

    # Scroll through the message

    for i in range(len(message) - I2C_NUM_COLS + 1):

        lcd.move_to(0, 0)

        lcd.putstr(message[i:i + I2C_NUM_COLS])

        sleep(delay)

 

Di dalam fungsi tersebut, langkah awal adalah menambahkan padding pada pesan berupa sejumlah spasi kosong yang jumlahnya sama dengan lebar kolom LCD (`I2C_NUM_COLS`), serta satu spasi tambahan di bagian akhir pesan. Penambahan spasi ini bertujuan untuk menyediakan area kosong sebagai titik awal sebelum teks mulai digeser (scrolling).

 

message = " " * I2C_NUM_COLS + message + " "

 

Selanjutnya, digunakan perulangan `for` untuk melakukan iterasi terhadap setiap karakter dalam pesan. Pada setiap iterasi, posisi kursor diatur ke sudut kiri atas layar LCD, yaitu kolom 0, baris 0, sehingga setiap proses penulisan selalu dimulai dari posisi awal tampilan.

 

lcd.move_to(0, 0)

 

Selanjutnya, sebagian teks ditampilkan pada LCD dengan mengambil potongan pesan yang dimulai dari indeks iterasi saat ini (i) dan mencakup lebar layar LCD, yaitu sebanyak `I2C_NUM_COLS` karakter.

 

lcd.putstr(message[i:i + I2C_NUM_COLS])

 

Ekspresi `message[i:i + I2C_NUM_COLS]` digunakan untuk mengambil potongan teks yang dimulai dari karakter dengan indeks i hingga karakter pada indeks i + I2C_NUM_COLS. Seiring bertambahnya nilai i, potongan teks yang ditampilkan akan bergeser, sehingga menghasilkan efek teks berjalan pada LCD.

 

Terakhir, jeda waktu yang diberikan di akhir perulangan berfungsi untuk mengatur kecepatan pergerakan teks.

 

sleep(delay)

 

Untuk menampilkan teks berjalan, panggil fungsi `scroll_message()` dengan memasukkan teks yang ingin ditampilkan serta nilai jeda waktu sebagai parameter.

scroll_message(message_scroll, 0.4)

Pengujian Program

Unggah dan jalankan kode program pada board ESP32 atau ESP8266. Layar LCD akan menampilkan teks berjalan. Kecepatan pergerakan teks dapat disesuaikan dengan mengubah nilai jeda pada parameter `delay` di dalam fungsi `scroll_message()`.

 


Menampilkan Karakter Kustom

Pada LCD 16×2, terdapat total 32 posisi karakter yang dapat digunakan untuk menampilkan data. Setiap karakter tersusun dari matriks piksel berukuran 5×8. Karakter kustom dapat ditampilkan dengan menentukan kondisi setiap piksel pada matriks tersebut. Untuk keperluan ini, digunakan sebuah variabel array bertipe byte yang merepresentasikan pola piksel karakter.

Membuat Karakter Kustom

Sebagian besar modul LCD memungkinkan penyimpanan hingga 8 karakter kustom di dalam memori internal LCD, yang dapat dipanggil kembali menggunakan indeks 0 hingga 7.

 

Untuk membuat karakter kustom, Anda dapat menggunakan alat pembuat karakter LCD untuk merancang pola piksel yang diinginkan, kemudian menghasilkan array byte yang sesuai. Sebagai contoh, berikut adalah karakter berbentuk hati (heart):


Array byte yang dihasilkan ditandai (highlight). Salin array byte tersebut ke dalam satu baris kode. Sebagai contoh, untuk karakter berbentuk hati (heart):

 

0x00, 0x0A, 0x1F, 0x0E, 0x04, 0x00, 0x00

 

Simpan array byte tersebut karena akan digunakan kembali pada bagian kode selanjutnya.

Menampilkan Karakter Kustom – Contoh Kode

Contoh program berikut menampilkan tiga karakter kustom, yaitu termometer, payung, dan hati. Anda dapat menampilkan karakter kustom lainnya dengan mengganti array byte sesuai dengan pola karakter yang diinginkan.

 

from machine import Pin, SoftI2C

from machine_i2c_lcd import I2cLcd

from time import sleep


# Define the LCD I2C address and dimensions

I2C_ADDR = 0x27

I2C_NUM_ROWS = 2

I2C_NUM_COLS = 16


# Initialize I2C and LCD objects

i2c = SoftI2C(sda=Pin(21), scl=Pin(22), freq=400000)


# for ESP8266, uncomment the following line

#i2c = SoftI2C(sda=Pin(4), scl=Pin(5), freq=400000)


lcd = I2cLcd(i2c, I2C_ADDR, I2C_NUM_ROWS, I2C_NUM_COLS)


# Create custom characters here: https://maxpromer.github.io/LCD-Character-Creator/

thermometer = bytearray([0x04, 0x0A, 0x0A, 0x0A, 0x0A, 0x1B, 0x1F, 0x0E])

lcd.custom_char(0, thermometer)


umbrella = bytearray([0x00, 0x04, 0x0E, 0x1F, 0x04, 0x04, 0x014, 0x0C])

lcd.custom_char(1, umbrella)


heart = bytearray([0x00, 0x0A, 0x1F, 0x1F, 0x0E, 0x04, 0x00, 0x00])

lcd.custom_char(2, heart)


try:

    lcd.putstr("Characters")

    lcd.move_to(0, 1)

    # Display thermometer

    lcd.putchar(chr(0))

    # Display umbrella

    lcd.move_to(2, 1)

    lcd.putchar(chr(1))

    # Display heart

    lcd.move_to(4, 1)

    lcd.putchar(chr(2))

 

except KeyboardInterrupt:

    # Turn off the display when the code is interrupted by the user

    print("Keyboard interrupt")

    lcd.backlight_off()

    lcd.display_off()

 

Cara Kerja Program

Langkah pertama adalah menyimpan array byte karakter kustom ke dalam sebuah variabel, seperti ditunjukkan pada contoh berikut.

 

thermometer = bytearray([0x04, 0x0A, 0x0A, 0x0A, 0x0A, 0x1B, 0x1F, 0x0E])

 

Array byte dapat diganti sesuai dengan karakter lain yang ingin ditampilkan. Pada contoh ini, selain karakter termometer, juga ditampilkan karakter payung dan hati.

 

Selanjutnya, untuk menyimpan karakter kustom ke dalam memori LCD, gunakan fungsi `custom_char()` pada objek lcd dengan memasukkan indeks penyimpanan karakter serta array byte yang merepresentasikan karakter tersebut sebagai parameter.

 

lcd.custom_char (0, thermometer)

 

Proses tersebut dilakukan untuk setiap karakter kustom yang ingin ditampilkan, dengan memastikan masing-masing karakter disimpan pada indeks `custom_char()` yang berbeda.

 

thermometer = bytearray([0x04, 0x0A, 0x0A, 0x0A, 0x0A, 0x1B, 0x1F, 0x0E])

lcd.custom_char(0, thermometer)


umbrella = bytearray([0x00, 0x04, 0x0E, 0x1F, 0x04, 0x04, 0x014, 0x0C])

lcd.custom_char(1, umbrella)


heart = bytearray([0x00, 0x0A, 0x1F, 0x1F, 0x0E, 0x04, 0x00, 0x00])

lcd.custom_char(2, heart)

 

Terakhir, untuk menampilkan karakter kustom pada layar LCD, gunakan fungsi `putchar()` seperti pada contoh berikut.

 

lcd.putchar(chr(0))

 

Pada contoh ini, `chr(0)` merepresentasikan karakter termometer yang disimpan pada indeks 0. Prosedur yang sama diterapkan untuk karakter kustom lainnya sesuai dengan indeks penyimpanannya. Dalam implementasi ini, pesan statis ditampilkan pada baris pertama LCD, sedangkan karakter-karakter kustom ditampilkan pada baris kedua.

 

try:

    lcd.putstr(“Characters”)

    lcd.move_to(0, 1)

    # Display thermometer

    lcd.putchar(chr(0))

    # Display umbrella

    lcd.move_to(2, 1)

    lcd.putchar(chr(1))

    # Display heart

    lcd.move_to(4, 1)

    lcd.putchar(chr(2))

 

Seperti yang ditunjukkan, proses menampilkan karakter kustom pada LCD relatif sederhana.

Pengujian Program

Unggah dan jalankan kode pada board ESP32 atau ESP8266. Layar LCD akan menampilkan karakter kustom yang telah didefinisikan. Anda dapat memodifikasi kode untuk menampilkan karakter kustom buatan sendiri, serta menggabungkan beberapa blok karakter yang berdekatan guna membentuk ikon berukuran lebih besar pada layar.

 



 

 

 

 

 

 

 

 

 

Siap Untuk Membuat Proyek Impianmu Menjadi Kenyataan?

Klik di sini untuk chat langsung via WhatsApp dan dapatkan dukungan langsung dari tim ahli kami! 

 

0 on: "Tutorial MicroPython ESP32/ESP8266 - Menampilkan Data di LCD I2C"