ESP32 CYD 使用 LVGL 在屏幕上显示图像 | Random Nerd Tutorials

news2024/12/23 7:49:08

在本指南中,你将学习如何使用LVGL在ESP32 Cheap Yellow Display (CYD) 板上处理和加载图像。ESP32将使用Arduino IDE进行编程。

对ESP32 Cheap Yellow Display不熟悉? 从这里开始:开始使用ESP32 Cheap Yellow Display Board – CYD (ESP32-2432S028R)。

项目概述

在这个项目中,你将学习如何使用LVGL在CYD上显示图像。我们将创建一个示例来显示如下图片所示的猫的图像,但你可以根据需要加载任何其他图像。

CAT

前提条件

在继续之前,请确保你遵循了以下前提条件。你必须遵循所有步骤,否则你的项目将无法工作。

1) 所需部件

对于这个项目,你需要以下部件:

  • ESP32-2432S028R – 2.8英寸240×320智能显示屏TFT带触摸屏

2) 在Arduino IDE中安装ESP32板

我们将使用Arduino IDE对ESP32进行编程。确保你已经安装了ESP32板。请按照以下教程操作:

  • 在Arduino IDE 2中安装ESP32板(Windows, Mac OS X, Linux)

3) 熟悉ESP32 Cheap Yellow Display

ESP32-2432S028R开发板在创客社区被称为“Cheap Yellow Display”或简称CYD。这个开发板的主要芯片是ESP32-WROOM-32模块,配备了2.8英寸TFT触摸屏LCD、microSD卡接口、RGB LED以及编程和为板供电所需的所有电路。

ESP32 CYD

如果你第一次使用ESP32 Cheap Yellow Display,请确保遵循我们的入门指南:

  • 开始使用ESP32 Cheap Yellow Display Board和LVGL

4) 安装SPI和LVGL库

LVGL(轻量级多功能图形库)是一个免费且开源的图形库,为你的微控制器项目提供了广泛的易于使用的图形元素,这些项目需要图形用户界面(GUI)。

LVGL

按照以下教程安装和配置使用ESP32 Cheap Yellow Display的Arduino IDE所需的库。

  • 开始使用ESP32 Cheap Yellow Display Board (ESP32-2432S028R)上的LVGL

准备图像文件 – image.h

要使用LVGL加载自定义图像,你需要创建和配置一个名为_image.h_的文件,该文件必须放置在草图文件夹中。我们已经为你准备了这个文件。如果你想加载自定义图像,你只需要替换图像uint8_t映射和图像大小。

你可以使用我们的示例图像或按照以下步骤准备自定义图像:

  1. 访问LVGL图像转换器网站:lvgl.io/tools/imageconverter

  2. 选择以下图片中突出显示的选项:
    • 版本:LVGL v9

    • 从你的计算机中选择一个图像

    • 颜色格式:ARGB8888

    • 然后,点击转换按钮

      LVGL Image Converter

  3. 它将下载一个以你的图片名称命名但具有.c扩展名的文件。打开该文件,复制括号{}内的代码,其中包含许多十六进制字符。

  4. 创建一个名为 image.h 的新文件。

  5. 将此存储库中的代码复制并粘贴到你刚刚创建的新的 image.h 文件中。

  6. 用你在第3步中复制的内容替换my_image_map变量的内容。(不要更改my_image_map变量的名称,只复制和替换括号内的内容)。

#ifdef __has_include
    #if __has_include("lvgl.h")
        #ifndef LV_LVGL_H_INCLUDE_SIMPLE
            #define LV_LVGL_H_INCLUDE_SIMPLE
        #endif
    #endif
#endif

#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
    #include "lvgl.h"
#else
    #include "lvgl/lvgl.h"
#endif

#define LV_BIG_ENDIAN_SYSTEM

#ifndef LV_ATTRIBUTE_MEM_ALIGN
#define LV_ATTRIBUTE_MEM_ALIGN
#endif

#ifndef LV_ATTRIBUTE_IMG_MY_IMAGE
#define LV_ATTRIBUTE_IMG_MY_IMAGE
#endif

const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_MY_IMAGE uint8_t my_image_map[] = {REPLACE_WITH_YOUR__IMAGE_ATTRIBUTE};

