首页 > 其他分享 >ESP32S3通过Arduino移植LVGL

ESP32S3通过Arduino移植LVGL

时间:2023-10-28 19:33:07浏览次数:42  
标签:disp lvgl Arduino area indev ESP32S3 drv lv LVGL

原文:https://www.jianshu.com/p/8306f948b854

LVGL展示

此lvgl开发板开源链接:


 

准备工作

  • 显示屏驱动,需要用到“画点”或者“画区域”函数
  • 触摸驱动,如果需要用到触摸功能,还需要准备触摸函数,该函数将会返回触摸坐标给lvgl

修改lvgl

下载下来的lvgl是不能直接使用的,需要根据实际修改配置文件

第一步:下载LVGL
在github选择版本下载,链接
第二步:解压文件
解压到Arduino的libraries,并将lvgl-8.3.5重命名为lvgl    
第三步:配置文件名
1,将 lv_conf_template.h 更改为 lv_conf.h

 

2,将 lv_conf.h 移动到Arduino的libraries的根目录下
第四步:打开宏

打开“lv_conf.h”文件,将此处的 #if 0 变成 if 1即可

// 上略
/* clang-format off */
#if 0 /*Set it to "1" to enable content*/

#ifndef LV_CONF_H
#define LV_CONF_H

#include <stdint.h>
// 下略
第五步:配置心跳时钟
在 lv_conf.h 中,找到 #define LV_TICK_CUSTOM ,如下图第88行所示。将其置1即可,这样lvgl将时钟arduino的时钟  

配置lvgl结束

配置工程

lvgl本身不提供屏幕驱动,只是一个gui库,说白了需要将屏幕驱动提供的画点或者画区域函数和触摸(如果有)函数与lvgl绑定,不然lvgl怎么显示东西

显示驱动

LCD的驱动用到的函数如下

void LCD_Init(void);
void LCD_Draw_Pixel(uint16_t x, uint16_t y, uint16_t *bitmap, uint16_t w, uint16_t h);

编写回调函数,注意这里的函数名不能变,因为这是lvgl的回调函数

void my_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p) {
    uint32_t w = (area->x2 - area->x1 + 1);
    uint32_t h = (area->y2 - area->y1 + 1);
    
    LCD_Draw_Pixel(area->x1, area->y1, (uint16_t *)&color_p->full, w, h);   // 替换你的

    lv_disp_flush_ready(disp);
}
触摸驱动

触摸的驱动用到的函数和变量如下

extern int touch_last_x;
extern int touch_last_y;
bool touch_touched();

编写回调函数,注意这里的函数名不能变,因为这是lvgl的回调函数,程序大概意思是lvgl会定时执行 my_touchpad_read ,如果有触摸按下,则会执行if语句,并将新的触摸坐标赋值给lvgl

void my_touchpad_read(lv_indev_drv_t *indev_driver, lv_indev_data_t *data) {
    /* 替换成你的 */
    if (touch_touched()) {
        data->state = LV_INDEV_STATE_PR;
        /*Set the coordinates*/
        data->point.x = touch_last_x;
        data->point.y = touch_last_y;
    }
    else {
        data->state = LV_INDEV_STATE_REL;
    }
}
完整程序
  • gui.c
#include "gui.h"
#include "LCD.h"
#include "touch.h"
#include "lvgl.h"

lv_disp_draw_buf_t draw_buf;
lv_color_t *disp_draw_buf;
lv_disp_drv_t disp_drv;

void my_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p);
void my_touchpad_read(lv_indev_drv_t *indev_driver, lv_indev_data_t *data);

void Gui_Init()
{
    Touch_Init();   // 触摸初始化
    LCD_Init();     // 屏幕驱动初始化
    lv_init();      // LVGL初始化

    disp_draw_buf = (lv_color_t *)heap_caps_malloc(sizeof(lv_color_t) * screenWidth * 10, MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT);

    lv_disp_draw_buf_init(&draw_buf, disp_draw_buf, NULL, screenWidth * 10);

    /* Initialize the display */
    lv_disp_drv_init(&disp_drv);
    disp_drv.hor_res = screenWidth;
    disp_drv.ver_res = screenHeight;
    disp_drv.flush_cb = my_disp_flush;  // 触摸回调函数
    disp_drv.draw_buf = &draw_buf;
    lv_disp_drv_register(&disp_drv);

    /* Initialize the (dummy) input device driver */
    static lv_indev_drv_t indev_drv;
    lv_indev_drv_init(&indev_drv);
    indev_drv.type = LV_INDEV_TYPE_POINTER;
    indev_drv.read_cb = my_touchpad_read;   // 触摸回调函数
    lv_indev_drv_register(&indev_drv);
}



/* Display flushing */
void my_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p) {
    uint32_t w = (area->x2 - area->x1 + 1);
    uint32_t h = (area->y2 - area->y1 + 1);
    
    LCD_Draw_Pixel(area->x1, area->y1, (uint16_t *)&color_p->full, w, h);

    lv_disp_flush_ready(disp);
}

