魔改 ESP32-CAM开发板,加上一个圆形显示屏,让它成为你的个性化 GUI 神器

文摘   2024-10-31 00:02   湖南  

简介

ESP32 是一款功能强大的物联网微控制器芯片,广泛应用于各种智能设备和物联网应用中。其中,使用 ESP32 驱动 SPI 屏幕并运行 LVGL 图形界面库是一个非常常见的应用场景。本文将详细介绍如何在 ESP32 上实现这一功能,为读者提供一个全面的指南。

准备工作

在开始动手之前,我们需要准备好以下材料和工具:

  1. 1. ESP32 开发板

  2. 2. SPI 屏幕模块

  3. 3. 杜邦线

  4. 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. 1. 如果使用 Arduino IDE,直接点击上传按钮即可完成编译和烧录。

  2. 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


DIY太阳系
专注分享嵌入式系统、电子产品diy,iot、机器人等相关知识!
 最新文章