LVGL UI 库(TODO)

17 篇文章 0 订阅
2 篇文章 0 订阅

 这个TODO是5月的,一直没弄,就是想等嵌入式的环境搭建起来。。。没想到耗时这么久。。。

还是老规矩,先上图。。。

整体来说还是接着以前的,之前在树莓派上弄通了ST7735的驱动,framebuffer,现在终于能来看GUI了。

树莓派3B驱动ST7735(内核)(Framebuffer篇)(TODO)-CSDN博客

现在的图形接口好像很多,Framebuffer只是其中之一,而且还是比较老的性能不行。好一点的还有SDL,DRM,DirectFB,WayLand。有时间和精力还真想都看看,可惜现在并没有。所以这次关注的下层接口就只有老式的Framebuffer。

一 代码移植

我的编译环境是直接搭在树莓派上的,就是因为懒得去折腾交叉编译环境,为此还换了一个64G的tf卡。不过编lvgl这块还有点点麻烦,主要是这种小库莫名其妙的问题很多。比如说直接官网git clone下来的代码,就可能编不过。

折腾了小半天。最后还是没编过,估计后面要慢慢看看才行。

不过网上找了一个移植的好,这个倒是非常好用。

GitHub - lvgl/lv_port_linux: LVGL configured to work with a standard Linux framebuffer

这个弄下来是直接就能用,很好。然后还有一个讲解:

Embedded GUI Using Linux Frame Buffer Device with LVGL | LVGL’s Blog

直接CMakeLists这几个也都是做好的。直接:

mkdir build
cd build
cmake ..
make

很快在上面的bin下面就有一个main,直接运行就行了。就能出现开头的图。

最后提一下

切换为管理员模式,定位到根目录,命令行输入:vi /etc/profile,在最后一行添加如下代码:

echo -e "\033[?251"

保存退出,再在命令行输入:source /etc/profile使配置生效,这时再执行demo程序可发现黑条消失。

二 Demo

Demo的代码如下,这个就是最开始的图:

#include "lvgl/lvgl.h"
#include "lvgl/demos/lv_demos.h"
//#include "lv_drivers/indev/evdev.h"
#include "lvgl/src/drivers/evdev/lv_evdev.h"
//#include "lv_drivers/indev/mouse.h"
#include <unistd.h>
#include <pthread.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>

static const char *getenv_default(const char *name, const char *dflt)
{
    return getenv(name) ? : dflt;
}

static void lv_linux_disp_init(void)
{
    const char *device = getenv_default("LV_LINUX_FBDEV_DEVICE", "/dev/fb0");
    lv_display_t * disp = lv_linux_fbdev_create();

    lv_linux_fbdev_set_file(disp, device);
}


int main(void)
{
    lv_init();

    //Linux display device init
    lv_linux_disp_init();

    //Create a Demo
    lv_demo_widgets();
    lv_demo_widgets_start_slideshow();

    //Handle LVGL tasks
    while(1) {
        lv_timer_handler();
        usleep(5000);
    }

}

后面自己又改了一点。

#include "lvgl/lvgl.h"
#include "lvgl/demos/lv_demos.h"
//#include "lv_drivers/indev/evdev.h"
#include "lvgl/src/drivers/evdev/lv_evdev.h"
//#include "lv_drivers/indev/mouse.h"
#include <unistd.h>
#include <pthread.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>

static const char *getenv_default(const char *name, const char *dflt)
{
    return getenv(name) ? : dflt;
}

static void lv_linux_disp_init(void)
{
    const char *device = getenv_default("LV_LINUX_FBDEV_DEVICE", "/dev/fb0");
    lv_display_t * disp = lv_linux_fbdev_create();

    lv_linux_fbdev_set_file(disp, device);
}


int main(void)
{
    lv_init();

    //Linux display device init
    lv_linux_disp_init();


    /*更改活动屏幕的背景颜色*/
    lv_obj_set_style_bg_color(lv_scr_act(), lv_color_hex(0x003a57), LV_PART_MAIN);

    //创建一个白色标签,设置其文本并将其与中心对齐
    lv_obj_t * label = lv_label_create(lv_scr_act());
    lv_label_set_text(label, "Hello fanged.");
    lv_obj_set_style_text_color(lv_scr_act(), lv_color_hex(0xffffff), LV_PART_MAIN);
    lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);

    LV_IMG_DECLARE(mouse_cursor_icon); /*Declare the image file.*/
    lv_obj_t * cursor_obj = lv_img_create(lv_scr_act()); /*Create an image object for the cursor */
    lv_img_set_src(cursor_obj, &mouse_cursor_icon);           /*Set the image source*/
    lv_indev_set_cursor(mouse_indev, cursor_obj);

    // 主循环
    while(1) {
        lv_task_handler();  // 处理LVGL任务
        usleep(5000);  // 延迟5ms
    }

    return 0;
}

这个就是只显示一行字。(这个demo还会改改,最后增加一个按钮而且可以通过鼠标去点。这次实验也差不多结束了)

三 代码框架

四 GPU加速

五 参考

移植LVGL到Linux_lvgl移植到linux-CSDN博客

要在树莓派上使用 Framebuffer (fb0) 运行 LVGL,需通过配置 Framebuffer 作为 LVGL 的显示驱动。以下是具体步骤和示例代码:

### 基本步骤:

#### 1. **安装必要的依赖:**
   确保系统安装了 LVGL 运行所需的库和工具。

   ```bash
   sudo apt update
   sudo apt install cmake build-essential git libjpeg-dev libfreetype6-dev libpng-dev
   ```

