ESP32 LVGL开发一 移植与例程

2023-11-02

简介

LVGL(轻量级和通用图形库)是一个免费和开源的图形库,提供UI通信元素的构建接口与较低资源实现的源码,适用于快速开发UI图形交互页面的应用

官方已经适配了ESP32硬件平台,库版本为v7.11,开箱即用
如有异议,欢迎留言指正

特性
  • 强大的构建块,例如按钮、图表、列表、滑块、图像等。
  • 带有动画、抗锯齿、不透明度、平滑滚动的高级图形
  • 各种输入设备,如触摸板、鼠标、键盘、编码器等。
  • 多语言支持 UTF-8 编码多显示器
  • 支持,即同时使用多个 TFT、单色显示器
  • 具有类似 CSS 样式的完全可定制的图形元素
  • 独立于硬件:与任何微控制器或显示器一起使用
  • 可扩展:能够以很少的内存运行(64 kB Flash,16 kB RAM)
  • 支持但不要求操作系统、外部存储器和 GPU
  • 即使具有高级图形效果,也可进行单帧缓冲区操作
  • 用 C 编写以获得最大的兼容性(C++ 兼容)
  • 在没有嵌入式硬件的 PC 上启动嵌入式 GUI 设计的模拟器
  • 绑定到 MicroPython快速 GUI 设计的教程、示例、主题
  • 文档可在线获取并以 PDF 格式
  • 提供在 MIT 许可下免费和开源
硬件要求
名称 最小配置 建议配置
架构 支持16位、32位、64位
时钟 >16 MHz >48 MHz
Flash/ROM >64 kB >180 kB
静态 RAM >2 kB >4 kB
栈空间 >2 kB >8 kB
堆空间 >2 kB >8 kB
显示缓存 “水平分辨率”像素(建议 > 1× “水平分辨率” ) “水平分辨率”像素(建议 > 10× “水平分辨率” )
编译器 C99 或更新版本
软件源码
系统框架

在这里插入图片描述

源码下载

建议IDF使用v4.0以上版本,github仓库地址,克隆到本地并同步子模块

工程结构
  • lvgl:核心图像库
  • lv_drivers:适配显示驱动,适配了主流芯片方案的驱动代码
  • lv_examples:例程代码,内部提供了刷屏与压测的实例
工程配置

使用命令配置工具idf.py menuconfig,通过Kconfig文件,来适配具体的硬件与例程的选择

  • 适配控制器驱动:路径Componenet config-->LVGL TFT Display controller,选择驱动与适配PIN脚
    在这里插入图片描述

  • 修改分辨率与颜色深度:路径Componenet config-->LVGL configuration
    在这里插入图片描述

  • 触摸控制器:路径Componenet config-->LVGL Touch controller,不带触摸的选None
    在这里插入图片描述

  • 选择实例demo:路径Componenet config-->LVGL Touch controller,可以选择需要演示的例程
    在这里插入图片描述

处理流程

在这里插入图片描述

代码解读
  • app_main入口中创建了guiTask任务,截取guiTask内部分代码
    xGuiSemaphore = xSemaphoreCreateMutex();//创建互斥变量(限制多线程的访问lvgl接口)
    lv_init(); //初始化 lvgl 库
    lvgl_driver_init(); //初始化驱动(SPI、IIC总线)
    
    lv_color_t* buf1 = heap_caps_malloc(DISP_BUF_SIZE * sizeof(lv_color_t), MALLOC_CAP_DMA);//开辟支持dma服务的缓存
    assert(buf1 != NULL);
//双缓存
#ifndef CONFIG_LV_TFT_DISPLAY_MONOCHROME
    lv_color_t* buf2 = heap_caps_malloc(DISP_BUF_SIZE * sizeof(lv_color_t), MALLOC_CAP_DMA);
    assert(buf2 != NULL);
#else
    static lv_color_t *buf2 = NULL;
#endif

    static lv_disp_buf_t disp_buf;//lvgl显示缓存区
    lv_disp_buf_init(&disp_buf, buf1, buf2, size_in_px);//初始化工作缓存区

    lv_disp_drv_t disp_drv;
    lv_disp_drv_init(&disp_drv); 
    disp_drv.flush_cb = disp_driver_flush;//刷屏实现接口
 
 //触摸控制器
 #if CONFIG_LV_TOUCH_CONTROLLER != TOUCH_CONTROLLER_NONE
    lv_indev_drv_t indev_drv;
    lv_indev_drv_init(&indev_drv);
    indev_drv.read_cb = touch_driver_read;
    indev_drv.type = LV_INDEV_TYPE_POINTER;
    lv_indev_drv_register(&indev_drv);
