【LVGL 学习】LVGL 在 arduino 环境的安装

2023-11-09

1. 前提条件

  • 使用 arduino IDE开发
  • 使用 ESP32 作为主控
  • 屏幕使用 ST7789 驱动,240*240像素TFT屏幕

注意:屏幕驱动部分不再这个赘述,以后开贴另行发布

2. 安装 LVGL 库

打开 arduino 菜单栏中 -> 项目 -> 加载库 -> 管理库
搜索 LVGL 本人使用版本是8.0.2, 8.0一下版本貌似不支持GIF

在这里插入图片描述
1. 成功安装后,LVGL库就安装到了 首选项中, 项目文件夹位置 一栏中所设置的项目文件夹位置,我这里设置的是把库文件安装在该项目文件下。
在这里插入图片描述
2. 编译, 编译的时候会报各种错误,这里主要是 lv_conf.h 找不到一类的,因为库只给了模板,我们把lvgl文件下的 lv_conf_templet.h 改为 lv_conf.h,然后使能 lv_conf.h 文件
在这里插入图片描述
3. 搜索 lv_conf_internal.h 文件,修改一下 lv_conf.h 的路径,如下图所示:
在这里插入图片描述

3. 工程测试

  1. 在库文件lvgl中example文件下有arduino的测试demo,我们拷贝到我们的自己工程目录,以下是拷贝完毕的
  2. 我的工程没有用到 touchpad 触摸屏幕功能,所以我都去掉了
  3. 我的屏幕背光由ESP32控制,所以加入了背光控制,如果直接点亮可以去掉这个功能

//#include <lv_demo.h>
#include <stdint.h>
#include <lvgl.h>
#include <TFT_eSPI.h>
/*If you want to use the LVGL examples,
  make sure to install the lv_examples Arduino library
  and uncomment the following line.
#include <lv_examples.h>
*/

#include "lv_gif.h"


#define LCD_BL_PIN            5
#define LCD_BL_PWM_CHANNEL    0

TFT_eSPI tft = TFT_eSPI(); /* TFT instance */

/*Change to your screen resolution*/
static const uint32_t screenWidth  = 240;
static const uint32_t screenHeight = 240;

static lv_disp_draw_buf_t draw_buf;
static lv_color_t buf[ screenWidth * 10 ];

#if LV_USE_LOG != 0
/* Serial debugging */
void my_print( lv_log_level_t level, const char * file, uint32_t line, const char * fn_name, const char * dsc )
{
   Serial.printf( "%s(%s)@%d->%s\r\n", file, fn_name, line, dsc );
   Serial.flush();
}
#endif

/* 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 );

   tft.startWrite();
   tft.setAddrWindow( area->x1, area->y1, w, h );
   tft.pushColors( ( uint16_t * )&color_p->full, w * h, true );
   tft.endWrite();

   lv_disp_flush_ready( disp );
}



void setBackLight(float duty)
{
  duty = constrain(duty, 0, 1);
  duty = 1 - duty;
  ledcWrite(LCD_BL_PWM_CHANNEL, (int)(duty * 255));
}


/**
 * Open a GIF image from a file and a variable
 */
void lv_example_gif_1(void)
{
    LV_IMG_DECLARE(img_bulb_gif);
    lv_obj_t * img;


    img = lv_gif_create(lv_scr_act());
    lv_gif_set_src(img, &img_bulb_gif);
    lv_obj_align(img, LV_ALIGN_CENTER, 0, 0);

}


void setup()
{
   Serial.begin( 115200 ); /* prepare for possible serial debug */
   Serial.println( "Hello Arduino! (V8.0.X)" );
   Serial.println( "I am LVGL_Arduino" );

   ledcSetup(LCD_BL_PWM_CHANNEL, 5000, 8);
   ledcAttachPin(LCD_BL_PIN, LCD_BL_PWM_CHANNEL);

   lv_init();

#if LV_USE_LOG != 0
   lv_log_register_print_cb( my_print ); /* register print function for debugging */
#endif

   tft.begin();          /* TFT init */
   tft.setRotation( 3 ); /* Landscape orientation, flipped */

   /*Set the touchscreen calibration data,
     the actual data for your display can be aquired using
     the Generic -> Touch_calibrate example from the TFT_eSPI library*/
//   uint16_t calData[5] = { 275, 3620, 264, 3532, 1 };
//   tft.setTouch( calData );

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

   /*Initialize the display*/
   static lv_disp_drv_t disp_drv;
   lv_disp_drv_init( &disp_drv );
   /*Change the following line to your display resolution*/
   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 );

