ESP32(Micro Python)LVGL 两个动画程序

本次发布两个程序,仪表盘动画程序对刻度数量等参数进行调整,方便布置多个小尺寸仪表盘;进度条动画程序展示了多个进度条的排列方式。

b6a3e2d5b74744428af2f2fe344cd2e5.jpeg

fc611636d0f74e0494af91343f310e78.jpeg 

 仪表盘程序

import lvgl as lv

import time

from espidf import VSPI_HOST

from ili9XXX import ili9341

from xpt2046 import xpt2046

import fs_driver

from machine import Pin

# ------------------------------ 屏幕初始化操作 --start------------------------

# 屏幕宽高

WIDTH = 240

HEIGHT = 320

# 创建显示屏对象

disp = ili9341(miso=19, mosi=23, clk=18, cs=5, dc=26, rst=27, power=14, backlight=-1, backlight_on=0, power_on=0, rot=0x80,

        spihost=VSPI_HOST, mhz=60, factor=16, hybrid=True, width=WIDTH, height=HEIGHT,

        invert=False, double_buffer=True, half_duplex=False, initialize=True)

# 创建触摸屏对象

touch = xpt2046(cs=25, spihost=VSPI_HOST, mosi=-1, miso=-1, clk=-1, cal_y0 = 423, cal_y1=3948)

# ------------------------------ 屏幕初始化操作 --stop------------------------

# 1. 创建显示screen对象。将需要显示的组件添加到这个screen才能显示

scr = lv.obj() # scr====> screen 屏幕

fs_drv = lv.fs_drv_t()

fs_driver.fs_register(fs_drv, 'S')

scr = lv.scr_act()

scr.clean()

# 2. 封装要显示的组件

class MyWidget():

    def __init__(self, scr,s,x,y,r1,r2,v1,v2,t1,t2,t3,t4): #尺寸,x轴偏移量,y轴偏移量,动画起始值,动画结束值,开始处蓝色区域最大值,结尾处红色区域最小值,上升时间,延时,下降时间,延时

        # 1. 创建仪表盘对象

        self.meter = lv.meter(scr)

        self.meter.align(lv.ALIGN.CENTER,x,y) # 居中(第1个0表示x的偏移量,第2个0表示相对于y的偏移量)

        self.meter.set_size(s, s) # width: s height: s

        # 2. 创建刻度线对象

        scale = self.meter.add_scale()

        # -------- 子刻度线 --------

        # 51:短线的个数

        # 1:短线宽度(单位像素)

        # 7:短线长度

        # 最后1个参数:颜色

        self.meter.set_scale_ticks(scale, 21, 1, 7, lv.palette_main(lv.PALETTE.GREY))

        # -------- 主刻度线 --------

        # 10: 多少个子刻度线显示1个主刻度线

        # 2: 宽度

        # 10: 长度

        # 下一个参数:颜色

        # 10: 文字与线的距离 10像素

        self.meter.set_scale_major_ticks(scale, 4, 2, 10, lv.color_black(), 5)

        # 3. 添加警示刻度线

        # 在起点添加蓝色弧

        blue_arc = self.meter.add_arc(scale, 1, lv.palette_main(lv.PALETTE.BLUE), 0)

        self.meter.set_indicator_start_value(blue_arc, r1)

        self.meter.set_indicator_end_value(blue_arc, v1)

        # 在刻度开始处使刻度线为蓝色

        blue_arc_scale = self.meter.add_scale_lines(scale, lv.palette_main(lv.PALETTE.BLUE), lv.palette_main(lv.PALETTE.BLUE), False, 0)

        self.meter.set_indicator_start_value(blue_arc_scale, r1)

        self.meter.set_indicator_end_value(blue_arc_scale, v1)

        # 在末端添加红色弧

        red_arc = self.meter.add_arc(scale, 1, lv.palette_main(lv.PALETTE.RED), 0)

        self.meter.set_indicator_start_value(red_arc, v2)

        self.meter.set_indicator_end_value(red_arc, r2)

        # 使刻度线在刻度末端变为红色

        red_arc_scale = self.meter.add_scale_lines(scale, lv.palette_main(lv.PALETTE.RED), lv.palette_main(lv.PALETTE.RED), False, 0)

        self.meter.set_indicator_start_value(red_arc_scale, v2)

        self.meter.set_indicator_end_value(red_arc_scale, r2)

        # 4. 仪表指针

        # 4: 宽度

        # 下一参数:颜色

        # -10:指针与刻度线距离

        self.indic = self.meter.add_needle_line(scale, 2, lv.palette_main(lv.PALETTE.GREY), -5)

        # 5. 创建动画对象

        a = lv.anim_t()

        a.init()

        a.set_var(self.indic)

        a.set_values(r1, r2)

        a.set_time(t1)

        a.set_repeat_delay(t2)

        a.set_playback_time(t3)

        a.set_playback_delay(t4)

        a.set_repeat_count(lv.ANIM_REPEAT_INFINITE)

        a.set_custom_exec_cb(self.set_value)

        lv.anim_t.start(a)

    def set_value(self, anmi_obj, value):

        """动画回调函数"""

        self.meter.set_indicator_value(self.indic, value)