const lv_image_dsc_t my_image = {
    .header = {
        .magic = LV_IMAGE_HEADER_MAGIC,
        .cf = LV_COLOR_FORMAT_ARGB8888,
        .flags = 0,          
        .w = 128,
        .h = 128,
        //.stride = 120,
        .reserved_2 = 0
    },
    .data_size = sizeof(my_image_map),
    .data = my_image_map,
    .reserved = NULL
};
  1. 滚动到该文件底部,使用你的图像宽度.w和高度.h更改以下行:

const lv_image_dsc_t my_image = {
    .header = {
        .magic = LV_IMAGE_HEADER_MAGIC,
        .cf = LV_COLOR_FORMAT_ARGB8888,
        .flags = 0,          
        .w = 128,
        .h = 128,
        //.stride = 120,
        .reserved_2 = 0
    },
    .data_size = sizeof(my_image_map),
    .data = my_image_map,
    .reserved = NULL
};
  1. 最后,保存你的 image.h 文件。

重要: image.h 文件应放在你的项目的草图文件夹中的 .ino 文件旁边。

相同目录

相同目录

你的Arduino IDE应该有以下两个标签:

两个标签页

ESP32 CYD: 加载和显示图像 – Arduino代码

以下代码将在屏幕上显示图像。你必须事先准备好 image.h ,其中包含你选择的图像。或者,你可以使用我们的默认 image.h 文件。该文件应放置在草图文件夹中,紧挨着 .ino 文件。

/* Rui Santos & Sara Santos - Random Nerd Tutorials - https://RandomNerdTutorials.com/esp32-cyd-lvgl-display-image/
   THIS EXAMPLE WAS TESTED WITH THE FOLLOWING HARDWARE:
   1) ESP32-2432S028R 2.8 inch 240×320 also known as the Cheap Yellow Display (CYD): https://makeradvisor.com/tools/cyd-cheap-yellow-display-esp32-2432s028r/
      SET UP INSTRUCTIONS: https://RandomNerdTutorials.com/cyd-lvgl/
   2) REGULAR ESP32 Dev Board + 2.8 inch 240x320 TFT Display: https://makeradvisor.com/tools/2-8-inch-ili9341-tft-240x320/ and https://makeradvisor.com/tools/esp32-dev-board-wi-fi-bluetooth/
      SET UP INSTRUCTIONS: https://RandomNerdTutorials.com/esp32-tft-lvgl/
   Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
   The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/

/* Install the "lvgl" library version 9.X by kisvegabor to interface with the TFT Display - https://lvgl.io/
   *** IMPORTANT: lv_conf.h available on the internet will probably NOT work with the examples available at Random Nerd Tutorials ***
   *** YOU MUST USE THE lv_conf.h FILE PROVIDED IN THE LINK BELOW IN ORDER TO USE THE EXAMPLES FROM RANDOM NERD TUTORIALS ***
   FULL INSTRUCTIONS AVAILABLE ON HOW CONFIGURE THE LIBRARY: https://RandomNerdTutorials.com/cyd-lvgl/ or https://RandomNerdTutorials.com/esp32-tft-lvgl/  */
#include <lvgl.h>

/* Install the "TFT_eSPI" library by Bodmer to interface with the TFT Display - https://github.com/Bodmer/TFT_eSPI
   *** IMPORTANT: User_Setup.h available on the internet will probably NOT work with the examples available at Random Nerd Tutorials ***
   *** YOU MUST USE THE User_Setup.h FILE PROVIDED IN THE LINK BELOW IN ORDER TO USE THE EXAMPLES FROM RANDOM NERD TUTORIALS ***
   FULL INSTRUCTIONS AVAILABLE ON HOW CONFIGURE THE LIBRARY: https://RandomNerdTutorials.com/cyd-lvgl/ or https://RandomNerdTutorials.com/esp32-tft-lvgl/  */
#include <TFT_eSPI.h>

#include <image.h>

#define SCREEN_WIDTH 320
#define SCREEN_HEIGHT 240
#define DRAW_BUF_SIZE (SCREEN_WIDTH * SCREEN_HEIGHT / 10 * (LV_COLOR_DEPTH / 8))
uint32_t draw_buf[DRAW_BUF_SIZE / 4];

// 如果启用了日志记录,它将告知用户库中正在发生的事情
void log_print(lv_log_level_t level, const char * buf) {
  LV_UNUSED(level);
  Serial.println(buf);
  Serial.flush();
}

