简介
ESP32 是一款功能强大的物联网微控制器芯片,广泛应用于各种智能设备和物联网应用中。其中,使用 ESP32 驱动 SPI 屏幕并运行 LVGL 图形界面库是一个非常常见的应用场景。本文将详细介绍如何在 ESP32 上实现这一功能,为读者提供一个全面的指南。
准备工作
在开始动手之前,我们需要准备好以下材料和工具:
1. ESP32 开发板
2. SPI 屏幕模块
3. 杜邦线
4. PC 电脑(安装 Arduino IDE 或 ESP-IDF 开发环境)
硬件连接
首先,我们需要将 ESP32 开发板和 SPI 屏幕模块进行物理连接。根据屏幕模块的接口定义,将其与 ESP32 开发板上的 SPI 接口相对应,连接如下:
• ESP32 MOSI --> 屏幕 MOSI (SDA)
• ESP32 MISO --> 屏幕 MISO (SDI)
• ESP32 SCL --> 屏幕 SCL
• ESP32 DC --> 屏幕 DC
• ESP32 CS --> 屏幕 CS
• ESP32 GND --> 屏幕 GND
• ESP32 3.3V --> 屏幕 VCC
连接完成后,我们就可以开始编程了。注意接口名称标注可能不同,有的会有SDA、SDI等标注名称,请注意与与MOSI和MISO的对应关系。ESP32上除GND和3.3V外,一般都使用GPIO接口进行连接,
软件编程
安装GFX库和 LVGL 库
GFX是一个强大的屏幕驱动库、LVGL 是一个功能强大的开源图形界面库,非常适合嵌入式设备使用。我们需要先将GFX和 LVGL 库安装到 ESP32 开发环境中。
以 Arduino IDE 为例,可以通过库管理器安装GFX和 LVGL 库。打开 Arduino IDE,进入 "工具" > "管理库",分别搜索“GFX for Arduino”和 "LVGL",然后点击安装即可。
屏幕GFX驱动
GFX屏幕驱动的内容主要是屏幕管脚与ESP32上的GPIO管脚的对应关系:如14 /* DC */, 表示GPIO14与屏幕DC管脚相连。
#include <Arduino_GFX_Library.h>
#define GFX_BL -1
Arduino_DataBus *bus = new Arduino_ESP32SPI(14 /* DC */, 2 /* CS */, 13 /* SCK */, 15 /* MOSI */, GFX_NOT_DEFINED /* MISO */);
Arduino_GFX *gfx = new Arduino_GC9A01(bus, GFX_NOT_DEFINED /* RST */, 0 /* rotation */, true /* IPS */); //GC9A01
编写 LVGL 示例程序
接下来,我们编写一个简单的 LVGL 示例程序,在 ESP32 上运行 LVGL 界面。
首先,我们需要包含 LVGL 头文件<lvgl.h>,然后,编写 LVGL 初始化和界面绘制的代码:
lv_init();
screenWidth = gfx->width();
screenHeight = gfx->height();
Serial.println(gfx->width());
Serial.println(gfx->height());
disp_draw_buf1 = (lv_color_t *)heap_caps_malloc(sizeof(lv_color_t) * screenWidth * screenHeight / 8, MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT);
disp_draw_buf2 = (lv_color_t *)heap_caps_malloc(sizeof(lv_color_t) * screenWidth * screenHeight / 8, MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT);
if (!disp_draw_buf1 && !disp_draw_buf2) {
Serial.println("LVGL disp_draw_buf allocate failed!");
} else {
lv_disp_draw_buf_init(&draw_buf, disp_draw_buf1, disp_draw_buf2, screenWidth * screenHeight / 8);
/* Initialize the display */
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);
在这个示例程序中,我们首先初始化了 LVGL 库,然后初始化了显示和输入设备驱动。接下来,我们调用 lv_example_animimg_1()
函数,在 LVGL 界面上创建了一个居中显示的动画。最后,我们进入 LVGL 事件循环,让界面持续运行。
编译和烧录
完成编程后,我们需要将代码编译并烧录到 ESP32 开发板上。根据使用的开发环境,可以使用以下方式进行编译和烧录:
1. 如果使用 Arduino IDE,直接点击上传按钮即可完成编译和烧录。
2. 如果使用 ESP-IDF 开发环境,可以在终端中执行
idf.py build
和idf.py flash
命令完成编译和烧录。
运行效果
烧录完成后,通电启动 ESP32 开发板,就可以看到 LVGL 界面在 SPI 屏幕上显示出来了。此时,你应该能够看到一个居中显示的动画。
进阶应用
除了这个简单的示例程序,LVGL 还提供了丰富的 API 和组件,可以用于构建各种复杂的图形界面。你可以参考 LVGL 的官方文档,学习更多 LVGL 的使用方法,并尝试开发出自己的 GUI 应用程序。
总结
通过本文的介绍,相信您已经掌握了如何在 ESP32 上驱动 SPI 屏幕并运行 LVGL 图形界面的整个过程。从硬件连接到软件编程,再到最终的运行效果,每一步都有详细的说明。希望这个指南对您的 ESP32 开发有所帮助。
项目地址:https://github.com/airooter/esp-lvgl