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开发一 移植与例程 的相关文章

  • esp-idf的电源管理——电源管理组件

    1 电源锁和动态频率切换 1 1 什么是电源锁 先概括的介绍一下IDF电源管理组件中的电源锁与动态频率切换 对主机CPU有了解的都知道 像Intel的酷睿处理器有个睿频功能 CPU非常聪明 可以在繁忙 需要高性能 的时候抬高频率 在不忙的时
  • [ESP32]ESP32 Arduino BLE调试 / 与安卓蓝牙数据交互

    帖子导航 ESP32 ESP32 Arduino开发环境搭建 首先得有支持包吧 ESP32 BLE支持包 进入arduino IDE gt 文件 gt 首选项 gt 项目文件位置 到该路径下 打开git工具 项目地址 https githu
  • 【GUI】LVGL8内存泄漏分析

    LVGL版本 V8 0 2 平台 ESP32S3 在调试过程中 发现有两个界面 在重复退出再进入时内存会不断增加的吃内存现象 然后做了分析和研究 1 样式style吃内存 在主页面 进入simple页面 再退出到主页面 再次进入simple
  • ESP32串口不断输出rst:0x10 (RTCWDT_RTC_RESET),boot:0x13(SPI_FAST_FLASH_BOOT)且按BOOT键进不了下载模式

    错误现象 rst 0x10 RTCWDT RTC RESET boot 0x13 SPI FAST FLASH BOOT flash read err 1000 ets main c 371 ets Jun 8 2016 00 22 57
  • micropython Esp32 外接LED使用Thonny ValueError: pin can only be input解决办法

    micropython Esp32 外接LED使用Thonny ValueError pin can only be input解决办法 1 连接方式如下图 注意一定要加电阻 2 通过输入以下代码 报错 ValueError pin can
  • 【ESP32】VSCode添加驱动文件

    1 创建文件夹并添加驱动文件 2 修改main文件夹下的 CMakeLists txt
  • 【ESP-IDF】ESP32利用wifi联网(STA模式)

    1 AP和STA的含义 AP模式 Access Point模式 提供无线接入服务 允许其它无线设备接入 提供数据访问 STA模式 Station模式 类似于无线终端 sta本身并不接受无线的接入 它可以连接到AP设备 2 STA模式例程 官
  • ESP32调试笔记

    1 现象 上电后一直复位 rst 0x3 SW RESET boot 0x13 SPI FAST FLASH BOOT 原因 Flash烧录时 ota data和app0位置错了 解决 把ota data和app0位置烧录正确即可 位置从分
  • ESP32使用Arduino发布和订阅MQTT

    该项目展示了如何在ESP32上使用MQTT通信协议来发布消息和订阅主题 举例来说 我们会将BME280传感器的读数发布到Node RED仪表板 并控制ESP32输出 我们将使用Arduino IDE对ESP32进行编程 介绍 在此示例中 有
  • ESP32-WROOM-32UE无限重启解决方法

    一 环境 Arduino IDE ESP32 WROOM 32UE 二 问题描述 程序可以成功 但是串口打印会出现rst 0x3 SW RESET boot 0x16 SPI FAST FLASH BOOT 这样的提示 哪怕是将空程序下载进
  • ESP32-C3 应用 篇(实例二、通过蓝牙将传感器数据发送给手机,手机端控制 SK6812 LED)

    ESP32 C3 蓝牙部分我们学习了GATT 本文尝试使用蓝牙做一个简单的小应用 目录 前言 一 整体框架 二 数据传输部分 2 1 添加温湿度驱动组件 2 2 传感器数据传输程序 再次说明 ESP GATTS READ EVT 事件 2
  • ESP32引脚参考

    原文链接 ESP32引脚参考 您应该使用哪个GPIO引脚 360doc个人图书馆 总结的相当全面 ESP32简单易懂的GPIO使用注意事项 首先上图 GPIO建议列表 特别的在硬件上要注意使用外接模块时不能将GPIO12拉高 否则将导致ES
  • ESP32 的esp_http_client详解

    说明 我使用的是esp idf V3 1 3 官方给我们封装好了 HTTP 使用起来还是很方便 一 wifi连接 在main函数里面主要是做了wifi连接的初始化和HTTP任务的创建 如下是main的全部内容 void app main e
  • 在 esp32 上运行 lvgl + freetype

    前言 最近有个需求 如何在 esp32 上运行 lvgl freetype 这个想法的难点是 freetype 的环境搭建 我想将其做得非常简单 最好的办法是做成组件来使用 所以我将 freetype 的相关依赖做成了 esp idf 组件
  • 还是 “月饼” 后续,玩转炫彩 “月饼” 之 问题说明

    画一个 月饼 陪我过中秋 开发板后续问题跟进说明 目录 前言 一 出现问题 二 寻求办法 三 若有所思 四 问题测试 结语 悬赏送开发板 前言 本文有纯理论玩家是永远不会经历的实际问题 嵌入式工程师不动手永远出不了作品 本文最后有送开发板的
  • ESP32-AT指令学习笔记

    目录 前言 一 硬件和软件准备 二 使用步骤 1 下载固件 2 接线 总结 前言 针对 ESP32 芯片 实现了一些常用的 AT 指令集 链接地址为 ESP32 AT指令集 该指令集可用于用户 MCU PC 同 ESP32 进行交互 也适用
  • 【ESP32接入国产大模型之文心一言】

    1 怎样接入文心一言 随着人工智能技术的不断发展 自然语言处理领域也得到了广泛的关注和应用 在这个领域中 文心一言作为一款强大的自然语言处理工具 具有许多重要的应用价值 本文将重点介绍如何通过ESP32接入国产大模型之文心一言api 以及其
  • 【ESP32接入国产大模型之文心一言】

    1 怎样接入文心一言 随着人工智能技术的不断发展 自然语言处理领域也得到了广泛的关注和应用 在这个领域中 文心一言作为一款强大的自然语言处理工具 具有许多重要的应用价值 本文将重点介绍如何通过ESP32接入国产大模型之文心一言api 以及其
  • VSCode 上的 PlatformIO 未编译:collect2.exe:错误:ld 返回 1 退出状态

    我最近不得不擦拭我的计算机 在一切准备就绪并运行之后 是时候打开我之前正在处理的一些 ESP32 程序了 发现 VSCode 上的 Platform IO 将不再编译 运行编译器后 我收到以下错误 Compiling pio build e
  • ESP32:dsb1820 温度传感器给出恒定的负 127 读数

    我正在尝试使用连接到 esp32 微控制器的单个 dsb1820 温度传感器来获取温度读数 传感器连接到 esp32 的 GPIO 4 我打算将温度读数发送到云端 我面临的问题是温度读数总是给出值 127 我在网上某处读到 当 dsb182

随机推荐

  • 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 开箱即用 如有异议 欢迎留言指正 特性