void draw_image(void) {
  LV_IMAGE_DECLARE(my_image);
  lv_obj_t * img1 = lv_image_create(lv_screen_active());
  lv_image_set_src(img1, &my_image);
  lv_obj_align(img1, LV_ALIGN_CENTER, 0, 0);
}

void setup() {
  String LVGL_Arduino = String("LVGL Library Version: ") + lv_version_major() + "." + lv_version_minor() + "." + lv_version_patch();
  Serial.begin(115200);
  Serial.println(LVGL_Arduino);

  // 启动LVGL
  lv_init();
  // 注册打印函数用于调试
  lv_log_register_print_cb(log_print);

  // 创建显示对象
  lv_display_t * disp;
  // 使用TFT_eSPI库初始化TFT显示屏
  disp = lv_tft_espi_create(SCREEN_WIDTH, SCREEN_HEIGHT, draw_buf, sizeof(draw_buf));

  // 绘制图像的函数
  draw_image();
}

void loop() {
  lv_task_handler();  // 让GUI完成它的工作
  lv_tick_inc(5);     // 告诉LVGL已经过去了多少时间
  delay(5);           // 让这段时间过去
}

代码是如何工作的?

让我们看看如何在CYD屏幕上显示图像。或者,你可以跳到演示部分。

包含库

你需要包括lvgl.h和TFT_eSPI.h库来在屏幕上通信和显示文本。

#include <lvgl.h>
#include <TFT_eSPI.h>

包括包含所有绘制图像信息的image.h文件。

#include <image.h>

setup()

在setup()中,包括以下用于调试的行。这些将打印你正在使用的LVGL的版本。你必须使用版本9。

String LVGL_Arduino = String("LVGL Library Version:") + lv_version_major() + "." + lv_version_minor() + "." + lv_version_patch();
Serial.begin(115200);
Serial.println(LVGL_Arduino);
初始化LVGL库

通过在setup()中调用lv_init()函数来初始化LVGL库。

// 启动LVGL
lv_init();
注册调试函数

注册你之前声明的log_print()函数作为与LVGL调试相关的函数。

// 注册打印函数用于调试
lv_log_register_print_cb(log_print);
创建显示对象

要写入显示,你必须首先创建一个显示对象。在你的所有LVGL草图中都需要这样做。以下行将创建一个名为disp的LVGL显示对象,其中包含之前定义的屏幕宽度、屏幕高度和绘图缓冲区。

// 创建一个显示对象
lv_display_t * disp;
// 使用TFT_eSPI库初始化TFT显示屏
disp = lv_tft_espi_create(SCREEN_WIDTH, SCREEN_HEIGHT, draw_buf, sizeof(draw_buf));
绘制图像

在setup()中调用draw_image()函数来在显示上绘制图像。然后,一切都通过事件和回调函数工作。代码总是在后台监听事件。当发生某些事情时,它将运行与事件相关的回调函数。你不需要在loop()中检查任何事件。

draw_image();

draw_image()

我们创建了一个名为draw_image()的函数,该函数在setup()中被调用。

void draw_image(void) {
  LV_IMAGE_DECLARE(my_image);
  lv_obj_t * img1 = lv_image_create(lv_screen_active());
  lv_image_set_src(img1, &my_image);
  lv_obj_align(img1, LV_ALIGN_CENTER, 0, 0);
}

首先使用以下行声明你的图像(my_image在_image.h文件中声明)。

LV_IMAGE_DECLARE(my_image);

然后,使用lv_image_create()函数在当前屏幕上创建一个名为img1的LVGL图像对象。

lv_obj_t * img1 = lv_image_create(lv_screen_active());

使用lv_image_set_src()函数设置图像源。将LVGL图像对象和图像源作为参数传递。

lv_image_set_src(img1, &my_image);

将图像居中对齐到屏幕。

lv_obj_align(img1, LV_ALIGN_CENTER, 0, 0);

loop()

在loop()中,你可以添加任何其他任务,你需要你的ESP32做,就像在任何常规Arduino草图中一样。在我们的例子中,我们不会向loop()添加任何任务,但为了保持LVGL运行和检测事件,你总是需要将以下行添加到你的loop()中。

void loop() {
  lv_task_handler();   // 让GUI完成它的工作
  lv_tick_inc(5);      // 告诉LVGL已经过去了多少时间
  delay(5);            // 让这段时间过去
}

演示

你的 image.h 文件应该紧挨着你的 .ino 文件。当你上传代码时, image.h 文件将自动上传到板子上。

