深圳晶彩智能ESP32-2432S028R实时观察LVGL9效果

news2024/9/22 13:29:04

深圳晶彩智能ESP32-2432S028R概述:

深圳晶彩智能出品ESP32-32432S028R为2.8寸彩色屏采用分辨率320x240彩色液晶屏,驱动芯片是ILI9431。板载乐鑫公司出品ESP-WROOM-32,Flash 4M。型号尾部“R”标识电阻膜的感压式触摸屏,驱动芯片是XPT2046。
他的屏幕驱动芯片ILI9431和电阻触碰芯片XPT2046没有采用共用SPI的接法,就不能直接使用TFT_eSPI库驱动,电阻触碰芯片采用第三方XPT2046_Touchscreen库。
这款产品发布后,由于其制作精良价格优惠,受到了国际玩家的普遍追捧,各位大虾称其为“Cheap Yellow Display”,简称CYD。
在这里插入图片描述
这是一个能干活的开发板,用于为您的物联网项目构建彩色显示屏,带有TFT屏幕的单独ESP32板更方便和实用,明显越升二次开发产品的格调。

在这里插入图片描述

完美得到LVGL9和lovyanGFX库支持

LVGL是最流行的免费和开源嵌入式图形库,可为任何MCU, MPU和显示类型创建漂亮的ui。
从消费电子产品到工业自动化,任何应用程序都可以利用LVGL的30多个内置小部件,100多个样式属性,web启发的布局和支持多种语言的排版系统。
LovyanGFX 是一个高效且功能丰富的图形库,专为连接到ESP32、ESP8266和ATSAMD51的显示器设计。它兼容多种通讯协议,如SPI、I2C和8位并行接口,适用于各种LCD、OLED和EPD显示屏。这个库不仅提供了与流行的AdafruitGFX和TFT_eSPI类似的功能,而且在速度和特性上有了显著提升,让开发变得更加便捷。
LGFX_AUTODETECT类中自动识别多款“Cheap Yellow Display”,其中就包括ESP32-2432S028R,本示例就结合这两个库,使用Arduino IDE的方法,用最快捷的方法让各位玩家来适配LVGL9,直接在液晶屏上操作各种组建,把构想变成实景图。

Arduino IDE SDK和LVGL9,LovyanGFX的版本

Arduino IDE SDK 3.0.2版本
在这里插入图片描述
lvgl 9.1.0版本
在这里插入图片描述
LovyanGFX 1.1.16版本
在这里插入图片描述

配置LVGL9库

1,修改 lv_conf.h

LVGL 有一个名为 lv_conf.h 的配置文件。当安装 LVGL 时,请遵循以下配置步骤:
进入已安装的 Arduino 库目录。
进入 lvgl 并复制 lv_conf_template.h 到Arduino 库目录中,该文件应位于 lvgl 库同级文件夹。然后重命名为 lv_conf.h 。
下图可见 lv_conf.h 的布局:
在这里插入图片描述
用Notepad++对 lv_conf.h 修改:
默认设置是“0”,设置为“1”以启用内容。

第15行 #if 1 

如果lvgl设置在屏幕上显示当前帧率(FPS):

第751行 #define LV_USE_SYSMON   1
第764行 #define LV_USE_PERF_MONITOR 1

在这里插入图片描述
本示例全面演示LVGL9的examples,widgets和demos,需要分别置1启用。譬如允许 examples构建示例:

第929行 #define LV_BUILD_EXAMPLES 1

2,移动examples和demos库的位置。
将Arduino\libraries\lvgl里的examples和demos库拖曳到src文件夹里面:
在这里插入图片描述
3,修改lv_examples.h
用Notepad++对C:\Users\用户名\Documents\Arduino\libraries\lvgl\src\examples\lv_examples.h修改为:

第16行 #include "lvgl.h"

用Notepad++对C:\Users\用户名\Documents\Arduino\libraries\lvgl\src\demos\lv_demos.h修改为:

第16行 #include "lvgl.h"

用最简单的程序展示LVGL9的绚丽功能

#include <SPI.h>                                      // SPI Library
#include <lvgl.h>                                     // LVGL9
#define LGFX_AUTODETECT
#include <LovyanGFX.hpp>

static const uint32_t screenWidth = 320;                   // LCD宽度
static const uint32_t screenHeight = 240;                  // LCD高度
static uint8_t draw_buf[screenWidth * screenHeight / 10];  // 缓冲器
static ulong lvgl_tick_millis = millis();                  // tick

