使用PlatformIO和GFX库进行图形显示开发

在嵌入式开发中,图形用户界面(GUI)的实现往往能极大提升用户体验。GFX库是一个功能强大的图形库,支持多种显示设备和平台。本文将介绍如何利用PlatformIO环境,结合GFX库,进行图形显示的开发。

PlatformIO与GFX库简介

PlatformIO是一个集成开发环境(IDE),它提供了一个统一的平台来管理项目依赖、编译和上传代码。GFX库则提供了丰富的图形绘制功能,支持多种显示设备。通过结合使用这两个工具,可以简化图形显示项目的配置和开发过程。

配置PlatformIO项目

首先,需要配置PlatformIO项目,以便使用GFX库。这主要涉及到修改platformio.ini文件。以下是一个针对ESP32平台,使用SSD1306驱动的配置示例:

[env:esp32-ssd1306] platform = espressif32 board = node32s framework = arduino monitor_speed = 115200 upload_speed = 921600 lib_deps = codewitch-honey-crisis/htcw_ssd1306 lib_ldf_mode = deep build_unflags=-std=gnu++11 build_flags=-std=gnu++14

在上述配置中,lib_deps行告诉PlatformIO需要获取指定的库及其依赖。这里获取了SSD1306驱动的最新版本,它也会拉取GFX库和支持的总线I/O库。lib_ldf_mode = deep确保PlatformIO能找到GFX所需的框架头文件。build_unflagsbuild_flags用于更改C++标准,从默认的GNU C++11更改为GNU C++14,这是GFX库编译所需的。

编写代码

配置完成后,可以开始编写代码。以下是一个简单的示例,展示了如何初始化SSD1306显示屏并绘制一个填充矩形:

// 确保以下配置适合设置 #ifdef I2C // 如果使用I2C,则定义I2C。否则默认为SPI #define LCD_PORT 0 #define PIN_NUM_SDA 21 #define PIN_NUM_SCL 22 #define PIN_NUM_RST -1 #define PIN_NUM_DC -1 #define LCD_WRITE_SPEED_PERCENT 800 // 800Khz #define LCD_ADDRESS 0x3C #else #define LCD_HOST VSPI #define PIN_NUM_CS 5 #define PIN_NUM_MOSI 23 #define PIN_NUM_MISO -1 #define PIN_NUM_CLK 18 #define PIN_NUM_DC 2 #define PIN_NUM_RST 4 #define LCD_ADDRESS 0 #define LCD_WRITE_SPEED_PERCENT 200 // 20Mhz #endif #define LCD_WIDTH 128 #define LCD_HEIGHT 64 //#define LCD_VDC_5 #if defined(LCD_VDC_5) #define LCD_VDC_3_3 false #else #define LCD_VDC_3_3 true #endif // 包含头文件 #include <Arduino.h> #include <tft_io.hpp> #include <ssd1306.hpp> #include <gfx_cpp14.hpp> // 导入命名空间 using namespace arduino; using namespace gfx; // 声明总线 #ifdef I2C using bus_type = tft_i2c_ex<LCD_PORT, PIN_NUM_SDA, PIN_NUM_SCL>; #else using bus_type = tft_spi_ex<LCD_HOST, PIN_NUM_CS, PIN_NUM_MOSI, PIN_NUM_MISO, PIN_NUM_CLK, SPI_MODE0, false>; #endif // 声明驱动器 using lcd_type = ssd1306<LCD_WIDTH, LCD_HEIGHT, bus_type, 0, 4, LCD_ADDRESS, LCD_VDC_3_3, LCD_WRITE_SPEED_PERCENT, PIN_NUM_DC, PIN_NUM_RST, true>; // 实例化驱动器 lcd_type lcd; // (可选) 声明颜色 using lcd_color = color<typename lcd_type::pixel_type>; // 现在可以使用draw::绘制到lcd,例如draw::filled_rectangle

驱动器实例化对于不同的设备驱动略有不同,因为它们具有不同的特性。当然,lib_deps条目在platformio.ini中必须引用适当的驱动程序,但除此之外,对于大多数显示设备,代码是相同的。

支持的驱动程序

截至本文撰写时,PlatformIO库中已有多个驱动程序,随着时间的推移,会有更多驱动程序被添加。以下是一些示例:

  • ILI9341(SPI和8位并行)
  • ST7789
  • ST7735(目前仅支持128x128绿色标签)
  • SSD1306(I2C或SPI)
  • SSD1351(不支持alpha混合)
  • Waveshare 4.2英寸灰度电子纸
  • Waveshare 2.13英寸(B)3色电子纸
  • Waveshare 1.54英寸(B, 第2版)3色电子纸
  • Waveshare 5.65英寸(F)7色电子纸(需要WROVER或其他PSRAM)
  • ESP32 ESP-WROVER-DEVKIT 4.1
  • ESP32Lilygo TTGO
  • ESP32Lilygo T5 4.7英寸
  • RA8875(不支持alpha混合)
  • MAX7219
  • Wio Terminal ILI9341
  • PWM LED控制器
  • RGB PWM LED控制器

查看platformio.ini中的lib_deps行,了解包含这些驱动程序所需的库。

演示代码

演示代码是为ESP32设计的,包含了多个显示设备和配置的绘图代码。需要选择与设备相匹配的配置。

config.hpp文件包含了引脚和驱动程序的所有配置信息。虽然有点混乱,但它基本上隐藏了不同驱动程序之间的大部分差异。

*.h文件是演示中使用的jpg和字体数据,嵌入在程序空间闪存中。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485