#endif

    //创建软定时器, 内部实现 lv_tick_inc定时,处理相关lvgl任务操作
    const esp_timer_create_args_t periodic_timer_args = {
        .callback = &lv_tick_task,
        .name = "periodic_gui"
    };
    esp_timer_handle_t periodic_timer;
    ESP_ERROR_CHECK(esp_timer_create(&periodic_timer_args, &periodic_timer));
    ESP_ERROR_CHECK(esp_timer_start_periodic(periodic_timer, LV_TICK_PERIOD_MS * 1000));
    //具体应用
    create_demo_application();
    while (1) 
    {
        /* Delay 1 tick (assumes FreeRTOS tick is 10ms */
        vTaskDelay(pdMS_TO_TICKS(10));
        /* Try to take the semaphore, call lvgl related function on success */
        if (pdTRUE == xSemaphoreTake(xGuiSemaphore, portMAX_DELAY))//获取互斥信号 
        {
            lv_task_handler(); //lv任务处理器
            xSemaphoreGive(xGuiSemaphore); //是否互斥信号
        }
    }
  • 运行应用函数lv_demo_widgets,例程执行了小部件动画的演示
void lv_demo_widgets(void)
{
    tv = lv_tabview_create(lv_scr_act(), NULL); //创建表格对象tv
//主题设置
#if LV_USE_THEME_MATERIAL
    if(LV_THEME_DEFAULT_INIT == lv_theme_material_init) {
        lv_disp_size_t disp_size = lv_disp_get_size_category(NULL);
        if(disp_size >= LV_DISP_SIZE_MEDIUM) {
            lv_obj_set_style_local_pad_left(tv, LV_TABVIEW_PART_TAB_BG, LV_STATE_DEFAULT, LV_HOR_RES / 2);
            lv_obj_t * sw = lv_switch_create(lv_scr_act(), NULL);
            if(lv_theme_get_flags() & LV_THEME_MATERIAL_FLAG_DARK)
                lv_switch_on(sw, LV_ANIM_OFF);
            lv_obj_set_event_cb(sw, color_chg_event_cb);
            lv_obj_set_pos(sw, LV_DPX(10), LV_DPX(10));
            lv_obj_set_style_local_value_str(sw, LV_SWITCH_PART_BG, LV_STATE_DEFAULT, "Dark");
            lv_obj_set_style_local_value_align(sw, LV_SWITCH_PART_BG, LV_STATE_DEFAULT, LV_ALIGN_OUT_RIGHT_MID);
            lv_obj_set_style_local_value_ofs_x(sw, LV_SWITCH_PART_BG, LV_STATE_DEFAULT, LV_DPI/35);
        }
    }
#endif

    t1 = lv_tabview_add_tab(tv, "Controls");//新增tv1表格控件
    t2 = lv_tabview_add_tab(tv, "Visuals"); //新增tv2表格控件
    t3 = lv_tabview_add_tab(tv, "Selectors");//新增tv3表格控件

   //初始化box样式与位置
    lv_style_init(&style_box); 
    lv_style_set_value_align(&style_box, LV_STATE_DEFAULT, LV_ALIGN_OUT_TOP_LEFT);
    lv_style_set_value_ofs_y(&style_box, LV_STATE_DEFAULT, - LV_DPX(10));
    lv_style_set_margin_top(&style_box, LV_STATE_DEFAULT, LV_DPX(30));

    controls_create(t1);//创建t1对象具体的组件
    visuals_create(t2); //创建t2对象具体的组件
    selectors_create(t3);//创建t3对象具体的组件

#if LV_DEMO_WIDGETS_SLIDESHOW
    lv_task_create(tab_changer_task_cb, 8000, LV_TASK_PRIO_LOW, NULL);//创建动画切换刷新任务
#endif
}
对象结构lv_obj_t

在LVGL中,用户接口的基础构建块是对象(面向对象的编程思想),比如button、lable、image,通过lv_obj_t定义具体的属性,组件子类可继承父类对象
在这里插入图片描述

