已为"讨论"功能添加Q&A等用途。请仅在遇到库的问题时使用"问题"选项卡。谢谢!
新闻
-
Create_font Processing草图已更新,可自动创建完整的C头文件。现在可以在Processing草图中禁用字体文件夹的自动打开功能。(感谢Pierre-Loup Martin)
-
为Seeed XIAO圆形显示屏、LilyGo T-Embed S3、LilyGo_T_QT_Pro_S3、ESP32 S3 Box和ESP32_S3_Box_Lite添加了新的板设置文件。ESP32 S3现在支持"RPi"接口风格的板子。
-
新增了绘制平滑(抗锯齿)圆弧、圆形和圆角矩形轮廓的功能。"平滑图形"示例文件夹中提供了新的草图。可以选择带或不带抗锯齿效果绘制圆弧(不带抗锯齿时渲染更快)。圆弧末端可以是直的或圆的。圆弧绘制算法使用了优化的定点sqrt()函数,以提高在没有硬件浮点单元的处理器(如RP2040)上的性能。这里有两张演示图片,左边是带圆形末端的平滑(抗锯齿)圆弧,右边是相同分辨率(从同一240x240 TFT截取)但禁用平滑(无抗锯齿)的效果:
[图片1] [图片2]
这里使用平滑圆弧在320x240 TFT上创建了抗锯齿仪表盘:
[图片3]
-
现有一个优秀的兼容库,可以在TFT屏幕(或精灵)上渲染TrueType字体。这是由takkaO开发的。该库提供对紧凑字体文件的访问,具有完全可缩放的抗锯齿字形。还可以在屏幕上打印左对齐、居中和右对齐的文本。我已经在OpenFontRender库中添加了TFT_eSPI特定的示例,并在RP2040和ESP32处理器上进行了测试,ESP8266由于字形渲染复杂度而没有足够的RAM。这是一个演示屏幕,使用单个12KB的字体文件二进制文件在320x480 TFT屏幕上渲染了逐渐增大的完全抗锯齿字形:
[图片4]
-
为滑块、按钮、图表和仪表添加了新的GUI示例。这些示例需要一个新的支持库:
-
v2.4.70版本中增加了对RP2040配合16位并行显示器的支持。经过测试,屏幕更新性能非常好(HC8357C清除320 x 480屏幕只需4ms)。使用RP2040 PIO可以轻松更改不同显示器的写入周期时序。还支持16位传输的DMA。
-
新增对ESP32-S2、ESP32-S3和ESP32-C3的支持(目前仅ESP32 S3支持DMA)。已使用ESP32板包的v2.0.3 RC1版本进行测试。示例设置:
-
平滑字体现在可以直接渲染到TFT上,快速变化的值几乎不会闪烁。这是通过逐行和逐块更新字形区域而不重复绘制像素来实现的。这是一个"破坏性"更改,因为某些草图需要一个新的true/false参数来渲染背景。如果缺少参数,默认为false。示例:
tft.setTextColor(TFT_WHITE, TFT_BLUE, true); spr.setTextColor(TFT_BLUE, TFT_BLACK, true);
注意:使用打印流时,平滑字体的背景渲染现在也可用,例如:tft.println("Hello World");
-
新增抗锯齿图形函数,用于绘制线条、楔形线、圆形和圆角矩形。包含示例。还添加了显示PNG压缩图像的示例(注意:需要约40KB RAM)。
-
熟悉运行宏的PowerPoint用户可能对此处的pptm草图生成器感兴趣,它可以将PowerPoint幻灯片中绘制的图形和表格转换为在480x320 TFT上渲染图形的Arduino草图。这是基于Kris Kasprzak在此处创建的VB宏。
-
该库包含两个新函数,用于绘制填充有水平或垂直彩色渐变的矩形:
tft.fillRectHGradient(x, y, w, h, color1, color2);
tft.fillRectVGradient(x, y, w, h, color1, color2);
-
RP2040的8位并行接口使用PIO。PIO现在管理"setWindow"和"块填充"操作,在屏幕区域被颜色填充时释放处理器用于其他任务。如果在设置文件中添加#define RP2040_PIO_SPI,PIO还可以选择用于SPI接口显示器。使用PIO接口时不支持触摸屏和像素读取操作。 RP2040 PIO功能仅适用于Earle Philhower的开发板包,而不适用于Arduino Mbed版本。
在Earle的开发板包中使用PIO进行SPI允许RP2040超频(在我的开发板上最高可达250MHz),同时仍然保持高SPI时钟速率。
TFT_eSPI
这是一个功能丰富的Arduino IDE兼容图形和字体库,适用于32位处理器。该库针对32位处理器,已针对RP2040、STM32、ESP8266和ESP32类型进行了性能优化,其他32位处理器也可以使用,但会使用较慢的通用Arduino接口调用。可以使用Arduino IDE的库管理器加载该库。直接内存访问(DMA)可用于ESP32、RP2040和STM32处理器的SPI接口显示器,以提高渲染性能。并行接口(8位和16位)的DMA仅支持RP2040。
ESP32 S2/C3/S3的更新意味着该库需要ESP32 Arduino开发板包2.x.x或更高版本。
必须在库内定义屏幕控制器、接口引脚和库配置设置。它们不能在Arduino草图中定义。详情请参阅User_Setup_Select.h文件。这种方法有显著优势,它使示例代码不包含冗长的配置选项,一旦定义了设置,任何示例都可以无需修改即可运行。PlatformIO用户可以在platformio.ini文件中为每个项目定义这些设置,请参阅库中的Docs文件夹。
提供了大量示例草图,演示了如何使用库中的函数。由于该库的普及,热心用户创建了许多TFT_eSPI在线教程。
已经针对以下处理器测试了优化的驱动程序:
- RP2040,例如树莓派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 Nucleo 64/144系列或UNO格式的ESP32一起使用(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的显示器作为初步尝试此库的起点。
该库支持一些为树莓派(RPi)设计的TFT显示器,这些显示器基于ILI9486或ST7796驱动芯片,屏幕分辨率为480 x 320像素。ILI9486 RPi显示器必须采用微雪(Waveshare)设计,并使用基于74HC04、74HC4040和2个74HC4094逻辑芯片的16位串行接口。请注意,由于这些显示器之间的设计差异,并非所有RPi显示器都能与此库兼容,因此不建议仅为使用此库而购买这些类型的RPi显示器。
一个"优秀"的RPi显示器是MHS-4.0英寸显示器-B型ST7796,它提供了良好的性能。它拥有专用控制器,可以在ESP32上以高达80MHz的时钟速度运行(超频RP2040可达125MHz,STM32可达55MHz,ESP8266可达40MHz)。MHS-3.5英寸RPi ILI9486基于的显示器也受支持,然而,同类型的基于MHS ILI9341的显示器不兼容此库。
某些显示器允许读取内部TFT屏幕RAM,一些示例使用了这个功能。TFT_Screen_Capture示例允许捕获完整屏幕并发送到PC,这对创建程序文档很有帮助。
该库包含一个"Sprite"类,可实现复杂图形的无闪烁更新。直接使用图形函数写入TFT仍然可用,因此现有的草图无需更改。
精灵(Sprites)
精灵可以看作是存储在处理器RAM中的一个虚拟图形屏幕。可以像直接在屏幕上绘图一样在精灵上绘制图形。完成精灵后,可以将其绘制到屏幕上的任意位置。如果有足够的RAM,精灵可以与屏幕大小相同,用作帧缓冲区。精灵默认使用16位色彩,可以将位深度设置为8位(256色)或1位(任意2种颜色)以减少所需RAM。在ESP8266上,可以创建的最大16位色彩精灵约为160x128像素,消耗40KB RAM。在ESP32上,工作空间RAM比数据表所示更受限制,因此16位色彩精灵限制在约200x200像素(~80KB),8位精灵限制在320x240像素(~76KB)。每像素1位的精灵仅需9600字节即可支持完整的320 x 240屏幕缓冲区,这非常适合用于2色位图字体。
可以创建一个或多个精灵,精灵可以是任意像素宽度和高度,仅受可用RAM限制。16位色深精灵所需的RAM为(2 x 宽度 x 高度)字节,8位色深精灵所需的RAM为(宽度 x 高度)字节。精灵可以根据需要在草图中动态创建和删除,这意味着在将精灵绘制到屏幕上后可以释放RAM,然后可以运行更多RAM密集型的基于WiFi的代码,同时普通图形操作仍然可用。
在精灵中绘制图形非常快,对于熟悉Adafruit "graphicstest"示例的人来说,整个测试在160x128精灵中仅需18ms完成。精灵使用的示例可以在"examples/Sprite"文件夹中找到。
精灵可以绘制到TFT上,并指定一种颜色为"透明",请参见Transparent_Sprite_Demo示例。
如果ESP32板载有SPIRAM(即PSRAM),则精灵将使用PSRAM内存,可以创建大型全屏缓冲区精灵。全屏精灵渲染时间较长(320 x 240 16位精灵约45ms),请注意这一点。
"Animated_dial"示例展示了如何使用旋转精灵创建指针来制作表盘。要运行此示例,TFT接口必须支持从屏幕RAM读取(并非所有接口都支持)。表盘边缘和刻度是使用绘图程序创建的jpeg图像。
触摸控制器支持
仅支持基于SPI的显示器的XPT2046触摸屏控制器。触摸控制器的SPI总线与TFT共享,只需额外的片选线。当有合适的触摸屏库可用时,这种支持最终将被弃用。
该库包含了来自Adafruit_GFX的Button类,并进行了增强,使按钮标签可以使用任何字体。
ESP8266重叠模式
该库支持ESP8266上的SPI重叠,因此TFT屏幕可以与程序FLASH共享MOSI、MISO和SCLK引脚,这样可以释放GPIO引脚用于其他用途。只能将一个SPI设备连接到FLASH引脚,TFT的片选必须在D3(GPIO0)引脚上。
字体
该库包含比例字体,可以在编译时启用或禁用不同大小的字体以优化 FLASH 内存的使用。支持存储在 SPIFFS 中的 vlw 格式的抗锯齿(平滑)字体文件。可以包含和渲染任何 16 位 Unicode 字符,这意味着许多特定语言的字符可以被渲染到屏幕上。
该库基于 Adafruit GFX 和 Adafruit 驱动程序库,目标是保持兼容性。为了提高不同处理器的速度(通常快 3 到 10 倍)并添加新功能,对库进行了重大改进。新的图形功能包括不同大小的比例字体和格式化功能。有很多示例草图来演示不同的特性和包含的功能。
通过编辑库文件夹中的 User_Setup.h 文件,或在 "User_Setup_Selet.h" 文件中选择自己的配置,可以配置库的字体选择、用于与 TFT 接口的引脚以及其他功能。可以通过注释掉行来轻松启用/禁用字体和功能。
抗锯齿字体
使用库 Tools 文件夹中包含的草图,可以通过免费的 Processing IDE 生成 "vlw" 格式的抗锯齿(平滑)字体文件。这个草图与 Processing IDE 可以用来从计算机的字体集或任何 TrueType (.ttf) 字体生成字体文件,字体文件可以包含任何16 位 Unicode 字符的组合。这意味着可以使用希腊语、日语和任何其他 UCS-2 字形。支持 UTF-8 格式的字符数组和字符串。
.vlw 文件必须上传到处理器的 FLASH 文件系统(SPIFFS、LittleFS 或 SD 卡)才能使用。或者,.vlw 文件可以转换为 C 数组(参见 "Smooth Font -> FLASH_Array" 示例)并作为编译过程的一部分直接存储在 FLASH 中。基于数组的方法很方便,提供了性能改进,并且适用于以下情况:不希望使用文件系统,或处理器类型(如 STM32)不支持基于 FLASH 的文件系统。
以下是 Adafruit_GFX "FreeSans12pt" 位图字体与同一字体绘制为抗锯齿的对比:
平滑字体示例显示以下屏幕:
压缩 vlw 字体文件是可能的,但当将字体文件存储在 SPIFFS、LittleFS 或 FLASH 数组中时,渲染到 TFT 的性能仍然很好。
以下是一个示例截图,显示了来自微软雅黑字体的 24pt 抗锯齿平假名字符 Unicode 块(0x3041 到 0x309F):
抗锯齿字体也可以在渐变背景上绘制,通过回调获取每个像素的背景颜色。这个像素颜色可以由渐变算法设置,或通过读取 TFT 屏幕内存(如果支持读取显示)来设置。
抗锯齿字体不能用 setTextSize 缩放,所以你需要为每个需要的大小创建一个字体。请参见示例。
8 位并行支持
STM Nucleo 64/144 板和 ESP32 UNO 风格板支持常见的 8 位 "Mcufriend" 屏蔽。STM32 "Blue/Black Pill" 板也可以与 8 位并行显示器一起使用。
我用于测试的 ESP32 板的引脚排列如下:
带有 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 板的正确 GPIO。
如果显示板配备了基于电阻的触摸屏,则可以通过执行此处描述的修改和 Adafruit 库的分支来使用它: https://github.com/s60sc/Adafruit_TouchScreen
提示
如果你加载了 TFT_eSPI 的新副本,它将覆盖保存在 TFT_eSPI 文件夹中的设置。解决这个问题的一种方法是在 Arduino 库文件夹中创建一个名为 "TFT_eSPI_Setups" 的新文件夹。然后将自定义的 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 文件(在升级过程中不会被覆盖)。