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

news2024/12/26 9:18:07

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

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-------------------------

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/652452.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人机交互学习-6 交互式系统的设计

交互式系统的设计 设计框架定义外形因素和输入方法定义功能和数据元素决定功能组合层次勾画大致的设计框架构建关键情景场景剧本通过验证性的场景剧本来检查设计 设计策略删除组织隐藏转移简化设计策略的组合 设计中的折中个性化和配置本地化和国际化审美学与实用性 软件设计的…

Golang context 实现原理与源码分析

0 context入门介绍 context是Golang应用开发常用的并发控制技术,主要在异步场景中用于实现并发协调以及对 goroutine 的生命周期控制,它与WaitGroup最大的不同点是context对于派生goroutine有更强的控制力,它可以控制多级的goroutine。 con…

DataGrip使用技巧

DataGrip介绍 DataGrip是JetBrains提供的面向开发人员的数据库管理产品。提供智能查询控制台、高效的架构导航、智能SQL补全等功能。 同类的产品有navicat、dbeaver。本文中使用的DataGrip版本为2023.1 显示数据库其他类型的数据库结构 DataGrip中如果某类型数据库结构数量为…

GaussDB单SQL性能慢分析

文章目录 问题描述问题现象告警单SQL性能慢分析步骤一:确定目标SQL步骤二:收集统计信息、提前排除影响步骤三:分析SQL性能瓶颈 单SQL性能慢-视图分析流控导致慢SQL并发锁冲突导致慢SQL表膨胀导致大量的死元组业务语句不优、计划不优 问题描述…

8自由度并联腿机器狗实现姿态平衡

1. 功能说明 本文示例将实现8自由度并联腿机器狗保持姿态平衡的功能,当机器狗在一个平台上原地站立,平台发生倾斜时,机器狗能够自动调整姿态,保证背部水平。 2. 机器狗的稳定性分析 稳定性是机器狗运动中很重要的一部分&#xff0…

Leetcode | 35 搜索插入位置

35 搜索插入位置 文章目录 35 搜索插入位置题目我的思路[官方题解](https://leetcode.cn/problems/search-insert-position/solutions/333632/sou-suo-cha-ru-wei-zhi-by-leetcode-solution/ "官方题解")欢迎关注公众号【三戒纪元】 题目 给定一个排序数组和一个目标…

Rocky linux 9.0系统安装MySQL5.7

前言 本文将带你在Rocky linux 9.0上折腾一个MySQL5.7, 说干就干。 文章目录 前言安装环境下载mysql 包开始安装启动测试总结 安装环境 删除系统中可能存在的包: [rootmufeng ~]# rpm -qa |grep mysql [rootmufeng ~]# rpm -qa |grep mariadb [rootmu…

Ansible概述和模块解释

Ansible概述 Ansible介绍 Ansible是一个基于Python开发的配置管理和应用部署工具,现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点,Pubbet和Saltstack能实现的功能,Ansible基本上都可以实现。 Ansible能做什么 Ansible能…

Linux---详细讲解linux计算机体系结构

前言 Linux是一种开源的操作系统,它的核心思想是基于冯诺依曼体系结构。在本文中,我们将深入探讨Linux的基本原理和操作系统的概念。 Linux是一款基于Unix操作系统的开源软件,它的核心是由Linus Torvalds在1991年开发的。Linux的出现&#x…

认识 Vue.js

node版本管理工具 nvm - 简书 Vue介绍 Vue.js(简称Vue) 是一套用于构建用户界面的渐进式前端框架。(其实就是使用js开发的一个框架) Vue.js 核心实现 : 响应式的数据绑定:当数据发生改变,视图可以自动更新,不用关心D…

「有问必答」Go如何优雅的对时间进行格式化?

昨天 交流群 关于「Go如何优雅的对时间进行格式化?」展开了讨论: 咋搞捏? 如何在不循环的情况下,把列表数据结构体的时间修改为咱们习惯的格式,而不是UTC模式 我们要实现的效果如下: created_at 是go语言原生的方式&#xff0…

Android Framework分析Zygote进程的启动过程

Zygote进程是Android系统中的一个重要进程,其主要作用是预热Java虚拟机和启动应用进程。本文将着重分析Zygote进程的启动过程,结合代码注释和示例代码,让读者更好地理解Zygote的内部工作原理。 Zygote进程的启动过程 Zygote进程的启动过程包…

Python3 里面的四舍五入

目录 1.一般的四舍五入 : 使用内置的round函数 1.1官方文档: 1.2 举例说明: 2.python3里的格式化输出 format 2.1 记忆法则 :填齐宽 逗精类 2.2 format实质就是通过设置精度间接使用了等效round函数,但是不要把格式化输出和四…

chatgpt赋能python:Python是如何帮助确定location的?

Python是如何帮助确定location的? 什么是location? 在SEO中,location指的是特定页面、文章或者商铺在搜索结果中的排名位置。通常来说,更高的location意味着更多的点击率和流量,因此在SEO中,确定location…

独立站思考:Facebook选品测品

导语:对于独立站而言,获取稳定的流量是至关重要的。本文将探讨如何利用Facebook的选品测品功能,精准找到用户并提高点击率,以及如何通过数据分析优化,提高转化率并快速产生订单。 第一部分:精准定位用户的方…

Nodejs五、Express

零、文章目录 Nodejs五、Express 1、初识 Express (1)Express 简介 Express是什么 官方给出的概念:Express 是基于 Node.js 平台,快速、开放、极简的 Web 开发框架。 通俗的理解:Express 的作用和 Node.js 内置的 …

Swift 5.9 有哪些新特性(一)

文章目录 前言if 和 switch 表达式Value 和 Type 参数包 前言 虽然 Swift 6 已经在地平线上浮现,但 5.x 版本仍然有很多新功能-更简单的 if 和 switch 用法、宏、非可复制类型、自定义 actor 执行器等等都将在 Swift 5.9 中推出,再次带来了一个巨大的更…

矩阵补全文献汇总

[1] Nguyen L T , Kim J , Shim B .Low-Rank Matrix Completion: A Contemporary Survey[J].IEEE Access, 2019, PP(99):1-1.DOI:10.1109/ACCESS.2019.2928130. 几根棒子的一篇工作。基本结构可以借鉴。 适用于秩未知的矩阵补全文献汇总 [1] Fornasier M , Rauhut H , Ward…

报表岗位如何快速升职加薪?卷的心态要放平,工具要选对!

最近下班时一直看到做报表的部门每个人埋头苦干,不用说,这是又在忙半年度报告了。 现在,报表内卷现象十分严重,大家可能用的是一样的数据集,虽说每个人输出的报告可能结果差异不大,但懂得怎么利用工具&…

在HR眼里,IE证书早就不值钱了

大家好,我是老杨。 最近项目实在是忙,内容都写的少了一些,真的是有点力不从心的意思,人年纪大了,比不起当初年轻的自己了 和同事领导在一块儿的时间越多,就免不了聊到今年的就业环境。 我不提&#xff0…