运行效果

在这里插入图片描述

LVGL官方文档下载
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ESP32 LVGL开发一 移植与例程 的相关文章

  • ESP32(MicroPython)四轮差速底盘遥控

    本项目主控改为ESP32 C3 沿用之前的L298N电机驱动 12 6v 18650电池组 LM7805降压模块的方案 电机改用1 19减速比的 使用130mm车轮 主要考虑越野用途 遥控方面 本项目使用HC 14模块 实测连接到电脑可以通
  • 深入分析 ESP32 的 WiFi 状态机

    本工程已托管到 GitHub 具体路径是 https github com tidyjiang8 esp32 projects tree master sta 在前一篇博客 让 ESP32 连接到你的 WiFi 热点 中 我们已经简单地分析
  • 在ESP32/ESP8266上使用MicroPython利用MQTT发布BME280传感器数据(温度,湿度和压力)

    了解如何使用MicroPython对ESP32或ESP8266板进行编程 以通过MQTT将BME280传感器读数 温度 湿度和压力 发布到支持MQTT或任何MQTT客户端的任何平台 例如 我们将传感器读数发布到Node RED仪表板 注意
  • ESP32s3 MSC/U盘 虚拟串口

    ESP32s3 MSC U盘 虚拟串口 开发环境是 IDF4 4 芯片 esp32s3 在项目中想要用到把内部的FLASH做成U盘 但是在idf4 4中没有找到MSC相关例程 如图 1 我在网上只找到esp32s2的例程 https git
  • ESP32+Arduino环境搭建教程 合宙ESP32C3

    1 在arduino官网下载安装包并安装 下载地址 https www arduino cc en software 2 安装Arduino对ESP32支持 1 添加ESP32开发板管理器地址 点击文件 gt 首选项 gt 其他开发板管理器
  • 常用的免费Api接口网址

    收录一下常用的免费Api接口 记录参考 具体使用请自行前往查看 和风天气 https dev qweather com docs api 天气预报 https www juhe cn docs api id 73 手机号码归属地 https
  • ESP32 ADC –使用Arduino IDE读取模拟值

    本文介绍了如何使用Arduino IDE通过ESP32读取模拟输入 模拟读取对于从电位计或模拟传感器等可变电阻读取值非常有用 模拟输入 ADC ADC是非线性的 analogRead 函数 其他有用的功能 使用ESP32从电位计读取模拟值
  • 【ESP-IDF】ESP32利用wifi联网(STA模式)

    1 AP和STA的含义 AP模式 Access Point模式 提供无线接入服务 允许其它无线设备接入 提供数据访问 STA模式 Station模式 类似于无线终端 sta本身并不接受无线的接入 它可以连接到AP设备 2 STA模式例程 官
  • ESP32-WROOM-32UE无限重启解决方法

    一 环境 Arduino IDE ESP32 WROOM 32UE 二 问题描述 程序可以成功 但是串口打印会出现rst 0x3 SW RESET boot 0x16 SPI FAST FLASH BOOT 这样的提示 哪怕是将空程序下载进
  • ESP32引脚参考

    原文链接 ESP32引脚参考 您应该使用哪个GPIO引脚 360doc个人图书馆 总结的相当全面 ESP32简单易懂的GPIO使用注意事项 首先上图 GPIO建议列表 特别的在硬件上要注意使用外接模块时不能将GPIO12拉高 否则将导致ES
  • 自制教学用ESP32开发板【ESP32_Py_Board】① 开发环境搭建

    摘要 由于教学需要 自己设计了一款ESP32开发板 用于 短距离无线通信 课堂教学使用 开发板整体效果如下图 该开发板采用Type C接口供电 板载CH340K串口芯片 支持自动下载 240 240全彩SPI接口显示屏 温度传感器DS18B
  • ESP32-C3 应用程序的启动流程

    网上说明一大堆 基本是官网文档复制没有额外解释 对于ESP32 C3的 risc v 内核 是我选择他的原因之一 了解芯片上电后的启动流程 有利于我们更加深入理解芯片 目录 前言 一 应用程序启动阶段 1 1 app main c 1 2
  • esp32 CMT130-V1.0 PS 240*240屏幕使用方法实验

    1 安装好Arduino 1 8 13 注意尽量不要大于1 8的版本 2 安装esp32驱动代码并且配置 3 esp32选择波特率 921600 4 选择频率 80MHZ 5 具体连线总结 6 需要在Arduino库管理中心下载TFT eS
  • SimpleFOC无刷电机平衡小车

    前言 本科毕业于自动化 期间学习了各种电机运动控制原理 自动控制原理 但是只会考试而未究其理 最近接触到simplefoc这个基于arduino的开源无刷电机驱动库 想正好借此机会将本科学到的内容用于实际 于是就有了这个小项目 基于无刷电机
  • 解决VSCode中查看ESP32日志乱码

    问题现象 在VSCode的Monitor中查看ESP32输出的日志乱码 如下图 原因 在VSCode中IDF默认的Monitor串口波特率为460800 然而ESP32输出Log的串口波特率默认为115200 因串口波特率不匹配导致Moni
  • ESP32-CAM配置开发环境并烧录程序运行

    环境准备 ESP32 CAM开发板 烧录器 摄像头和一根USB线束连接电脑即可 Arduino下载完成后打开 不同版本的菜单栏可能稍微不同 仔细找即可 选择下面的选项 联网自动下载ESP32 CAM的 环境 端口和当前的一致即可 正常连接应
  • 【自用】无法通过ESP32创建HomeAssistant实体问题解决(MQTT对ESP32创建实体请求无应答)

    一 问题描述 1 使用 MQTTX 测试客户端能够创建实体 当通过 MQTTX 发送注册实体请求的时候 实体能够在 MQTT 服务器中注册成功 2 使用 ESP32 无法创建实体 在ESP32中通过 publish 函数发送注册请求的时候
  • ESP-IDF库开发教程之(4)--FLASH、BootLoader和FreeRTOS

    在之前的文章中 我描述了新的esp32芯片 并解释了如何设置开发环境 包括使用一种可选的图形IDE Eclipse 在开始开发程序之前 您需要了解框架的三个关键组件 flash bootloader和FreeRTOS操作系统 但别担心 在本
  • ESP32 httpd:标头字段太长,服务器无法解释

    我想流式传输到 Android 应用程序内的 WebView 我的代码是 WebView cam WebView findViewById R id Cam cam getSettings setLoadWithOverviewMode t
  • ESP32 Arduino-ide如何获取唯一id

    我试图自动为每个 esp32 设置一个唯一的 id 在我使用提供该方法的 ESP IDF 框架对设备进行编程之前esp efuse mac get default 这将返回一个 8 字节值 该值在我手上的所有设备上都是唯一的 在arduin

