之前我们发过几篇关于编译LVGL Micropython固件的笔记(点击查看),该方法基于LVGL官方github(https://github.com/lvgl/lv_micropython),通过LVGL binding for MicroPython进行绑定,需要搭建ESP-IDF开发环境,切换lv_micropython版本,过程相对比较繁琐。
最近发现,GitHub上Kevin Schlosser大佬开发的项目lvgl_micropython已较为成熟(行空板K10也是基于此项目,点击查看)。该项目改变了绑定的设计,并提供了一个Python脚本来处理绑定的构建工作,只需四条命令即可。
项目地址:https://github.com/lvgl-micropython/lvgl_micropython
一、编译固件编译环境:ubuntu22.04第一步,安装依赖包
sudo apt-get install python3 python3-pip python3-venv build-essential cmake ninja-build git libusb-1.0-0-dev
第二步,克隆lvgl_micropython
git clone https://github.com/lvgl-micropython/lvgl_micropythoncd lvgl_micropython
第三步,编译
python3 make.py {build target} {build options} {target options} {global options}
{build target}:指定编译目标平台。可选值包括:esp32、stm32、rp2等。
{build options}:可选的构建选项。选项只有:clean:删除构建目录,用于清理之前的构建残留。
{{model/variant} {model/variant specific options}}:指定目标平台的型号/变体及其特定选项。如:esp32可以指定BOARD=ESP32_GENERIC_S3。
{global options}:全局选项。常见选项包括:DISPLAY={ic model or path}:指定显示驱动型号或路径。INDEV={ic model or path}:指定输入设备驱动型号或路径。
以实战派ESP32C3为例:
python3 make.py esp32 clean BOARD=ESP32_GENERIC_C3 --flash-size=8 DISPLAY=st7789 INDEV=ft6x36
编译时间取决于网络,如果因为网络原因导致编译失败,重新执行以上命令即可。
如果是编译ESP32C3开发板,编译过程会报错,需要将ESP-IDF降为5.2.2版本。(ESP32或ESP32S3忽略以下步骤)
ESP-IDF版本切换:
cd lib/esp-idfgit checkout v5.2.2
将ESP-IDF的版本切换为5.2.2。
执行第三步的命令,重新编译。
如果有报错,可将错误信息发AI解决。
二、烧录测试
参考官方示例运行第一个lvgl程序:
import lcd_busfrom micropython import constimport machineimport lcd_utils
# 定义显示屏的参数_WIDTH = const(240)_HEIGHT = const(320)_BL = const(2)_RST = const(-1)_DC = const(6)
_MOSI = const(5)_MISO = const(-1)_SCK = const(3)_HOST = const(1) # SPI2
# 设置SPI通信的模式(polarity=1, phase=0)spi_mode = lcd_utils.spi_polarity_phase_to_mode(1, 0)
_LCD_CS = const(4)_LCD_FREQ = const(40000000)
# 创建SPI总线对象spi_bus = machine.SPI.Bus( host=_HOST, mosi=_MOSI, miso=_MISO, sck=_SCK, )
# 创建显示屏的SPI通信对象display_bus = lcd_bus.SPIBus( spi_bus=spi_bus, freq=_LCD_FREQ, dc=_DC, cs=_LCD_CS, spi_mode=spi_mode)
import st7789import lvgl as lv
# 创建显示屏对象display = st7789.ST7789( data_bus=display_bus, display_width=_WIDTH, display_height=_HEIGHT, backlight_pin=_BL, color_space=lv.COLOR_FORMAT.RGB565, color_byte_order=st7789.BYTE_ORDER_BGR, rgb565_byte_swap=True,)
import i2cimport task_handlerimport ft6x36
# 初始化显示屏display.init()
# 定义触摸屏的I2C通信参数i2c_bus = i2c.I2C.Bus(host=0, scl=1, sda=0, freq=400000, use_locks=False)touch_dev = i2c.I2C.Device(bus=i2c_bus, dev_id=0x38, reg_bits=ft6x36.BITS)
# 创建触摸屏设备对象indev = ft6x36.FT6x36(touch_dev)
# 如果未校准,则进行校准#indev.calibrate()#indev._cal.mirrorX = False#indev._cal.mirrorY = True#indev._cal.save()
# 启用输入优先级indev.enable_input_priority()
# 旋转显示display.set_rotation(lv.DISPLAY_ROTATION._90)
# 打开屏幕背光(实战派ESP32C3是相反的)display.set_backlight(0)
# 创建一个任务处理器实例th = task_handler.TaskHandler()
scrn = lv.screen_active()# 获取当前激活的屏幕对象scrn.set_style_bg_color(lv.color_hex(0x000000), 0)# 设置屏幕的背景颜色为黑色slider = lv.slider(scrn)# 创建一个滑块slider.set_size(300, 50)# 设置滑块的大小为宽度300,高50slider.center()# 将滑块居中显示
label = lv.label(scrn)# 创建一个标签label.set_text('HELLO LVGL_MICROPYTHON!')# 标签内容label.align(lv.ALIGN.CENTER, 0, -50)# 将标签对齐到屏幕中心,并向上偏移50