在esp32中使用lvgl(基于esp-idf)

开发环境:esp-idf

MCU:ESP32

TFT屏幕:ST7796

触摸驱动:XPT2046

LVGL版本:8.4

PS:因为移植v9版本失败了,所以换回来v8了,但是用到的包似乎已经很久没有维护了

需要的资料

1.LVGL源码包下载地址

lvgl/lvgl • v8.4.0 • ESP Component Registry (espressif.com)icon-default.png?t=N7T8https://components.espressif.com/components/lvgl/lvgl/versions/8.4.0?language=en

2.lvgl_esp32_drivers包下载地址

lvgl/lvgl_esp32_drivers at 9fed1cc47b5a45fec6bae08b55d2147d3b50260c (github.com)icon-default.png?t=N7T8https://github.com/lvgl/lvgl_esp32_drivers/tree/9fed1cc47b5a45fec6bae08b55d2147d3b50260c

基本构建

1.在工程根目录中先创建components,然后将下载好的LVGL源码包跟驱动包复制到components文件夹下面,然后在idf中输入idf.py menuconfig构建工程

mkdir components
idf.py menuconfig

2.在这里开始配置屏幕的显示驱动以及触摸驱动(图片上方有路径

同时在这里还可以配置屏幕的引脚以及翻转、背光等等,根据自己的需求配置,对触摸的触动配置同理。配置完保存退出。

LVGL接入显示驱动以及触摸驱动

轮子已经是包体给我们造好的了,我们要做的工作是将他们提供的接口接入到LVGL里面去,这里可以参照LVGL的示例,具体路径为components\lvgl\examples,

lv_port_disp_template.c是显示驱动的接入示例

lv_port_indev_template.c是触摸驱动的接入示例

1.在lvgl_helper.h这个文件中添加一下宏定义,这是屏幕的分辨率

#define LV_HOR_RES_MAX      320
#define LV_VER_RES_MAX      480

2.参考示例文件写自己的驱动函数

static void my_touch_init(void)
{
    //xpt2046_init();                 //触摸配置
    
    //添加触摸到lvgl
    static lv_indev_drv_t indev_drv;
    lv_indev_drv_init( &indev_drv );
    indev_drv.type = LV_INDEV_TYPE_POINTER;
    indev_drv.read_cb = xpt2046_read;
    lv_indev_drv_register( &indev_drv );
}

static void my_disp_init(void)
{
    lvgl_driver_init();                 //TFT驱动初始化

        /* Example for 1) */
    static lv_disp_draw_buf_t draw_buf_dsc_1;
    static lv_color_t buf_1[LV_HOR_RES_MAX * 10];                          /*A buffer for 10 rows*/
    lv_disp_draw_buf_init(&draw_buf_dsc_1, buf_1, NULL, LV_HOR_RES_MAX * 10);   /*Initialize the display buffer*/

    // /* Example for 2) */
    // static lv_disp_draw_buf_t draw_buf_dsc_2;
    // static lv_color_t buf_2_2[LV_HOR_RES_MAX * 10];                        /*An other buffer for 10 rows*/
    // lv_disp_draw_buf_init(&draw_buf_dsc_2, buf_2_1, buf_2_2, LV_HOR_RES_MAX * 10);   /*Initialize the display buffer*/

    /* Example for 3) also set disp_drv.full_refresh = 1 below*/
    // static lv_disp_draw_buf_t draw_buf_dsc_3;
    // static lv_color_t buf_3_1[LV_HOR_RES_MAX * LV_HOR_RES_MAX];            /*A screen sized buffer*/
    // static lv_color_t buf_3_2[LV_HOR_RES_MAX * LV_HOR_RES_MAX];            /*Another screen sized buffer*/
    // lv_disp_draw_buf_init(&draw_buf_dsc_3, buf_3_1, buf_3_2,
    //                       LV_HOR_RES_MAX * LV_VER_RES_MAX);   /*Initialize the display buffer*/

    /*-----------------------------------
     * Register the display in LVGL
     *----------------------------------*/

    static lv_disp_drv_t disp_drv;                         /*Descriptor of a display driver*/
    lv_disp_drv_init(&disp_drv);                    /*Basic initialization*/

    /*Set up the functions to access to your display*/

    /*Set the resolution of the display*/
    disp_drv.hor_res = LV_HOR_RES_MAX;
    disp_drv.ver_res = LV_VER_RES_MAX;

    /*Used to copy the buffer's content to the display*/
    disp_drv.flush_cb = st7796s_flush;

    /*Set a display buffer*/
    disp_drv.draw_buf = &draw_buf_dsc_1;

    /*Required for Example 3)*/
    //disp_drv.full_refresh = 1;

    /* Fill a memory array with a color if you have GPU.
     * Note that, in lv_conf.h you can enable GPUs that has built-in support in LVGL.
     * But if you have a different GPU you can use with this callback.*/
    //disp_drv.gpu_fill_cb = gpu_fill;

    /*Finally register the driver*/
    lv_disp_drv_register(&disp_drv);
}

注意这里根据自己的屏幕来改动

indev_drv.read_cb = xpt2046_read;
    disp_drv.hor_res = LV_HOR_RES_MAX;
    disp_drv.ver_res = LV_VER_RES_MAX;

    /*Used to copy the buffer's content to the display*/
    disp_drv.flush_cb = st7796s_flush;

总结:

因为移植这个踩了很多坑,分享一下自己的移植思路。首先要明确自己的显示驱动以及触摸驱动,这个可以通过idf的组件管理器来查找相对应的驱动,找不到也没关系,驱动写的都差不多,一般改一下那个初始化的命令码就可以用起来了。

成功驱动显示以及触摸之后,就去找LVGL接入驱动的API,根据示例文件改一下就可以了。

ESP32 ESP-IDF LVGL 是一种用于嵌入式系统的开发框架,LVGL 则是一个用于创建嵌入式图形界面的开源图形库。关于视频流的处理,可以通过调用 ESP-IDF 的函数来实现。在这个项目,作者使用了 JPEG 流封装 AVI 视频的方法,将实时读取的图片写入 AVI 文件,并保存到 SD 卡。通过调用相关函数,如 `jpeg2avi_start`、`jpeg2avi_add_frame` 和 `jpeg2avi_end`,可以实现将一帧帧的图片构成的视频保存下来。这个方法结合了作者原理的讲解和详细的代码示例,非常值得参考和感谢作者原野追逐的贡献。在这个项目ESP32 通过 LVGL 图形库提供的界面,可以实时读取摄像头数据,并将视频流传输到网页上,同时将读取的图片写入 SD 卡的 AVI 文件。然而,由于 ESP32 的处理能力有限,同时完成读取摄像头数据、传输到网页、写入 SD 卡这三个功能对其来说是一项挑战。在测试,视频流的帧率较低,不够流畅。因此,需要进行性能优化或者考虑其他解决方案来改善视频流的流畅度。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [VScode+esp-idf:例程(esp32-web-camera)保存视频到sd卡(附源码)](https://blog.csdn.net/hwd00001/article/details/126679619)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值