随机推荐

  • python导入包失败ModuleNotFoundError: No module named 'matplotlib.pyplot'; 'matplotlib' is not a package

    最近在看 python 在使用matplotlib进行绘图时 提示 ModuleNotFoundError No module named matplotlib pyplot matplotlib is not a package 怎么回事
  • pytorch9-微调VGG16网络(基于kaggle数据集识别10种猴)

    import hiddenlayer as hl import torch import torch nn as nn from torch optim import SGD Adam import torch utils data as
  • 使用auth_request做权限控制

    网上很多如标题的文章 为何我还要写呢 网上一搜一大堆对我来说完全没用的文章 或者直接nginx官网复制过来 看得我贼无语 我的需求是校验参数是拼接到链接后面 而不是请求头的 网上大部分都是通过请求头来获取校验参数 开启auth reques
  • postman测试websocket接口(带鉴权)

    postman测试websocket接口 带鉴权 文章目录 postman测试websocket接口 带鉴权 1 前言 2 无用户鉴权情况下 3 有用户鉴权的情况下 4 最后 1 前言 目前开发实时日志推送 确认了两个方案 一个是通过tra
  • windows和linux下的c语言/网络/网络编程面试题收集[更新:2006.6.8]

    以下试题和答案均由 明天去要饭 从网上收集 仅供参考 如果发现错误或有更好的答案请回复 本人将对答案进行更新 基础部份 1 下列程序在32位linux或unix中的结果是什么 func char str printf d sizeof st
  • IDEA的DEBUG

    先认识一下DEBUG面板 先讲讲右侧的几个功能 12 Show Execution Point Alt F10 跳转到程序正在执行的地方 当浏览其他地方的代码后忘记程序执行到哪了或找起来麻烦时相当实用 13 Step Over F8 下一步
  • 多个组件的生命周期执行顺序

    多个组件的生命周期顺序 1 单个组件生命周期执行顺序 从官方文档上我们可以看出单个组件的生命周期顺序 beforeCreate created beforeMount mounted 2 多个组件的生命周期顺序 1 父组件与子组件 验证步骤
  • Linux中在Eclipse中远行tomcat失败

    Could not load the Tomcat server configuration 现象 启动tomcat时提示 Could not load the Tomcat server configuration at Servers
  • React使用antd实现可编辑单元格

    import React useContext useState useEffect useRef from react import Input Form from antd import Table from com Table imp
  • Flutter中的方法回调备忘

    类似于Android中的Callback iOS中的block 大致思路是一样的 需要自定义一个函数或者使用官方自己的也行 直接上代码 先写一个按钮点击事件 然后监听点击事件 备忘 onPress 和 onPress 特别需要注意 在wid
  • mysqld: Can‘t read dir of ‘/etc/mysql/conf.d/‘ (Errcode: 13 - Permission denied)

    今天用docker去运行mysql的时候 一直existing 输入 docker logs 镜像ID的时候发现报了mysqld Can t read dir of etc mysql conf d Errcode 13 Permissio
  • X-CSRF-Token

    Odata服务HTTP测试总是出现烦人的 CSRF token validation failed for all modifying requests 忽略下图中的报文错误 怀疑是服务器参数的设置问题 临时应急的话可以先针对这个服务把CS
  • Tars- zipkin环境本地搭建

    该图片引用于它处 https blog csdn net u012394095 article details 94389644 1 下载opentracing cpp 客户端调用的代码 网址为 opentraceing cpp 注意要下稳
  • 离散数学期末复习

    第一章 命题逻辑 联结词 蕴涵的注意事项 公式的层次 单个命题公式为0公式 等值演算的公式 范式 1 简单合取式 简单析取式 2 极小项 由简单合取式构成 m0 极大项 由简单析取式 构成 M0 奎因 莫可拉斯基方法求最简展开式 1 找极小
  • C语言笔记(二)

    基础 1 进制问题 1 1 二进制 1 2 ASCII 1 3 k进制转换为十进制 1 4 十进制转换为k进制 2 输入输出 3 逻辑运算符 4 运算符优先级 5 switch分支语句 6 字符串查找strchr函数 1 进制问题 1 1
  • 工作和生活中,如何用项目管理思维解决复杂的事情?

    在工作和生活中 许多事情都可以采用项目思维方式来解决 当我们逐渐将工作和生活中的各种事务以项目的方式来处理和推进时 我们可能并没有意识到 实际上我们正在运用项目管理思维 项目管理思维能帮助我们在面对繁杂事务时 理清思路 考虑周全 明确行动
  • 《程序员的自我修养—链接、装载与库》

    程序员的自我修养 链接 装载与库 读书笔记 本文为记录笔记 大部分内容为书中的摘抄 作者微博 MTK 蛙蛙鱼 写作时间 2013年11月18日 更新时间 2014年02月18日 编译和链接 2 1 被隐藏了的过程 预编译 cpp or gc
  • 蓝桥BASIC-18 矩形面积交 思路分析

    问题描述 平面上有两个矩形 它们的边平行于直角坐标系的X轴或Y轴 对于每个矩形 我们给出它的一对相对顶点的坐标 请你编程算出两个矩形的交的面积 输入格式 输入仅包含两行 每行描述一个矩形 在每行中 给出矩形的一对相对顶点的坐标 每个点的坐标
  • Qt开发上位机软件建立经典蓝牙通讯

    Qt开发上位机软件建立经典蓝牙通讯 之前做了一个具有经典蓝牙通讯功能的Windows上位机软件 在网上学习了相关博客以及参考了官方经典蓝牙例程之后 总结出了使用Qt建立经典蓝牙通讯的步骤 附带相关源码 作为分享 开发环境 我使用的Qt版本是
  • ESP32 LVGL开发一 移植与例程

    简介 LVGL 轻量级和通用图形库 是一个免费和开源的图形库 提供UI通信元素的构建接口与较低资源实现的源码 适用于快速开发UI图形交互页面的应用 官方已经适配了ESP32硬件平台 库版本为v7 11 开箱即用 如有异议 欢迎留言指正 特性