#include <examples\lv_examples.h>                 // examples
//#include <examples\widgets\lv_example_widgets.h>  // widgets
//#include <demos\lv_demos.h>                       // demos

LGFX tft;

void init_display() {
  static lv_display_t *disp;
  disp = lv_display_create(screenWidth, screenHeight);
  lv_display_set_flush_cb(disp, flush);
  lv_display_set_buffers(disp, draw_buf, NULL, sizeof(draw_buf),
                         LV_DISPLAY_RENDER_MODE_PARTIAL);
}

void flush(lv_display_t *disp, const lv_area_t *area, uint8_t *px_map) {
  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 *)px_map, w * h, true);
  tft.writePixelsDMA((lgfx::rgb565_t *)px_map, w * h);  // LGFX
  tft.endWrite();
  lv_display_flush_ready(disp);
}

void init_touch() {
  lv_indev_t *indev = lv_indev_create();
  lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER);  
  lv_indev_set_read_cb(indev, my_touchpad_read);
}

void my_touchpad_read(lv_indev_t *indev, lv_indev_data_t *data) {
  uint16_t touchX, touchY;
  bool touched = tft.getTouch(&touchX, &touchY);
  if (!touched) {
    data->state = LV_INDEV_STATE_REL;
    return;
  }
  if (touchX < screenWidth && touchY < screenWidth) {
    data->state = LV_INDEV_STATE_PR;
    data->point.x = touchX;
    data->point.y = touchY;   
  }
}

void setup() {
  tft.begin();
  tft.setRotation(1);
  tft.fillScreen(TFT_BLUE);
  lv_init();       // lvgl 初始化
  init_display();  // 显示和缓冲初始化
  init_touch();    // 触碰初始化
 
  // demos ------------------------------------------------------------
  //lv_demo_widgets();          // 34% memory used
  //lv_demo_benchmark();        // 38% memory used
  //lv_demo_keypad_encoder();   // 24% memory used
  //lv_demo_music();            // 56% memory used
  //get_started -------------------------------------------------------
  //lv_example_get_started_3(); // 2 button
  //lv_example_get_started_1(); // Hello World
  //lv_example_get_started_2(); // button couter
  //lv_example_get_started_4(); // Slider
  //others ------------------------------------------------------------
  //lv_example_observer_1();    // Slider
  //lv_example_observer_2();    // logged out
  //lv_example_observer_3();    // time & set
  lv_example_observer_4();    // Slider & Button
  //lv_example_observer_5();    // update
  //lv_example_observer_6();    // 10 button
  //widgets -----------------------------------------------------------
  //lv_example_image_3();
  //lv_example_animimg_1();
  //lv_example_arc_1();
  //lv_example_arc_2();
  //lv_example_bar_1();
  //lv_example_bar_2();
  //lv_example_bar_3();
  //lv_example_bar_4();
  //lv_example_bar_5();
  //lv_example_bar_6();
  //lv_example_bar_7();
  //lv_example_button_1();
  //lv_example_button_2();  // 24% memory used
  //lv_example_button_3();
  //lv_example_buttonmatrix_1();
  //lv_example_buttonmatrix_2();
  //lv_example_buttonmatrix_3();
  //lv_example_calendar_1();
  //lv_example_canvas_1 fail
  //lv_example_canvas_2();
  //lv_example_canvas_3();
  //lv_example_canvas_4();
  //lv_example_canvas_5();
  //lv_example_canvas_6();
  //lv_example_canvas_7();
  //lv_example_canvas_8 fail
  //lv_example_chart_1();
  //lv_example_chart_2();
  //lv_example_chart_3();
  //lv_example_chart_4();
  //lv_example_chart_5();
  //lv_example_chart_6();
  //lv_example_chart_7();
  //lv_example_chart_8();
  //lv_example_checkbox_1();
  //lv_example_checkbox_2();
  //lv_example_dropdown_1();
  //lv_example_dropdown_2();
  //lv_example_dropdown_3();
  //lv_example_image_1();
  //lv_example_image_2();
  //lv_example_image_4();
  //lv_example_imagebutton_1_fail
  //lv_example_keyboard_1();
  //lv_example_keyboard_2();
  //lv_example_label_1();
  //lv_example_label_2();
  //lv_example_label_3 fail
  //lv_example_label_4 fail
  //lv_example_label_5();
  //lv_example_led_1
  //lv_example_line_1
  //lv_example_menu_1
  //lv_example_menu_2
  //lv_example_menu_3
  //lv_example_menu_4
  //lv_example_menu_5
  //lv_example_msgbox_1
  //lv_example_obj_1
  //lv_example_obj_2
  //lv_example_roller_1
  //lv_example_roller_2 fail
  //lv_example_roller_3 fail
  //lv_example_scale_1();
  //lv_example_scale_2();
  //lv_example_scale_3();
  //lv_example_scale_4();
  //lv_example_scale_5();
  //lv_example_slider_1();
  //lv_example_slider_2();
  //lv_example_slider_3();
  //lv_example_slider_4();
  //lv_example_span_1();
  //lv_example_spinbox_1();
  //lv_example_spinner_1();
  //lv_example_switch_1();
  //lv_example_table_1();
  //lv_example_table_2();
  //lv_example_tabview_1();
  //lv_example_tabview_2();
  //lv_example_textarea_1();
  //lv_example_textarea_2();
  //lv_example_textarea_3();
  //lv_example_tileview_1();
  //lv_example_tileview_2 fail
  //lv_example_win_1();  
}

