65.9K
CodeProject 正在变化。 阅读更多。
Home

在 PlatformIO 中使用 GFX

starIconstarIconstarIconstarIconstarIcon

5.00/5 (5投票s)

2022 年 3 月 13 日

MIT

3分钟阅读

viewsIcon

33367

downloadIcon

154

利用 PlatformIO 存储库轻松为您的项目添加 GFX。

GFX on a color E-Paper display

引言

注意:本文不介绍 GFX。 您可以在此处找到 GFX 的文档。

您可以在此处找到通用指南和演示,以及目前不在 PlatformIO 存储库中的驱动程序,因为我还需要对它们进行更多工作。

本文旨在让您熟悉如何通过其库导入功能从 PlatformIO 使用 GFX。 使用此功能,您不再需要手动将支持文件从 gfx_demo 中复制出来以在您的项目中使用。 相反,您只需在 platformio.ini 中引用所需的驱动程序,PlatformIO 就会完成繁重的工作。

虽然 GFX 支持其他平台,但本文的演示是为 ESP32 编写的。

使用这个烂摊子

这里的技巧是编辑你的 platformio.ini 文件

[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。 如果您之前在项目中使用过 GFX,您应该对这些很熟悉。 它将 C++ 标准从 GNU C++11(默认)更改为 GNU C++14,这是 GFX 编译所需要的。

完成之后,您可以在代码中执行类似这样的操作

// ensure the following is configured for your setup
#ifdef I2C // define I2C if using I2C. Otherwise defaults to 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 THE HEADERS:
#include <Arduino.h>
#include <tft_io.hpp>
#include <ssd1306.hpp>
#include <gfx_cpp14.hpp>

// IMPORT THE NAMESPACES:
using namespace arduino;
using namespace gfx;

// DECLARE THE BUS:
// bus setup is considerably simpler
// if we weren't defining the pins.
// you can use tft_i2c and tft_spi
// templates instead of the *_ex
// ones to use default pins
// the _ex ones aren't available on
// some platforms anyway.
#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
// below is not needed since the SSD1306 
// doesn't do async but this is boilerplate
#ifdef OPTIMIZE_DMA
                            ,(LCD_WIDTH*LCD_HEIGHT)/8+8
#endif
                            >;
#endif

// DECLARE THE DRIVER:
using lcd_type = ssd1306<LCD_WIDTH,
                        LCD_HEIGHT,
                        bus_type,
                        0, // Rotation
                        4, // Dither 4-bit grayscale
                        LCD_ADDRESS,
                        LCD_VDC_3_3,
                        LCD_WRITE_SPEED_PERCENT,
                        PIN_NUM_DC,
                        PIN_NUM_RST,
                        true>;

// INSTANTIATE THE DRIVER:
lcd_type lcd;

// (Optional) DECLARE THE COLORS:
using lcd_color = color<typename 
                        lcd_type::pixel_type>;

// You can now draw to lcd using draw:: like draw::filled_rectangle

由于不同设备驱动程序具有不同的特性,因此驱动程序实例化对于不同的设备驱动程序略有不同,当然,您在 platformio.ini 中的 lib_deps 条目必须引用适当的驱动程序,但除此之外,对于大多数显示器来说,代码都是相同的。 我在示例代码中包含了一个 8 位并行总线的示例,但由于篇幅限制以及因为 SSD1306 没有我至少见过的这种配置,所以上面没有显示。

截至本文撰写之时,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
  • ESP32 Lilygo TTGO
  • ESP32 Lilygo T5 4.7 英寸
  • RA8875(无 alpha 混合)
  • MAX7219
  • Wio Terminal ILI9341
  • PWM LED 控制器
  • RGB PWM LED 控制器

请参阅 platformio.ini 以获取包含这些驱动程序所需的 lib_deps 行。

gfx_demo 中也有 ESP-IDF 驱动程序,但我正在腾出时间将它们移动到此存储库,或者可能将它们作为 ESP-IDF 组件发布。 我还没有决定。

演示代码

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

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

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

main.cpp 包含主要的绘图代码。 您会注意到,除了 MAX7219 和 PWM 控制器等差异很大的显示器之外,它对于每个设备基本上都是相同的。

历史

  • 2022 年 3 月 13 日 - 首次提交
  • 2022 年 3 月 22 日 - 更新以引用新驱动程序以及更多驱动程序。
  • 2022 年 3 月 25 日 - 添加了对 Lilygo T5 4.7 英寸的支持
  • 2022 年 3 月 31 日 - 更新了更多驱动程序
  • 2022 年 4 月 2 日 - 更新了 GFX 版本
  • 2022 年 4 月 9 日 - 更新了 GFX 版本
  • 2022 年 4 月 13 日 - 更新了 GFX 版本
  • 2022 年 4 月 16 日 - 更新了 GFX 版本
  • 2022 年 4 月 19 日 - 更新了 GFX 版本
  • 2022 年 4 月 22 日 - 更新了 GFX 版本并修复了演示以使用新的 SSD1306 驱动程序版本
© . All rights reserved.