# 3. 创建要显示的组件

Widget1=MyWidget(scr,105,55,0,0,100,15,85,550,50,350,50)#尺寸,x轴偏移量,y轴偏移量,动画起始值,动画结束值,开始处蓝色区域最大值,结尾处红色区域最小值,上升时间,延时,下降时间,延时

Widget2=MyWidget(scr,105,-55,0,0,100,15,85,650,50,450,50)

Widget3=MyWidget(scr,105,0,95,0,100,20,80,600,50,400,50)

Widget4=MyWidget(scr,105,0,-95,0,100,20,80,700,50,500,50)

# 4. 显示screen对象中的内容

lv.scr_load(scr)

# ------------------------------ 看门狗,用来重启ESP32设备 --start------------------------

try:

    from machine import WDT

    wdt = WDT(timeout=2000) # enable it with a timeout of 2s

    print("提示: 按下Ctrl+C结束程序")

    while True:

        wdt.feed()

        time.sleep(0.9)

except KeyboardInterrupt as ret:

    print("程序停止运行,ESP32已经重启...")

    time.sleep(10)

# ------------------------------ 看门狗,用来重启ESP32设备 --stop-------------------------

 

进度条动画程序

import lvgl as lv

import time

from espidf import VSPI_HOST

from ili9XXX import ili9341

from xpt2046 import xpt2046

import fs_driver

# ------------------------------ 屏幕初始化操作 --start------------------------

# 屏幕宽高

WIDTH = 240

HEIGHT = 320

# 创建显示屏对象

disp = ili9341(miso=19, mosi=23, clk=18, cs=5, dc=26, rst=27, power=14, backlight=-1, backlight_on=0, power_on=0, rot=0x80,

        spihost=VSPI_HOST, mhz=60, factor=16, hybrid=True, width=WIDTH, height=HEIGHT,

        invert=False, double_buffer=True, half_duplex=False, initialize=True)

# 创建触摸屏对象

touch = xpt2046(cs=25, spihost=VSPI_HOST, mosi=-1, miso=-1, clk=-1, cal_y0 = 423, cal_y1=3948)

# ------------------------------ 屏幕初始化操作 --stop------------------------

# 1. 创建显示screen对象。将需要显示的组件添加到这个screen才能显示

scr = lv.obj() # scr====> screen 屏幕

fs_drv = lv.fs_drv_t()

fs_driver.fs_register(fs_drv, 'S')

scr = lv.scr_act()

scr.clean()

# 2. 封装要显示的组件

class MyWidget():

    def __init__(self, scr,x,y,w,h,t1,t2): #x轴偏移量,y轴偏移量,宽度,高度,上升时间,下降时间

        # 1. 创建进度条对象

        self.bar = lv.bar(scr)

        # 2. 创建样式对象

        style_indic = lv.style_t()

        style_indic.init()

        style_indic.set_bg_opa(lv.OPA.COVER)

        style_indic.set_bg_color(lv.palette_main(lv.PALETTE.RED))

        style_indic.set_bg_grad_color(lv.palette_main(lv.PALETTE.BLUE))

        style_indic.set_bg_grad_dir(lv.GRAD_DIR.VER)

        # 3. 给进度条设置样式

        self.bar.add_style(style_indic, lv.PART.INDICATOR)

        self.bar.set_size(w, h)

        self.bar.set_range(-50,50)

        # 4. 创建动画对象

        anim_obj = lv.anim_t()

        anim_obj.init()

        anim_obj.set_var(self.bar)

        anim_obj.set_values(-50, 50)

        anim_obj.set_time(t1) # 设置从当前效果到指定效果的过度时间

        anim_obj.set_playback_time(t2) # 设置从指定效果到之前效果的过度时间

        anim_obj.set_repeat_count(lv.ANIM_REPEAT_INFINITE) # 设置重复

        anim_obj.set_custom_exec_cb(self.set_temp) # 设置动画回调函数

        lv.anim_t.start(anim_obj)

        # 5. 进度条放到中间

        self.bar.align(lv.ALIGN.CENTER,x,y) # 居中(第1个0表示x的偏移量,第2个0表示相对于y的偏移量)

    def set_temp(self, anim_obj, value):

        self.bar.set_value(value, lv.ANIM.ON)

# 3. 创建要显示的组件

Widget1=MyWidget(scr,-100,0,20,200,250,200) #x轴偏移量,y轴偏移量,宽度,高度,上升时间,下降时间

Widget2=MyWidget(scr,-60,0,20,220,300,200)

Widget3=MyWidget(scr,-20,0,20,240,350,200)

Widget4=MyWidget(scr,20,0,20,260,400,200)

Widget5=MyWidget(scr,60,0,20,280,450,200)

Widget6=MyWidget(scr,100,0,20,300,500,200)