#### 2. **获取 LVGL 和驱动程序:**
   克隆 LVGL 和相关驱动程序仓库。

   ```bash
   git clone https://github.com/lvgl/lvgl.git
   git clone https://github.com/lvgl/lv_drivers.git
   ```

#### 3. **配置 Framebuffer 驱动:**
   你需要在 `lv_drivers` 中启用 Framebuffer 驱动并配置它。打开 `lv_drivers` 的 `lv_drv_conf.h` 文件并启用 Framebuffer 支持。

   ```c
   #define USE_FBDEV 1
   ```

#### 4. **编写 LVGL 程序(使用 fb0 作为显示):**

   下面的代码展示了如何将 Framebuffer `fb0` 与 LVGL 一起使用。

```c
#include "lvgl/lvgl.h"
#include "lv_drivers/display/fbdev.h"
#include <unistd.h>

int main(void) {
    // 初始化 LVGL
    lv_init();

    // 初始化 Framebuffer 驱动
    fbdev_init();

    // 设置显示缓冲区
    static lv_disp_buf_t disp_buf;
    static lv_color_t buf1[LV_HOR_RES_MAX * 10];
    lv_disp_buf_init(&disp_buf, buf1, NULL, LV_HOR_RES_MAX * 10);

    // 注册显示驱动
    lv_disp_drv_t disp_drv;
    lv_disp_drv_init(&disp_drv);
    disp_drv.buffer = &disp_buf;
    disp_drv.flush_cb = fbdev_flush;  // 使用 Framebuffer 的 flush 函数
    lv_disp_drv_register(&disp_drv);

    // 创建一个简单的 UI
    lv_obj_t * label = lv_label_create(lv_scr_act(), NULL);
    lv_label_set_text(label, "Hello, LVGL with Framebuffer!");
    lv_obj_align(label, NULL, LV_ALIGN_CENTER, 0, 0);

    // 主循环
    while(1) {
        lv_task_handler();  // 处理LVGL任务
        usleep(5000);  // 延迟5ms
    }

    return 0;
}
```

#### 5. **编译代码:**

创建一个 CMake 文件来构建程序:

```cmake
cmake_minimum_required(VERSION 3.0)
project(lvgl_fbdev_example)

set(CMAKE_C_STANDARD 99)

include_directories(lvgl lv_drivers)

add_executable(lvgl_fbdev_example main.c)
target_link_libraries(lvgl_fbdev_example pthread)
```

然后执行以下命令编译并运行:

```bash
mkdir build
cd build
cmake ..
make
sudo ./lvgl_fbdev_example
```

### 注意:
- `fb0` 是树莓派上的默认 Framebuffer 设备。你可以通过命令 `ls /dev/fb*` 查看当前的 Framebuffer 设备。
- 你可能需要在 `/boot/config.txt` 中配置正确的 Framebuffer 设置。

通过这段代码,你可以在 Raspberry Pi 上使用 Framebuffer 设备(fb0)运行 LVGL。

【RT-Thread作品秀】基于 lvgl 的漏电保护装置校验仪 UI 界面设计作者:赵加文 概述低压漏电引起的各种安全事故已经严重影响到生产生活,威胁到生命财产安全。而解决这一现象的设备就是漏电保护开关,漏电保护开关的漏报率、误报率是很关键的参数,因此有必要对漏电保护开关的性能进行测试。因此,漏电保护装置校验仪是很有必要的。 开发环境硬件:ART-Pi 开发板,正点原子 480*272 4.3寸 RGB 屏幕 RT-Thread版本:4.0.3 开发工具及版本: RT-Thread Studio 2.0.0 :编写 编译 调试 下载代码 STM32CubeMX 6.1.0: codeBlocks 20.03:用于在 PC 机上进行 lvgl 模拟 MCU_Font V2.0: 用于转换中文,然后使得中文能够在 lvgl 中显示 RT-Thread使用情况概述在 UI 设计的整个过程中,使用到 RT-Thread 的部分主要有以下几个方面: 内核部分:动态线程,信号量 组件部分:PIN 设备、I2C 设备、TOUCH 设备框架、LCD 设备框架、finsh 组件 软件包部分:littlevgl2rtt、gt9147 硬件框架软件框架说明系统整体流程图: 软件模块说明整个UI 系统设计所遵循的是 lvgl 图形的一个回调函数的机制,将各个事件与对应的操作所绑定起来,当滑动滑条时对应的滑条的回调函数就会被触发,那么就会执行滑条回调函数的内容,当滑动点击文本框时,文本框对应的回调函数就会被触发,进而创建键盘的控件,通过键盘输入所需要的数据。 演示效果图片展示: 演示视频: 比赛感悟这次参赛,之前还没有使用过 RT-Thread studio 这个集成开发环境,这次在使用 ART-Pi 的时候全程是使用 RT-Thread studio 这个开发环境,在使用的过程中也碰到了很多问题,有时候明明配置了相关组件,但是保存之后,并没有代码添加到工程里。现在也没有弄明白问题出在哪里,虽然存在着这里问题,但是在使用的过程中,还是非常的方便,整个开发过程就如同搭积木一样方便,与 RTT操作系统贴合的非常的紧密。 除此之外,便是在使用 lvgl 的过程中碰到了很多的问题,现在网上的教程基本是 lvgl v6 版本的教程,关于 lvgl v7 版本的教程很少,而且 v6版本与 V7 版本的 API 相差很大,不能按照 V6 版本来使用 V7 ,在这个过程中摸索了好多,同时也感受到了 lvgl 的魅力,使用在嵌入式系统上是非常不错的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值