void my_touchpad_read(lv_indev_drv_t *indev_driver, lv_indev_data_t *data) {
    if (touch_touched()) {
        data->state = LV_INDEV_STATE_PR;
        /*Set the coordinates*/
        data->point.x = touch_last_x;
        data->point.y = touch_last_y;
    }
    else {
        data->state = LV_INDEV_STATE_REL;
    }
}
  • gui.h
#ifndef GUI_H
#define GUI_H
void Gui_Init(void);
#endif
  • Arduino主程序
#include <Arduino.h>
#include "gui.h"
#include "lvgl.h"

void setup() {
    Gui_Init();
}

void loop()
{
    lv_timer_handler(); /* let the GUI do its work */
    delay(10);
}

移植结束



作者:南方的南边
链接:https://www.jianshu.com/p/8306f948b854
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

标签:disp,lvgl,Arduino,area,indev,ESP32S3,drv,lv,LVGL
From: https://www.cnblogs.com/bruce1992/p/17794512.html

相关文章

  • 无涯教程-Arduino - Multi-Dimensional Arrays函数
    具有二维的数组(即下标)通常表示由以行和列排列的信息组成的值表。intb[2][2]={{1,2},{3,4}};这些值按大括号按行分组,因此,1和2分别初始化b[0][0]和b[0][1],而3和4分别初始化b[1][0]和b[1][1],如果给定行的初始化程序不足,则将该行的其余元素初始化为0。因此......
  • 无涯教程-Arduino - micros()函数
    micros()函数返回从Arduino开发板开始运行当前程序起的毫秒数,该数字溢出,即大约70分钟后恢复为零。micros-语法micros();此函数返回自程序启动以来的微秒数(无符号长)micros-示例unsignedlongtime;voidsetup(){Serial.begin(9600);}voidloop(){......
  • 无涯教程-Arduino - delayMicroseconds()函数
    delayMicroseconds()函数接受一个整数(或数字)参数,该数字表示时间,以微秒为单位,一毫秒有一千微秒,一秒有一百万微秒。当前,可以产生准确延迟的最大值是16383,这可能会在将来的Arduino版本中改变,对于超过几千微秒的延迟,应改为使用delay()函数。delayMicroseconds-语法delayMicr......
  • 无涯教程-Arduino - for语句函数
    for循环执行语句预定次数。forloop-语法for(initialize;control;incrementordecrement){//语句块}forloop-示例for(counter=2;counter<=9;counter++){//statements块将执行10次}forloop-执行序列参考链接https://www.learnfk.com/arduin......
  • 无涯教程-Arduino - while语句函数
    while循环将连续且无限地循环,直到括号()中的表达式变为false为止,必须更改测试变量,否则while循环将永远不会退出。whileloop-while-语法while(expression){Blockofstatements;}whileloop-while-执行序列参考链接https://www.learnfk.com/arduino/arduino-w......
  • 无涯教程-Arduino - switch case语句函数
    与if语句类似,switch...case通过允许程序员指定应在各种条件下执行的不同代码来控制程序的流程,break关键字使switch语句退出,并且通常在每种情况下使用。switchcase-语法switch(variable){caselabel://statementsbreak;}caselabel:{//statemen......
  • 无涯教程-Arduino - 水检传感器
    水传感器砖专为水检测而设计,可广泛用于感应降雨,水位甚至液体泄漏。将水传感器连接到Arduino是检测泄漏,溢出,洪水,下雨等的好方法。它可用于检测水的存在,水平,体积,虽然这可以提醒您给植物浇水,但是有一个更好的Grove传感器可以用来浇水,传感器具有一系列裸露的迹线,当检测到水时,这些迹......
  • 无涯教程-Arduino - 温度传感器
    温度传感器LM35系列是精密集成电路温度设备,其输出电压与摄氏度的温度成线性比示例。LM35器件相对于用开尔文(Kelvin)校准的线性温度传感器具有优势,因为不需要用户从输出中减去较大的恒定电压即可获得方便的摄氏刻度。LM35器件不需要任何外部校准或修整即可在室温下提供±¼°C......
  • 无涯教程-Arduino - 渐变LED
    该示例演示了如何在LED熄灭时使用AnalogWrite()函数,AnalogWrite使用脉宽调制(PWM),以on/off之间的不同比率非常快速地打开和关闭数字引脚,以产生fading效果。所需组件您将需要以下组件-1×Breadboard1×ArduinoUnoR31个LED1×330Ω电阻2×跳线电路图遵循电路图,并......
  • 无涯教程-Arduino - 闪烁的LED
    LED是小巧而函数强大的灯,可用于许多不同的应用中,首先,我们将使LED闪烁(微控制器的HelloLearnfk),就像打开和关闭灯一样简单,创建这个重要的基准将为您进行更复杂的实验打下坚实的基础。所需组件您将需要以下组件-1×面包板1×ArduinoUnoR31个LED1×330Ω电阻2×跳线......