void loop() {
  lv_task_handler();
  unsigned long tick_millis = millis() - lvgl_tick_millis;
  lvgl_tick_millis = millis();
  lv_tick_inc(tick_millis);
  yield();
  delay(5);
}

多选下拉列表效果展示:

【深圳晶彩智能ESP32-2432S028R实时观察LVGL9效果】
https://www.bilibili.com/video/BV1tTa3eSExr?vd_source=7350ed30aaee73c2cb1cac26a00a8b30

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

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

相关文章

容器:stack

以下是关于stack容器的一些总结&#xff1a; stack容器比较简单&#xff0c;主要包括&#xff1a; 1、构造函数&#xff1a;stack [staName] 2、添加、删除元素: push() 、pop() 3、获取栈顶元素&#xff1a;top() 4、获取栈的大小&#xff1a;size() 5、判断栈是否为空&#x…

深入刨析Redis存储技术设计艺术(二)

三、Redis主存储 3.1、存储相关结构体 redisServer:服务器 server.h struct redisServer { /* General */ pid_t pid; /* Main process pid. */ pthread_t main_thread_id; /* Main thread id */ char *configfile; /* Absolut…

图书管理系统 全栈项目分享

文章目录 项目简要说明项目开源地址b站视频演示技术栈部分效果展示 项目简要说明 本项目是我的数据库课设&#xff0c;个人感觉做得还行&#xff0c;目前项目开源&#xff0c;README文档里有项目的介绍和使用说明&#xff0c;这里就不一一赘述了 项目开源地址 github - libr…

nginx(三)—从Nginx配置熟悉Nginx功能

一、 Nginx配置文件结构 ... #全局块events { #events块... }http #http块 {... #http全局块server #server块{ ... #server全局块location [PATTERN] #location块{...}location [PATTERN] {...}}server{...}... #http全局块 …

NoSQL 之 Redis 配置与常用命令

一、关系型数据库与非关系型数据库 1、数据库概述 &#xff08;1&#xff09;关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上&#xff0c;一般面向于记 录。 SQL 语句&#xff08;标准数据查询语言&am…

ONLYOFFICE 8.1——全新桌面编辑器,相见恨晚

目录 前言 一、链接 ONLYOFFICE 8.1版本 官网下载链接&#xff1a; ONLYOFFICE 在线工具&#xff1a; 下载版本推荐&#xff1a; 二、使用体验 1. 界面设计&#xff1a; 2. 文档编辑功能&#xff1a; 3. 电子表格功能&#xff1a; 4. 演示文稿功能&#xff1a; 5.PDF编…

使用 AlphaZero 和 Tabu 搜索查找越来越大的极值图

使用 AlphaZero 和 Tabu 搜索查找越来越大的极值图 AlphaZero 方法最佳研究&#xff08;第1部分&#xff09; 文章目录 一、说明二、引言三、预备知识四、方法4.1 AlphaZero4.2 禁忌搜索 五、实验与结果六、讨论七、附录A 一个例子B 问题背景 一、说明 人工智能的树和图的检索问…

Nacos源码分析:心跳机制、健康检查、服务发现、AP集群

文章目录 心跳机制与服务健康检查NacosClient端NacosServer端NacosServer端健康检查 服务发现NacosClient端NacosServer端 AP集群从源码启动集群心跳设计原理各节点状态同步服务实例数据同步服务实例状态变动同步 心跳机制与服务健康检查 官方文档&#xff1a;发送某个实例的心…

SpringBoot新手快速入门系列教程四:创建第一个SringBoot的API

首先我们用IDEA新建一个项目&#xff0c;请将这些关键位置按照我的设置设置一下 接下来我将要带着你一步一步创建一个Get请求和Post请求&#xff0c;通过客户端请求的参数&#xff0c;以json格式返回该参数{“message”:"Hello"} 1,先在IDE左上角把这里改为文件模式…

MySQL基础篇(三)数据库的修改 删除 备份恢复 查看连接情况

对数据库的修改主要指的是修改数据库的字符集&#xff0c;校验规则。 将test1数据库字符集改为gbk。 数据库的删除&#xff1a; 执行完该数据库就不存在了&#xff0c;对应数据库文件夹被删除&#xff0c;级联删除&#xff0c;里面的数据表全部被删除。 注意&#xff1a;不要随…

【IO】文件操作

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. 文件1.1 认识文件1.2 分清操作的是内存还是硬盘1.3 路径1.3.1 目录结构1.3.2 相对和绝对路径 1.4 文本文件…

Kafka系列之Kafka知识超强总结

一、Kafka简介 Kafka是什么 Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff08;消息引擎系统&#xff09;&#xff0c;它可以处理消费者在网站中的所有动作流数据。 这种动作&#xff08;网页浏览&#xff0c; 搜索和其他用户的行动&#xff09;是在现代网络上的许多社…

Feign-未完成

Feign Java中如何实现接口调用&#xff1f;即如何发起http请求 前三种方式比较麻烦&#xff0c;在发起请求前&#xff0c;需要将Java对象进行序列化转为json格式的数据&#xff0c;才能发送&#xff0c;然后进行响应时&#xff0c;还需要把json数据进行反序列化成java对象。 …

基于顺序表的通讯录实现

一、前言 基于已经学过的顺序表&#xff0c;可以实现一个简单的通讯录。 二、通讯录相关头文件 //Contact.h #pragma once#define NAME_MAX 20 #define TEL_MAX 20 #define ADDR_MAX 20 #define GENDER_MAX 20typedef struct PersonInfo {char name[NAME_MAX];char gender[G…

node的下载、安装、配置和使用(node.js下载安装和配置、npm命令汇总、cnpm的使用)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。 愿将腰下剑,直为斩楼兰。 ——《塞下曲》 文章目录 一、node.js的下载、安装和配置1. node.js下…

Latex--制作幻灯片

目录 1.基本介绍 &#xff08;1&#xff09;案例引入 &#xff08;2&#xff09;相关说明 &#xff08;3&#xff09;控制顺序 &#xff08;4&#xff09;帧环境的创建 &#xff08;5&#xff09;内置主题 &#xff08;6&#xff09;生成标题页面 1.基本介绍 &#xff0…

磁盘就是一个超大的Byte数组,操作系统是如何管理的?

磁盘在操作系统的维度看&#xff0c;就是一个“超大的Byte数组”。 那么操作系统是如何对这块“超大的Byte数组”做管理的呢&#xff1f; 我们知道在逻辑上&#xff0c;上帝说是用“文件”的概念来进行管理的。于是&#xff0c;便有了“文件系统”。那么&#xff0c;文件系统…

vue侦听器watch()

侦听器watch&#xff08;&#xff09; 侦听器侦听数据变化&#xff0c;我们可以使用watch 选项在每次响应式属性变化时触发一个函数。 <template><h3>侦听器watch</h3><hr> <p>{{nessage}}</p> <button click"exchage">…

Fill - UVA 10603

网址如下&#xff1a; Fill - UVA 10603 - Virtual Judge (vjudge.net) 感觉有点浮躁&#xff0c;没法完全将思绪投入题的思考中 脑袋糊糊的 一道bfs题 代码如下&#xff1a; #include<queue> #include<cstdio> #include<cstring> #include<vector&g…

计算机网络——数据链路层(以太网扩展、虚拟局域网、高速以太网)

在许多情况下&#xff0c;我们希望把以太网的覆盖范围扩展。本节先讨论在物理层把以太网扩展&#xff0c;然后讨论在数据链路层把以太网扩展。这种扩展的以太网在网络层看来仍然是一个网络。 在物理层扩展以太网 现在&#xff0c;扩展主机和集线器之间的距离的一种简单方法就是…