Bodmer/TFT_eSPI

GitHub: Bodmer/TFT_eSPI

一款针对 32 位嵌入式 MCU 优化的图形库,解决在资源受限设备上高效绘制与反锯齿渲染的难题。

Stars: 4692 | Forks: 1350

一个 ["Discussions"](https://github.com/Bodmer/TFT_eSPI/discussions) 功能已添加,用于问答等。请仅使用 ["Issues"](https://github.com/Bodmer/TFT_eSPI/issues) 标签来报告库相关的问题。谢谢! # 新闻 1. ESP32 S3 的 DMA 功能现已在 ESP-IDF 版本大于 2.0.14 时可用。这已在 Arduino 3.3.6 开发板包上进行测试。ChatGPT 给了我一个修改提示(使用 `SPI_DMA_CH_AUTO` 进行寄存器选择),但 AI 生成的回复确实包含了一些错误信息(主要是关于一些(大多无害的)寄存器位设置)! 2. Create_font Processing 草图已更新,可自动生成完整的 C 头文件。还可以禁用 Processing 草图中字体文件夹的自动打开。(感谢 Pierre-Loup Martin) 3. 已为 Seeed XIAO 圆屏版、LilyGo T-Embed S3、LilyGo_T_QT_Pro_S3、ESP32 S3 Box 和 ESP32_S3_Box_Lite 添加新的开发板配置文件。现已支持带有 ESP32 S3 的“RPi”接口风格开发板。 4. 新增用于绘制平滑(抗锯齿)弧线、圆形和圆角矩形轮廓的函数。提供了“Smooth Graphics”示例文件夹中的新示例。弧线可以绘制为带抗锯齿或不带抗锯齿(渲染更快)的形式。弧线端点可以是直线或圆角。弧线绘制算法使用优化的定点 `sqrt()` 函数,以提高没有硬件浮点单元(例如 RP2040)的处理器的性能。以下是两张演示图片,左侧是带圆端点的平滑(抗锯齿)弧线,右侧是在同一 240x240 TFT 上禁用平滑(无抗锯齿)的相同分辨率截图: ![arcs](https://github.com/Bodmer/Github-images/blob/main/aa_arc_240x240.png) ![pixelated_arcs](https://github.com/Bodmer/Github-images/blob/main/no_aa_arc_240x240.png) 这里使用平滑弧线在 320x240 TFT 上创建了抗锯齿仪表: ![arcs](https://github.com/Bodmer/Github-images/blob/main/xarc_meters_320x240.png) 5. 有一个由 [takkaO](https://github.com/takkaO/OpenFontRender) 开发的新兼容库,可用于在 TFT 屏幕(或 Sprite)上渲染 TrueType 字体。该库提供紧凑的字体文件,并支持完全可缩放的抗锯齿字形。还支持左、中、右对齐文本。我已为 TFT_eSPI 添加了特定示例,并在 RP2040 和 ESP32 处理器上进行了测试,ESP8266 因字形渲染复杂导致 RAM 不足。以下是在 320x480 TFT 上使用单个 12k 字节字体文件渲染完全抗锯齿字体的演示屏幕: ![ttf_font_demo](https://i.imgur.com/bKkilIb.png) 6. 已新增用于滑块、按钮、图表和仪表的 GUI 示例。这些示例需要一个新的支持库: [TFT_eWidget](https://github.com/Bodmer/TFT_eWidget) 7. 在 v2.4.70 中已添加对 RP2040 和 16 位并行显示的支持。这已测试通过,屏幕更新性能非常好(用 HC8357C 清空 320 x 480 屏幕需要 4ms)。RP2040 的 PIO 功能使为不同显示设置写入周期时序变得容易。DMA 16 位传输也得到支持。 8. 已添加对 ESP32-S2、ESP32-S3 和 ESP32-C3 的支持(目前仅 ESP32 S3 支持 DMA)。已在 ESP32 开发板包 v2.0.3 RC1 上测试通过。示例配置: [Setup70_ESP32_S2_ILI9341.h](https://github.com/Bodmer/TFT_eSPI/blob/master/User_Setups/Setup70_ESP32_S2_ILI9341.h) [Setup70b_ESP32_S3_ILI9341.h](https://github.com/Bodmer/TFT_eSPI/blob/master/User_Setups/Setup70b_ESP32_S3_ILI9341.h) [Setup70c_ESP32_C3_ILI9341.h](https://github.com/Bodmer/TFT_eSPI/blob/master/User_Setups/Setup70c_ESP32_C3_ILI9341.h) [Setup70d_ILI9488_S3_Parallel.h](https://github.com/Bodmer/TFT_eSPI/blob/master/User_Setups/Setup70d_ILI9488_S3_Parallel.h) 9. 现在可以使用非常少的闪烁直接将平滑字体渲染到 TFT,方法是逐行和逐块更新字形区域而不重复绘制像素。这对某些草图来说是一个“破坏性”更改,因为渲染背景需要一个新的真/假参数。如果未提供参数,默认值为 false。示例: tft.setTextColor(TFT_WHITE, TFT_BLUE, true); spr.setTextColor(TFT_BLUE, TFT_BLACK, true); 注意:使用 print 流(例如 `tft.println("Hello World");`)时,平滑字体的背景渲染现在也可用。 10. 新增抗锯齿图形函数,用于绘制线条、楔形线条、圆形和圆角矩形。[包含示例](https://github.com/Bodmer/TFT_eSPI/tree/master/examples/Smooth%20Graphics)。还新增了[显示 PNG 压缩图像](https://github.com/Bodmer/TFT_eSPI/tree/master/examples/PNG%20Images)的示例(注意:大约需要 40KB RAM)。 11. RP2040 8 位并行接口使用 PIO。PIO 现在管理“setWindow”和“block fill”操作,在屏幕区域被填充颜色时释放处理器以执行其他任务。PIO 也可用于 SPI 接口显示(需要在 setup 文件中添加 `#define RP2040_PIO_SPI`)。触摸屏幕和像素读取操作在使用 PIO 接口时不受支持。 RP2040 PIO 功能仅适用于 [Earle Philhower 的开发板包](https://github.com/earlephilhower/arduino-pico),不适用于 Arduino Mbed 版本。 在 Earle 的开发板包中,使用 PIO 进行 SPI 允许 RP2040 超频(在我的开发板上可达 250MHz),同时仍保持高 SPI 时钟速率。 # TFT_eSPI 一款适用于 32 位处理器的功能丰富的 Arduino IDE 兼容图形和字体库。该库针对 32 位处理器进行了性能优化,特别适用于 RP2040、STM32、ESP8266 和 ESP32 类型,其他 32 位处理器也可使用但会采用较慢的通用 Arduino 接口调用。可通过 Arduino IDE 的库管理器加载该库。直接内存访问(DMA)可用于 ESP32、RP2040 和 STM32 处理器,以提升 SPI 接口显示器的渲染性能。DMA 对 8 位和 16 位并行接口(仅 RP2040)也提供支持。 ESP32 S2/C3/S3 的更新意味着该库需要 ESP32 开发板包 2.x.x 或更高版本。 屏幕控制器、接口引脚和库配置设置必须在库内定义。它们**不能**在 Arduino 草图中定义。请参阅 `User_Setup_Select.h` 文件获取详细信息。这种方法有显著优点:它使示例保持简洁(不包含冗长的配置选项),并且一旦设置定义完成,任何示例都可以在不修改的情况下运行。PlatformIO 用户可以在 `platformio.ini` 文件中为每个项目定义这些设置,请参阅库中的 Docs 文件夹。 提供了大量示例草图,以演示库中的函数使用。由于该库非常受欢迎,有很多由热情用户创建的在线 TFT_eSPI 教程。 已针对以下处理器测试优化驱动: * RP2040,例如 Raspberry Pi Pico * ESP32 和 ESP32-S2、ESP32-C3、ESP32-S3 * ESP8266 * STM32F1xx、STM32F2xx、STM32F4xx、STM32F767(建议使用更高 RAM 的处理器) 该库支持以下接口类型(针对这些处理器): | 处理器 | 4 线 SPI | 8 位并行 | 16 位并行 | DMA 支持 | |--------|----------|----------|-----------|--------------| | RP2040 | 是 | 是 | 是 | 是(全部) | | ESP32 | 是 | 是 | 否 | 是(仅 SPI) | | ESP32 C3 | 是 | 否 | 否 | 否 | | ESP32 S2 | 是 | 否 | 否 | 否 | | ESP32 S3 | 是 | 是 | 否 | 是(仅 SPI) | | ESP8266 | 是 | 否 | 否 | 否 | | STM32Fxxx | 是 | 是 | 否 | 是(仅 SPI) | | 其他 | 是 | 否 | 否 否 | 对于其他(通用)处理器,仅支持 SPI 接口,并使用较慢的 Arduino SPI 库函数。时钟速度更高的处理器(如用于 Teensy 3.x 和 4.x 的处理器)在使用通用 Arduino SPI 函数时仍能提供非常好的性能。 4 线 SPI 要求显示器具备 SPI 兼容信号以及“数据/命令”控制信号,该信号有时标记为 DC、RS 或 A0。 由于缺乏 GPIO 引脚,ESP8266 不支持 8 位并行接口。8 位并行 TFT 显示器(例如 UNO 格式的 mcufriend 屏蔽板)可用于 STM32Fxxx 核数子(UNO 格式的 ESP32 请参见下文)。 内置对 XPT2046 触摸屏幕控制器的支持,可用于 SPI 接口显示器。第三方触摸支持库在使用并行接口时也可使用。 支持的显示器控制器包括: * GC9A01 * ILI9163 * ILI9225 * ILI9341 * ILI9342 * ILI9481(SPI 下不支持 DMA) * ILI9486(SPI 下不支持 DMA) * ILI9488(SPI 下不支持 DMA) * HX8357B(16 位并行,已在 RP2040 上测试) * HX8357C(16 位并行,已在 RP2040 上测试) * HX8357D * R61581 * RM68120(已添加支持文件但未测试) * RM68140 * S6D02A1 * SSD1351 * SSD1963(该控制器仅支持并行接口) * ST7735 * ST7789 * ST7796 推荐将 ILI9341 和 ST7796 SPI 显示器作为使用该库的起点。 一些显示器允许读取内部 TFT 屏幕 RAM,其中一些示例使用了此功能。`TFT_Screen_Capture` 示例允许捕获完整屏幕并发送到 PC,这对于创建程序文档非常有用。 库包含一个“Sprite”类,可实现无闪烁的复杂图形更新。可以直接向 TFT 绘制图形,因此现有草图无需更改。 # 精灵 Sprite 在概念上是一个存在于处理器 RAM 中的虚拟图形屏幕。可以像直接绘制到屏幕一样在 Sprite 中绘制图形。完成后,可以将 Sprite 绘制到屏幕上的任意位置。如果 RAM 足够,Sprite 可以与屏幕大小相同并用作帧缓冲区。默认情况下,Sprite 使用 16 位颜色,可以设置为 8 位(256 色)或 1 位(2 色)以减少 RAM 占用。在 ESP8266 上,可创建的最大 16 位色彩 Sprite 约为 160x128 像素,占用 40KB RAM。在 ESP32 上,工作 RAM 比数据手册描述的更有限,因此 16 位色彩 Sprite 限制约为 200x200 像素(约 80KB),8 位 Sprite 为 320x240 像素(约 76KB)。1 位每像素 Sprite 仅需 9600 字节即可完整存储 320x240 屏幕缓冲区,非常适合支持双色位图字体。 可以创建一个或多个 Sprite,每个 Sprite 可以是任意像素宽度和高度,仅受可用 RAM 限制。16 位色彩深度 Sprite 所需 RAM 为 (2 × 宽度 × 高度) 字节,8 位色彩深度 Sprite 所需 RAM 为 (宽度 × 高度) 字节。Sprite 可以根据需要在草图中动态创建和删除,这意味着绘制到屏幕后可以释放 RAM,从而运行更占用内存的 WiFi 相关代码,同时仍能正常进行图形操作。 在 Sprite 中绘制图形非常快。对于熟悉 Adafruit “graphicstest” 示例的人来说,这个测试在 160x128 Sprite 中完成仅需 18ms。Sprite 使用的示例可以在 “examples/Sprite” 文件夹中找到。 Sprite 可以绘制到 TFT 上,并指定一种颜色作为“透明”,请参见 Transparent_Sprite_Demo 示例。 如果 ESP32 板卡安装了 SPIRAM(即 PSRAM),则 Sprite 将使用 PSRAM 内存,可以创建占用整个屏幕缓冲区的巨型 Sprite。渲染完整屏幕 Sprite 需要更长时间(约 45ms 用于 320x240 16 位 Sprite),请留意这一点。 “Animated_dial” 示例展示了如何使用旋转 Sprite 创建仪表。要运行此示例,TFT 接口必须支持从屏幕 RAM 读取(并非所有都支持)。仪表边框和刻度是使用绘图程序创建的 jpeg 图像。 ![Animated_dial](https://i.imgur.com/S736Rg6.png) # 触摸控制器支持 XPT2046 触摸屏幕控制器仅支持 SPI 接口显示器。SPI 总线与 TFT 共享,仅需额外的片选线。该支持最终将在有合适的触摸屏幕库可用时被弃用。 集成了 Adafruit_GFX 的 Button 类,并增强了标签可使用任意字体的功能。 # ESP8266 重叠模式 该库支持 ESP8266 上的 SPI 重叠,使 TFT 屏幕可以共享 MOSI、MISO 和 SCLK 引脚与程序 FLASH,从而释放其他 GPIO 引脚的用途。只能连接一个 SPI 设备到 FLASH 引脚,且 TFT 的片选必须位于 D3 (GPIO0) 引脚。 # 字体 库包含比例字体,可在编译时启用/禁用不同大小以优化 FLASH 存储器使用。支持在 SPIFFS 中以 vlw 格式存储的反锯齿(平滑)字体文件。任何 16 位 Unicode 字符都可以包含并渲染,这意味着可以渲染许多语言特定字符。UTF-8 格式的字符数组和字符串也得到支持。 该库基于 Adafruit GFX 和 Adafruit 驱动库,目标是保持兼容性。已对库进行重大增强,以提升不同处理器的速度(通常快 3 到 10 倍)并添加新功能。新增图形函数支持不同尺寸的比例字体和格式化功能。提供了大量示例草图以演示不同功能和包含的函数。 通过编辑库文件夹中的 `User_Setup.h` 文件,或选择自己的 `User_Setup_Select.h` 文件,可以配置库的字体现选择、用于连接 TFT 的引脚及其他功能。字体和功能可以通过注释掉相应行来轻松启用/禁用。 # 反锯齿字体 使用免费的 [Processing IDE](https://processing.org/) 通过库 Tools 文件夹中包含的草图生成“vlw”格式的反锯齿(平滑)字体文件。该 Processing 草图可用于从计算机字体集或任何 TrueType (.ttf) 字体生成字体文件,字体文件可以包含 **任意** 组合的 16 位 Unicode 字符。这意味着希腊语、日语及其他 UCS-2 字形都可以使用。UTF-8 格式的字符数组和字符串受支持。 .vlw 文件必须上传到处理器的闪存文件系统(SPIFFS、LittleFS 或 SD 卡)才能使用。或者,.vlw 文件可以转换为 C 数组(请参见 “Smooth Font -> FLASH_Array” 示例)并直接存储在 FLASH 中作为编译过程的一部分。基于数组的方法更方便,可提供性能提升,并适用于:要么不希望使用文件系统,要么处理器类型(例如 STM32)不支持基于闪存的文件系统的情况。 以下是 Adafruit_GFX “FreeSans12pt” 位图字体与以反锯齿方式绘制的同一字体的对比: ![Smooth_font](https://i.imgur.com/gAeDPFY.png) 平滑字体示例显示以下屏幕: ![Example](https://i.imgur.com/xJF0Oz7.png) 可以将 vlw 字体文件压缩,但将字体文件存储在 SPIFFS、LittleFS 或 FLASH 数组中时,渲染到 TFT 的性能仍然良好。 以下是使用微软雅黑字体在 24pt 下显示反锯齿的平假名 Unicode 块(0x3041 到 0x309F)的示例截图: ![Hiragana glyphs](https://i.imgur.com/jeXf2st.png) 反锯齿字体也可以在渐变背景上绘制,并通过回调获取每个像素的背景颜色。该像素颜色可由渐变算法设置或通过读取 TFT 屏幕内存(如果支持读取显示)来设置。 反锯齿字体无法使用 `setTextSize` 进行缩放,因此需要为每个所需大小创建单独的字体。请参见示例。 # 8 位并行支持 常见的 8 位 “Mcufriend” 屏蔽板已支持 STM Nucleo 64/144 开发板和 ESP32 UNO 风格开发板。STM32 “Blue/Black Pill” 开发板也可用于 8 位并行显示器。 用于测试的 ESP32板引脚布局如下: ![Example](https://i.imgur.com/bvM6leE.jpg) 标有 Wemos R32(ESP32) 标签的低成本 UNO 风格开发板也具有相同的引脚布局。 不幸的是,典型的 UNO/mcufriend TFT 屏蔽板将 LCD_RD、LCD_CS 和 LCD_RST 信号映射到 ESP32 的模拟引脚 35、34 和 36,这些均为输入专用引脚。为了解决这个问题,我通过添加电线将 3 个备用引脚 IO15、IO33 和 IO32 连接到屏蔽板底部,如下所示: IO15 连接到 IO35 IO33 连接到 IO34 IO32 连接到 IO36 这是该 UNO 板的[示例配置文件](https://github.com/Bodmer/TFT_eSPI/blob/master/User_Setups/Setup14_ILI9341_Parallel.h),包含正确的 GPIO 设置。 ![Example](https://i.imgur.com/pUZn6lF.jpg) 如果显示器带有电阻式触摸屏幕,可以通过执行此处描述的修改以及该 Arduino 库的 fork 版本来使用: https://github.com/s60sc/Adafruit_TouchScreen # 在 Arduino 上同时使用 SPI 显示器和 SD 卡 如果希望同时使用该库和 SD 卡,请确保在 `User_setup.h` 文件中明确定义 _TFT_MISO_、_TFT_MOSI_ 和 _TFT_SCLK_,即使你使用的是该开发板的默认 SPI 引脚。 未显式声明这些引脚可能会在显示初始化后导致 SD 卡无法使用。 # 提示 如果加载了 TFT_eSPI 的新副本,它将覆盖你放置在 TFT_eSPI 文件夹中的设置。一个解决方法是创建一个名为 “TFT_eSPI_Setups” 的新文件夹到 Arduino 库文件夹中。然后将自定义的 setup.h 文件放入其中。升级后,只需编辑 `User_Setup_Select.h` 文件以指向你的自定义设置文件,例如: ``` #include <../TFT_eSPI_Setups/my_custom_setup.h> ``` 你必须确保只调用一个设置文件。在自定义设置文件中,我将文件路径作为注释掉的第一行添加,以便在升级后可以复制粘贴回 `User_Setup_Select.h` 文件。路径开头的 `../` 表示返回上一级目录。显然,你可以使用不同的文件路径或目录名称,只要不与另一个库或文件夹名称冲突即可。 你可以更进一步,使用自己的设置选择文件,然后只需将 `User_Setup_Select.h` 中的 Setup.h 行引用替换为,例如: ``` #include <../TFT_eSPI_Setups/my_setup_select.h> ``` 要选择新设置,只需编辑你自己的 my_setup_select.h 文件(该文件在升级过程中不会被覆盖)。
标签:Arduino 库, Board 支持, Create_font, DMA, ESP32, ESP32 S3, ESP8266, GitHub Discussions, LilyGo, PlatformIO, Processing, Raspberry Pi Pico, RP2040, Seeed XIAO, SEO: ESP32 显示库, SEO: Raspberry Pi Pico 图形库, SEO: TFT 库, SPI, STM32, TFT_eSPI, TFT 显示, UML, 固定点 sqrt, 圆角矩形, 字体处理, 客户端加密, 嵌入式图形, 平滑图形, 开源库, 弧线, 抗锯齿, 搜索引擎爬虫, 硬件浮点, 讨论区, 问题反馈, 驱动芯片