在嵌入式开发中,图形用户界面(GUI)的实现往往能极大提升用户体验。GFX库是一个功能强大的图形库,支持多种显示设备和平台。本文将介绍如何利用PlatformIO环境,结合GFX库,进行图形显示的开发。
PlatformIO是一个集成开发环境(IDE),它提供了一个统一的平台来管理项目依赖、编译和上传代码。GFX库则提供了丰富的图形绘制功能,支持多种显示设备。通过结合使用这两个工具,可以简化图形显示项目的配置和开发过程。
首先,需要配置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_unflags
和build_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库中已有多个驱动程序,随着时间的推移,会有更多驱动程序被添加。以下是一些示例:
查看platformio.ini
中的lib_deps
行,了解包含这些驱动程序所需的库。
演示代码是为ESP32设计的,包含了多个显示设备和配置的绘图代码。需要选择与设备相匹配的配置。
config.hpp
文件包含了引脚和驱动程序的所有配置信息。虽然有点混乱,但它基本上隐藏了不同驱动程序之间的大部分差异。
*.h
文件是演示中使用的jpg和字体数据,嵌入在程序空间闪存中。