准备好这两个文件后,将代码上传到你的板子上。转到工具 > 并选择ESP32 > ESP32 Dev Module。然后,在工具 > 端口中选择正确的COM端口。最后,点击上传按钮。

几秒钟后,屏幕将显示如下所示的图像。

显示图片

总结

在本教程中,你学习了如何使用LVGL库在Cheap Yellow Display (CYD) 板上显示图像。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2085823.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线性代数 第三讲 线性相关无关 线性表示

线性代数 第三讲 线性相关无关 线性表示 文章目录 线性代数 第三讲 线性相关无关 线性表示1.向量运算1.线性相关与线性无关1.1 线性相关与线性无关基本概念 2.线性表示&#xff08;线性组合&#xff09;3.线性相关无关与线性表示的定理大总结3.1 向量β可由向量组线性表出的同义…

心觉:潜意识显化很简单,只是很多人想复杂了

很多人知道潜意识的力量很大&#xff0c;是意识力量的30000倍以上 也知道该怎么显化自己的潜意识 但是就是做不到 这就像很多肥胖的人知道运动可以减肥 知道减肥之后就可以穿漂亮的衣服 知道减肥之后自己有多帅多美 但是就是迈不开腿 根本原因是你的潜意识和意识上的认知不…

RenderMan v26.2更新内容!云渲染平台支持新版本

皮克斯的最新RenderMan v26.2版本带来了一系列激动人心的新特性和改进&#xff0c;进一步巩固了其在高端渲染领域的领导地位&#xff0c;为艺术家们提供了更丰富的创意工具和更流畅的工作流程。作为老牌的云渲染农场&#xff0c;瑞云依然支持新版本的使用。 RenderMan v26.2更新…

移动端视频编辑SDK解决方案,关键帧曲线塑造生动效果

美摄科技&#xff0c;作为移动视频编辑技术的领航者&#xff0c;携其革命性的移动端视频编辑SDK解决方案&#xff0c;正以前所未有的创新力&#xff0c;为视频创作者们开启了一扇通往无限创意的大门。 重塑视频编辑体验&#xff0c;让创意触手可及 美摄科技的移动端视频编辑S…

公网信息泄露监测(网盘、暗网、搜索引擎、文档平台)思路分享

一、背景 众测项目中白帽可能会提交一些信息泄露漏洞&#xff0c;同时甲方可会收到一些白帽提交的公网信息泄露文件漏洞&#xff0c;例如百度网盘被员工分享某些文件或者某些包含敏感信息的文件可以通过如谷歌、百度等搜索引擎通过特定语法搜索到。为了可以及时发现泄露的文件…

九泰智库 | 医械周刊- Vol.54

⚖️ 法规动态 国家药监局综合司发布医疗器械管理法草案征求意见稿 国家药监局综合司发布了《中华人民共和国医疗器械管理法&#xff08;草案征求意见稿&#xff09;》&#xff0c;公开征求意见&#xff0c;以加强医疗器械的管理并推动产业高质量发展。该草案共十一章190条&a…

深入解析财务报表:掌握重要财务指标的技巧

一、概述 财务报表中有大量信息&#xff0c;如果我们在分析时缺乏明确的方向或忽视了重点&#xff0c;就很容易在繁杂的数据中迷失方向。本文将深入探讨财务报表中的几个重要指标&#xff0c;帮助大家更有针对性地理解这些内容&#xff0c;包括如何分析资产负债率、解读净资产…

基于python的web框架 Flask 入门基础知识【1】

Flask是一个轻量级的可定制框架&#xff0c;使用Python语言编写&#xff0c;较其他同类型框架更为灵活、轻便、安全且容易上手。 目录 一、项目环境搭配以及安装运行 1.下载安装 2.最小的应用 3.运行应用 4.运行结果 4.1 外部可见的服务器 二、路由 三、http请求 3.1静…

无人机的核心技术!!!

无人机的核心技术涵盖了多个关键领域&#xff0c;这些技术共同支撑了无人机的稳定飞行、精准控制、高效数据传输以及多样化的应用功能。 1. 飞行控制技术 核心地位&#xff1a;飞行控制技术是无人机的核心关键技术之一&#xff0c;它确保了无人机在复杂飞行环境下的稳定性和安…

论文AI生成软件大PK!揭秘学术界的高效神器,选对了让你研究效率翻倍