#if 1
   /* Create simple label */
   lv_obj_t *label = lv_label_create( lv_scr_act() );
   lv_label_set_recolor(label, true);                    
   lv_label_set_text( label, "#0000ff Hello Arduino! #(V8.0.X)" );
   lv_obj_align( label, LV_ALIGN_CENTER, 0, 0 );


	lv_obj_t *btn1 = lv_btn_create( lv_scr_act() );		
  lv_obj_align( btn1, LV_ALIGN_CENTER, 0, 60 );
		             

	lv_obj_t *label2 = lv_label_create(btn1);          
	lv_label_set_text(label2, "Button 1");			           

#else
   /* Try an example from the lv_examples Arduino library
      make sure to include it as written above.
   lv_example_btn_1();
   */

  //lv_demo_widgets();
  
    //
    lv_example_gif_1();
   // uncomment one of these demos
   //lv_demo_widgets();            // OK
   // lv_demo_benchmark();          // OK
   // lv_demo_keypad_encoder();     // works, but I haven't an encoder
   // lv_demo_music();              // NOK
   // lv_demo_printer();
 #endif
   Serial.println( "Setup done" );

   setBackLight(0.9);
}

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

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

【LVGL 学习】LVGL 在 arduino 环境的安装 的相关文章

  • Arduino:连接字符串时崩溃和错误

    我尝试将 AES 256 加密的输出连接到一个字符串 将此字符串与从 Android 手机发送的加密字符串进行比较 基本上 连接似乎有效 但在几次运行后会出现错误 不可读的字符 字符串变得更短而不是更长 或崩溃 它是可重现的 重启后在同一点
  • pySerial 与 python 2.7 和 3.4 的差异

    我正在开发一个项目 需要通过串口将一些数字从 Windows 10 中的 python 发送到 arduino uno 作为一个简单的测试 我只想通过发送 2 来打开 LED 并通过从命令提示符发送 4 来关闭 LED 尽管我希望最终能够将
  • 将 ZeroMQ 交叉编译为 ARM,以便在 MonoTouch iPhone 应用程序配置设置中使用

    我正在尝试在使用 MonoTouch 用 C 开发的 iPhone 应用程序中使用 ZeroMQ 库 我几乎解决了所有的问题 却在最后一道坎倒下了 我正在使用 ZeroMQ 2 1 10 和 C CLR 绑定 包装器 并在 Mac OS X
  • arm64 汇编:LDP 与 LD4 执行时间

    假设我想用连续内存位置的值加载四个连续的 aarch64 向量寄存器 一种方法是 ldp q0 q1 x0 ldp q2 q3 x0 32 根据ARM优化指南 https static docs arm com uan0016 a cort
  • 嵌入式 C++ (ARM9) 单元测试

    我来自 Java 和 JUnit 的世界 我演示了 Hudson 以及我使用 JUnit 取得的所有成果 我想在嵌入式设备上对 C 代码执行相同的操作 但找不到从哪里开始 该项目使用 iccarm exe IAR 编译器 进行编译 现在使用
  • 将浮点数转换为字节数组的 C 函数

    我正在尝试创建一个函数来接受浮点变量并将其转换为字节数组 我找到了一段有效的代码片段 但如果可能的话 希望在函数中重用它 我也在使用 Arduino 环境 但我知道它接受大多数 C 语言 目前工作 float variable 1 11 b
  • 将结构体偏移属性赋予汇编器

    如何将 C 结构体的偏移量发送到汇编代码 例如 在我的 C 代码中 typedef struct unsigned int a unsigned int b CMyStruct 我向 ASM 函数发送一个 CMyStruct 结构的指针 假
  • ARM 汇编分支到寄存器或内存内部的地址

    我想知道在 ARM 汇编中我可以使用哪条指令分支到存储在某个内存地址中的地址或标签 例如 我们可以使用B LABEL来跳转到LABEL 但现在目的地只能在运行时知道 并且它存储在某个已知的内存位置 是否有类似 B 地址 的东西 Thanks
  • 在 ARM 处理器上执行存储在外部 SPI 闪存中的程序

    我有一个 ARM 处理器 能够与外部闪存芯片连接 写入芯片的是为 ARM 架构编译的程序 可供执行 我需要知道如何将这些数据从外部闪存获取到 ARM 处理器上以供执行 我可以提前运行某种复制例程 将数据复制到可执行内存空间吗 我想我可以 但
  • 如何使用GSM模块SIM800和Arduino Uno发送短信?

    我正在尝试通过 SIM800 GSM 模块从 Arduino 发送短信 消息到达给定号码 但格式不正确 它显示 消息格式不支持 我在这里添加了我的代码 非常感谢您的快速回复 include
  • GCC ARM 汇编预处理器宏

    我正在尝试使用汇编 ARM 宏进行定点乘法 define MULT a b asm volatile SMULL r2 r3 0 1 n t ADD r2 r2 0x8000 n t ADC r3 r3 0 n t MOV 0 r2 ASR
  • 如何使用 Neon SIMD 将无符号字符转换为有符号整数

    如何转换变量的数据类型uint8 t to int32 t使用霓虹灯 我找不到执行此操作的任何内在因素 假设您想要将 16 x 8 位整数的向量转换为 4 个 4 x 32 位整数的向量 您可以通过首先解压缩为 16 位 然后再次解压缩为
  • 编译器:如果条件始终为真/假怎么办

    我想到了条件和编译器 我正在为 Arduino 编写一个应用程序 因此我需要该应用程序尽可能快 在我的代码中我有这个 define DEBUG false if DEBUG String pinName pinName Pin pinNam
  • 在链接时合并全局数组/从多个编译单元填充全局数组

    我想定义一系列的东西 比如事件处理程序 的内容 该数组在编译时是完全已知的 但定义在 多个编译单元 分布在多个库中 至少在最终 静态 链接之前是相当解耦的 我想要 也保持这种方式 因此添加或删除编译单元将 还可以自动管理事件处理程序 而无需
  • 为什么当大小大于 50 时,该程序花费的时间会呈指数级增长?

    所以我正在为类编写一个 ARM 汇编快速排序方法 我对大部分内容都有了解 除了复杂性没有意义 我们将其与我们制作的另一种冒泡排序方法进行比较 它对于具有 1 个参数和 10 个参数的示例表现更好 然而 我什至无法比较 100 个参数测试 因
  • 如何设置 CMake 与 clang 交叉编译 Windows 上的 ARM 嵌入式系统?

    我正在尝试生成 Ninja makefile 以使用 Clang 为 ARM Cortex A5 CPU 交叉编译 C 项目 我为 CMake 创建了一个工具链文件 但似乎存在错误或缺少一些我无法找到的东西 当使用下面的工具链文件调用 CM
  • DS-5:什么是 FVP、RTSM、基础模型、AEM 模型、快速模型、CADI?

    DS 5 模拟器使用了很多术语 如 FVP RTSM 快速模型 基础模型 AEM 模型 CADI Arm的文档中提供的解释不是很清楚 这些术语的含义是什么 作为 DS 5 的最终用户我应该关心哪些术语 Model 软件模拟的行业术语 就 A
  • 如何使用基于HM-10蓝牙模块的BLE Shield?

    我是 arduino 项目的新手 我想请你帮忙 我从 http imall iteadstudio com development platform arduino shields im130704001 html http imall i
  • 使用 Arduino 来操作 Android [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有人尝试过让 Android 和 Arduino 相互通信吗 我在网上找到了几个项目 Amarino http www amarino tool
  • 了解 U-Boot 内存占用

    我不明白加载 U Boot 时 RAM 中发生了什么 我正在开发 Xilinx Zynq ZC702 评估套件 并尝试使用 U Boot 在其上加载 Linux 内核 于是我使用Xilinx工具Vivado和SDK生成了一个BOOT bin

随机推荐

  • bcdedit添加win7启动项

    公司的电脑是日文win7系统 安装在C盘 后来有需求 在E盘安装了中文win7 只是偶尔用用 后来日语系统出了问题 重新格式化C盘 重装了日文系统 中文系统也就进不去了 现在突然要用中文系统了 需要修复一下启动项 用管理员权限执行cmd 然
  • 前端报错。

    一 前端报500 打开网络请求 看响应 1 500错误码的官方解释是 500服务器内部错误 Internal server error 主要是由于IWAM账号的密码错误造成的 该错误说明IIS服务器无法解析ASP代码 访问一个静态页面试试是
  • QT笔记——使用重载的信号多种方法

    使用重载的信号 的 多种写法 接下来我们将使用QComboBox 的信号来举例 我们发现currentIndexChanged 这个信号是重载的 我们在正常写是编译不通过的 ui comboBox gt addItem QStringLit
  • CCF/CSP 201604-2 俄罗斯方块(满分题解Java版)

    此题 猛滴一看确实非常容易让人懵懵的 主要是题目描述的非常不清晰 很难让人能够透彻的理解 如果连题目都看不懂 那就不谈写出代码了 题目描述 官方题目描述 题目地址 题目解读 关键的是要理解题目 Java题解 import java util
  • JPA @Query时,无法使用limit函数原因及解决方案

    前言 使用ssh时 我加入了springdata jpa去查询sql 在 query中使用limit函数时 报错 后来分析原因才知道 springdata jpa的 query中写的sql叫JPQL jpql是不支持limit函数的 而原生
  • ubuntu vsocde 配置 pcl头文件库

    vscode 配置 pcl头文件库 ctrl shift p 输入Edit configuretion 在includePath种添加 usr include pcl 1 8 如果还是没有提示 那么要开启提示 将复选框取消就行 还可以修改提
  • 剑指offer 学习笔记 把字符串转换成整数

    面试题67 把字符串转换成整数 类似atoi函数 把一个字符串转换成一个整数 当输入非法时返回0 为了区分是由于输入0而返回0还是输入非法而返回0 而声明了一个全局变量g nStatus 为了防止溢出 可先将结果存入long long类型中
  • 安装FISCO-BCOS的那些坑

    首先从官网下载源码 git clone https github com FISCO BCOS FISCO BCOS git要是内网的时候可以将源码下载后放到服务器进行解压unzip filename zip 执行build 如果没有安装过
  • vscode使用ssh远程连接服务器时出现timeout情况的解决方法汇总

    背景 mobaxterm通过ssh能正常连接服务器 而在vscode里远程连接服务器时则提示连接超时 解决方法一 win R打开运行命令框 输入cmd打开命令提示符 在下图红圈位置右键然后选择属性 选择取消 使用旧控制台 U 解决方法二 右
  • Visual Studio 2022 include和lib路径问题

    最近安装了Visual Studio 2022 想试下opengl 首先是用cmake尝试编译 结果编译不过 一直报错 LINK fatal error LNK1104 无法打开文件 ucrtd lib 然后我新建了一个工程 导入了glfw
  • Xshell 6安装和使用教程

    作者 翁松秀 Xshell 6安装和使用教程 工欲善其事必先利其器 Xshell 6安装和使用教程 一 XShell 6的安装 二 XShell 6的使用 创建链接 快捷键 主题 三 XFTP的下载和安装 一 XShell 6的安装 到官网
  • 数据挖掘---分类算法之支持向量机SVM

    上篇已经简单的说了下支持向量机的理论 里面有不少公式 需要肯学习的你一步步的推导试一试 说实在的还是挺能考验数学能力的 当年俺老孙就是一步步的推导过 只有这样你才能对这个过程有清晰的认识 才能对这个算法有所体会 下面来举个例子 说说用支持向
  • call、apply和bind的区别

    首先说说call apply和bind的作用吧 它们的作用都是相同的 都是动态的修改当前函数内部环境对象this的指向 call apply和bind区别 相同点 作用相同 都是动态修改this指向 都不会修改原先函数的this指向 异同点
  • 使用学生邮箱注册jetbrains

    1 到 https www jetbrains com zh student 点击申请按钮开始申请 2 在表单上方选择申请方式填写相关信息后提交申请 使用校园邮箱 就是广外邮箱 格式是学号加 gdufs edu cn 例如201810023
  • 二分查找 递归

    碎碎念念 假设我们要在一个升序排序的整型数组中查找某个特定的整数 如果找到了 返回该整数在数组中的索引号 如果没有找到 则返回 1 我们首先看要找的数和数组中间的数的大小关系 如果相等 那么说明找到了 如果要找的数小于数组中间的数 那么我们
  • 由集成运放构成的基本运算电路

    一 比例运算放大器 1 同相比例运算放大器 2 反相比例运算放大器 二 相加器 1 反向相加器 2 同向相加器 3 相减器 根据叠加原理 如上相减器可拆分为如下两个相加器 第一图 第二图 三 积分器 1 简单积分器 2 差动积分器 四 微分
  • 模拟上传文件至服务器(解决socket中read阻塞问题)

    客户端 package cn dali4 code03ex import java io FileInputStream import java io IOException import java io InputStream impor
  • python一行写不下,变多行

    python里一行写不下 拆成多行 和 两种方法 在一行末尾 加上 也就是空格加上 a sdfaf test 注意两个对象都要独立 字符串必须都用双引号引起 如果是if and 后加 其实用括号也可以 比如 a sdfaf test 或者
  • c语言实现学生管理系统,C语言学生管理系统源代码

    C语言学生管理系统源代码 由会员分享 可在线阅读 更多相关 C语言学生管理系统源代码 12页珍藏版 请在人人文库网上搜索 1 C语言学生成绩管理系统源代码 保证能用 include malloc h include stdio h incl
  • 【LVGL 学习】LVGL 在 arduino 环境的安装

    1 前提条件 使用 arduino IDE开发 使用 ESP32 作为主控 屏幕使用 ST7789 驱动 240 240像素TFT屏幕 注意 屏幕驱动部分不再这个赘述 以后开贴另行发布 2 安装 LVGL 库 打开 arduino 菜单栏中