ESP32 개발 보드에서 1602 LCD 사용하기

ESP32 개발 보드에서 1602 LCD 사용하기

1602 LCD (HD44780 드라이버) 배경지식

예전 글에서 라즈베리파이 피코 보드에서 16×2 방식 LCD에 출력하는 자세한 과정을 소개했던 바가 있었는데,

https://kongyine.com/223188515992

​

그 당시 사용한 라이브러리와 코드들을 그대로 이용해서 ESP-32보드에서도 1602 LCD 사용이 가능하다.

참고로, 여기에 사용하는 LCD는 흔히 1602LCD라고 불리는 제품으로, 가로로 16자의 글자를 2줄씩 표시해 줄 수 있는 제품으로, 가격이 수천 원에 불과할 정도로 저렴하여 널리 사용되는 제품이다.

​

또한 통신 방식도 SPI 방식과 I2C 방식이 모두 있어서, 자신이 선호하는 방식을 선택할 수 있는 것 또한 장점이다.

​

한 가지 기억할 것은 국내에서 많이 찾아볼 수 있는 제품은 드라이버 칩셋으로 HD44780을 사용한 제품이라는 것이다.

​

이 LCD를 쉽게 사용하려면 HD44780 칩셋용 라이브러리 파일이 필요한데, 예전 글에서는 피코 보드용으로 Github에서 다음 라이브러리를 찾아 사용했었다. 동작 명령어가 많고 사용이 쉬운 장점 때문이었다.

이 라이브러리 파일들은 ESP32보드에서도 동일하게 사용할 수 있었다.

참고로, 해당 드라이버 파일 2개를 다음 링크로 첨부해 두었다.

첨부파일

lcd_api.py

파일 다운로드

 

첨부파일

pico_i2c_lcd.py

파일 다운로드

 

​

ESP32 보드에 연결

내가 사용한 ESP 32 개발 보드에서 I2C 통신을 위한 SDA와 SCL은 각기 GP22와 GP21번 핀으로, 이들 핀을 LCD의 SCL과 SDA에 연결해 주어야 한다.

​

​

​

그리고 사용한 코드는 예전 글에서 사용한 코드를 그대로 이용하되, SDA와 SCL 핀 번호만 변경한 것이다.

​

코드의 내용을 간략히 소개하면, 다음과 같다.

​

1) 먼저, Library 사용을 선언해 준다.

import machine

from lcd_api import LcdApi –> 미리 저장해 둔 라이브러리

from pico_i2c_lcd import I2cLcd –> 미리 저장해 둔 라이브러리

​

2) I2C 버스용으로 사용할 2개의 핀을 선언하고, 이를 이용해 i2c 버스 사용을 선언해 준다.

sda=machine.Pin(21)

scl=machine.Pin(22)

i2c=machine.I2C(0,sda=sda, scl=scl, freq=400000)

​

3) 액정의 크기와 주소를 선언해 준다.

I2C_ADDR = 0x27 –> 미리 확인해 둔 주소로 모르는 경우 i2c.scan( )으로 확인 가능

totalRows = 2 –> 2개의 행을 가짐을 선언

totalColumns = 16 –> 가로로 16자씩으로 구성됨을 선언

lcd = I2cLcd(i2c, I2C_ADDR, totalRows, totalColumns)

​

​

4) 명령어를 이용하여 출력하면 된다. 주요 lcd 명령어는 다음과 같은데, 각각의 기능은 이름에서 알 수 있다.

lcd.clear()

lcd.show_cursor()

lcd.hide_cursor()

lcd.blink_cursor_on()

lcd.blink_cursor_off()

lcd.display_on()

lcd.display_off()

lcd.backlight_off()

lcd.backlight_on()

lcd.move_to(행번호, 열 번호)

lcd.putchar(“글자”)

lcd.putstr(“문자열”)

​

​

​

최종적으로 사용한 코드는 다음과 같다.

import machine
import utime

from lcd_api import LcdApi
from pico_i2c_lcd import I2cLcd

utime.sleep(2)

sda=machine.Pin(21)
scl=machine.Pin(22)
i2c=machine.I2C(0,sda=sda, scl=scl, freq=400000)
I2C_ADDR = 0x27
totalRows = 2
totalColumns = 16
lcd = I2cLcd(i2c, I2C_ADDR, totalRows, totalColumns)

lcd.putstr("Hello World!")
lcd.move_to(0,1)
lcd.putstr("I2C address"+str(i2c.scan()))
utime.sleep(1)

lcd.clear()  
lcd.putstr("Let me show functions")
utime.sleep(1)
while True:
for i in range(9):
                       
        lcd.clear()
if i == 0:
print("cursor is on")
            lcd.show_cursor()
            lcd.putstr("Cursor is on")
if  i == 1:
print("cursor is off")
            lcd.hide_cursor()
            lcd.putstr("Cursor is off")
if  i == 2:
print("Turning blink cursor on")
            lcd.blink_cursor_on()
            lcd.putstr("Cursor blinking - ON")
if  i == 3:
print("Turning blink cursor off")
            lcd.blink_cursor_off()
            lcd.putstr("Cursor blinking - OFF")
if  i == 4:
print("Turning backlight off")
            lcd.putstr("Next, backlight - off")
            utime.sleep(1)    
            lcd.backlight_off()
            lcd.clear()  
            lcd.putstr("Backlight off")
if  i == 5:
print("Turning backlight on")
            lcd.backlight_on()
            lcd.putstr("Backlight on")
if  i == 6:
            lcd.putstr("Next, display - turn off.")
            utime.sleep(1)
print("Turning display off")
            lcd.display_off()
            lcd.clear()  
            lcd.putstr("Display off")
if  i == 7:
print("Turning display on")
            lcd.display_on()
            lcd.putstr("Display on")
if  i == 8:
print("Move Cursor and Put a Character")
for j in range(16):
for k in range(2):
                    lcd.move_to(j,k)
                    lcd.putchar("a")
                    utime.sleep(0.3)
                
        utime.sleep(1)

​

그런데 LCD의 전원 VCC와 GND를 ESP32 개발 보드의 VCC와 GND에 연결한 결과, 정상적으로 동작하기는 하는데, 다음과 같이 글자가 매우 흐려서 알아보기가 어려웠다.

​

때문에 LCD의 VCC에 연결한 전원만 ESP32 개발 보드의 VIN으로 변경한 결과,

​

​

다음과 같이 글자가 선명해졌고, 정상적으로 잘 동작하는 것을 볼 수가 있다.

​

​

위의 마이크로 파이썬 코드가 동작하는 모습은 다음과 같다.

​

​