在当今的学术界&#xff0c;研究与写作的压力不断攀升&#xff0c;论文的质量与数量往往成为衡量学者成就的重要指标。 然而&#xff0c;面对繁杂的研究任务和紧张的时间线&#xff0c;如何提升学术生产力成为了广大研究人员、学生及教育工作者的共同诉求。 在这样的背景下&a…

了解 JavaScript SEO

如果您是 SEO 专家&#xff0c;而不是开发人员&#xff0c;那么您可能不需要深入了解网站开发的所有复杂性。但是您确实需要了解基础知识&#xff0c;因为网站的编码方式对其性能有很大影响&#xff0c;因此对 SEO 潜力有很大影响。在关于 HTML 标签的文章中&#xff0c;我们介…

CTFHub SSRF靶场通关攻略(6-11)

FastCGI协议 首先写一个php的一句话木马&#xff0c;并进行base64编码 <?php eval($_POST[cmd]);?> 编码完成后把他写入shell.php文件中 echo "PD9waHAgQGV2YWwoJF9QT1NUW2NtZF0pOz8" | base64 -d > shell.php 使用Gopherus工具生成payload: 执命令 …

中国卫星影像图Level5

卫星地图&#xff0c;又称“卫星遥感图像或是卫星影像”&#xff0c;顾名思义&#xff0c;是借助卫星为媒介&#xff0c;向用户真实反馈地球地表面貌的图像。与传统意义的地图不同&#xff0c;卫星地图上看到的地表面貌是真实而实时的&#xff0c;因此&#xff0c;卫星地图的使…

2024-8-28作业C++/QT

代码&#xff1a; #include <iostream> #include <cstring> #include <array> #include <iomanip> using namespace std; int main() { //array<char,128> a; //array<char,128>::iterator iter; string str; getline(c…

工信部人工智能证书在哪报名?报名入口!

证书出台背景&#xff1a; 为进一步贯彻落实中共中央印发《关于深化人才发展体制机制改革的意见》和国务院印发《关于“十四五”数字经济发展规划》等有关工作的部署要求&#xff0c;深入实施人才强国战略和创新驱动发展战略&#xff0c;加强全国数字化人才队伍建设&#xff0…

探索音视频SDK在软件集成与私有化部署中的技术难题与解决策略

随着数字化转型的加速&#xff0c;音视频通信已成为众多行业不可或缺的一部分&#xff0c;从在线教育到企业协作&#xff0c;从电商直播到远程医疗&#xff0c;音视频SDK&#xff08;软件开发工具包&#xff09;作为实现这些功能的核心技术&#xff0c;其重要性日益凸显。然而&…

Threejs制作窗户透亮效果

应该经常看到这样的图片&#xff0c;昏暗的屋里&#xff0c;阳光通过窗户照射进来&#xff0c;将照射到的地方照亮&#xff0c;没有照到的地方依然昏暗&#xff0c; Threejs提供了一种特殊的灯光用来实现上图中的效果叫RectAreaLight&#xff0c;他是一种平面光源&#xff0c;平…

私域电商平台如何去选择适合自己的商业模式!

大家好 我是一家软件开发公司的产品经理 吴军 今天我给大家讲一下如何选择合适自己平台的商业模式 以及怎么样去进行商业模式的组合 做生意&#xff0c;找到合适的商业模式就像找到一把打开成功大门的钥匙。下面是一些简单易懂的建议&#xff0c;帮助您找到最适合您平台的商…

msvcp110.dll 文件丢失怎么处理?msvcp110.dll 科学分析与解决方法

曾遇到因 "msvcp110.dll 文件丢失" 错误而无法启动应用程序的情况吗&#xff1f;这类问题通常出现在尝试打开使用 Microsoft Visual C 2012 开发的软件时。msvcp110.dll是一个属于 Microsoft Visual C Redistributable for Visual Studio 2012 的重要组件&#xff0c…

清爽舒服的蓝牙耳机有哪些?四款佩戴舒适的开放式耳机推荐

作为耳机重度患者来说&#xff0c;如果是夏天出行想要不黏腻又舒服干爽的耳机&#xff0c;那我会很推荐蓝牙耳机中的开放式耳机。 因为开放式耳机使用起来特别干爽舒服&#xff0c;‌这主要是因为它的开放式设计&#xff0c;无需入耳&#xff0c;能够让空气在耳道中自由流通&a…