# 4. 显示screen对象中的内容

lv.scr_load(scr)

# ------------------------------ 看门狗,用来重启ESP32设备 --start------------------------

try:

    from machine import WDT

    wdt = WDT(timeout=1000) # enable it with a timeout of 2s

    print("提示: 按下Ctrl+C结束程序")

    while True:

        wdt.feed()

        time.sleep(0.9)

except KeyboardInterrupt as ret:

    print("程序停止运行,ESP32已经重启...")

    time.sleep(10)

# ------------------------------ 看门狗,用来重启ESP32设备 --stop-------------------------

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: ESP32 移植 LVGL 需要使用 ESP-IDF 的支持,它提供了 ESP32 平台基本功能的驱动程序和配置文件。你可以按照 ESP-IDF 的官方文档,使用 ESP-IDF 的平台支持进行 LVGL 移植。 ### 回答2: ESP32是一款强大的微控制器,支持运行各种应用程序LVGL是一种开源的GUI库,可以轻松实现图形化界面。下面我将介绍如何在ESP32上移植LVGL。 首先,我们需要下载LVGL库的源代码。可以从官方网站或者GitHub上下载最新版本的LVGL库。 接下来,我们需要用到Arduino开发环境来编译和烧录代码。确保你已经安装了最新版本的Arduino开发环境,并且已经将ESP32开发板支持库安装。 然后,将LVGL源代码复制到你的Arduino项目文件夹中的一个子文件夹中。然后打开Arduino开发环境,找到你的项目文件夹并打开LVGL源代码文件夹。 在LVGL源代码文件夹中找到`lv_conf_template.h`文件,并将其复制为`lv_conf.h`文件。然后,打开`lv_conf.h`文件并根据你的需求进行配置。在配置文件中,你可以设置屏幕大小、颜色深度、字体等。 然后,在Arduino开发环境中打开ESP32的示例程序。找到一个空闲的示例程序,例如“Blink”示例程序,并将其复制为一个新的文件夹。 将LVGL源代码文件夹中的`lvgl`文件夹复制到ESP32示例程序文件夹中。 打开ESP32示例程序文件夹中的`platformio.ini`文件,并取消注释以下两行代码: ``` lib_ignore = ESP32_BLE_Arduino # lib_deps = ``` 然后,在`lib_deps =`后面添加以下代码: ``` ${env.LIBS_DIR}/lvgl ``` 保存并退出`platformio.ini`文件。 最后,编译和烧录ESP32示例程序。在Arduino开发环境中,选择正确的端口和开发板,并点击“编译并上传”按钮。完成后,你的ESP32就成功移植了LVGL,并可以使用LVGL库创建图形化界面了。 总之,移植LVGLESP32可以通过将LVGL源代码复制到你的项目文件夹中,配置LVGL并将其添加到ESP32示例程序中来实现。这样,你就可以在ESP32上轻松创建图形化界面了。 ### 回答3: ESP32是一款功能强大的微控制器,LVGL是一种用于嵌入式系统的开源图形库。要将LVGL移植到ESP32上,可以按照以下步骤进行操作: 1. 下载LVGL软件包:在LVGL官方网站上下载最新版本的LVGL软件包,并解压缩到ESP32开发环境的工作目录中。 2. 配置开发环境:打开ESP32的开发环境(如ESP-IDF或Arduino IDE),创建新的项目或打开现有的项目。 3. 配置LVGL:在ESP32的项目文件中,找到并打开LVGL的配置文件(如lv_conf.h)。根据项目的需求,设置LVGL的配置选项,如分辨率、颜色深度、绘制驱动等。 4. 添加LVGL的源代码:将LVGL的源代码文件添加到ESP32项目的源文件目录中。可以复制整个LVGL文件夹,或者将相关文件手动复制到项目目录。 5. 添加驱动程序:根据项目的显示设备,选择并添加相关的驱动程序LVGL支持多种显示设备和操作系统接口,如SPI、I2C、UART等。 6. 初始化LVGL:在ESP32程序中,添加LVGL的初始化函数。该函数负责初始化LVGL图形库,并配置所需的驱动程序。 7. 编写应用程序:根据项目的需求,在ESP32程序中编写LVGL应用程序。可以使用LVGL提供的各种图形元素和功能,如按钮、标签、文本框、进度条等。 8. 编译和烧录:将ESP32与计算机连接,并进行编译和烧录操作。确保所有的依赖文件和驱动程序都正确配置,并且LVGL的源代码能够正确编译。 9. 调试和优化:在ESP32上运行LVGL应用程序,并进行调试和优化。可以使用串口输出或者调试工具来查找和修复可能出现的问题。 10. 测试和部署:在完成调试和优化后,进行系统测试以及部署到实际项目中。 以上是将LVGL移植到ESP32的一般步骤,具体的细节和操作方式可能会因项目的需求和开发环境而有所不同。希望这些简要的说明可以帮助您成功地将LVGL移植到ESP32上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路易斯720

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值