arduino_gfx.

13,047

171

17

简介:Arduino_GFX.

关于:如果你不能买一个,可以自己!

该赋予者为Arduino引入彩色显示图形功能(GFX)库。

内容将随时更新,如果Arduino\uGFX添加了更多功能,我将添加更多细节。你也可以通过在下面留下评论来帮助我丰富内容。

第一步:什么是Arduino\u GFX?

Arduino炣GFX是Arduino的彩色显示GFX库。

“for Arduino”是指尽可能多的支持Arduino平台。并且还旨在支持各种接口中尽可能多的显示。

大多数爱好者电子产品市场彩色显示器是SPI和大多数Arduino平台支持SPI。Arduino_GFX利用Arduino本机SPI类作为基本接口,HWSPI,因此Arduino_GFX已经已经为大多数平台和大多数显示器提供准备。

第2步:软件设计

arduino_gfx从adafruit_gfx开始重写,并使用lovyangfx和tft_espi的许多功能,但高级设计有点像Ucglib。ARDUINO_GFX将显示驱动程序和数据接口脱节为2个单独的类。它提供了更大的灵活性,例如,ILI9341显示器可以使用:

  • 8位SPI
  • 9位SPI
  • 6位并行
  • 8位并行
  • 9位并行
  • 16位并行
  • 18位平行

Arduino_GFX支持其中四个:

  • 8位SPI
  • 9位SPI
  • 8位并行
  • 16位并行

只需将不同的数据总线类馈送到“Arduino\ u ILI9341”显示类即可支持各种类型的ILI9341显示转接模块。

裁判。:

https://cdn-shop.adafruit.com/datasheets/ILI9341.p...

第3步:库安装

  1. 在Arduino IDE开放的图书馆经理:工具菜单 - >管理库......
  2. 搜索“彩色显示gfx”或“Arduino的gfx库”
  3. 选择“GFX Library for Arduino”并安装

或者您可以从GitHub下载最新代码,然后自己导入库文件夹:

https://github.com/moonournation/arduino_gfx.

裁判。:

https://www.arduino.cc/en/guide/libraries.

步骤4:易用性

简单声明

#includeArduino\u DataBus*bus=new Arduino\u HWSPI(16/*DC*/,5/*CS*/);Arduino_GFX*GFX=新Arduino_ILI9341(总线,17/*RST*/);

该声明只需要3行,使用create_default_arduino_databus()或create_default_arduino_gfx()仍然可以使其更加简单。此功能将在以后的步骤中提及。

和使用简单

gfx->begin();gfx->填充屏幕(黑色);gfx->println(“你好,世界!”);

步骤5:易于切换硬件

ArduinoèGFX写尽可能通用,以支持多平台。切换开发板无需更改任何与GFX功能相关的代码。切换显示仅替换GFX类,例如将ILI9341显示切换为ST7789 IPS显示将是:

// arduino_gfx * gfx = new arduino_ili9341(总线,tft_rst,0 / *旋转* /,false / * ips * /);Arduino_GFX * GFX = New Arduino_St7789(总线,TFT_RST,0 / *旋转* /,TRUE / * IPS * /);

步骤6:手动设置频率

每个平台都定义了默认的SPI速度,ESP系列是40mhz,AVR系列是8mhz等等。初始化gfx类时,“gfx->begin();”,可以在其中传递频率值以覆盖默认值:

gfx-> begin(80000000);// 80 MHz.

步骤7:LED背光

正如您在上一步中看到的声明一样,不需要将LED管脚传递给这两个类。这是因为LED的打开或关闭不是由显示器驱动程序控制的,在大多数情况下,它是由MCU GPIO直接控制的。有时由专用电源控制芯片控制;有时没有LED背光,例如OLED。

所以ArduinoëGFX将LED背光控制留给主程序。

最懒惰的方法是只连接LED引脚的Vcc,但它可能会采取的风险烧毁LED如果分线板没有足够的保护。因此,使用GPIO更好:

pinMode(TFT_ubl,输出);数字写入(TFTBL,高);

或者,如果您希望通过PWM控制亮度:

PinMode(TFT_BL,输出);Amplwwrite(TFT_BL,127);/ * 0-255 * /

ESP32未实现模拟程序(),它有自己的LED控制功能:

ledcSetup(0/*发光二极管通道*/,5000/*频率*/,8/*分辨率*/);ledcAttachPin(TFT_BL,0/*LED通道*/);ledcWrite(0/*LEDChannel*/,127);/*0-255 */

第8步:基准

Arduino_GFX不会在第一个优先级将速度放置,但仍然需要努力使显示屏光滑。让我们将速度与最着名的GFX库和2个最快的GFX库进行比较。

Arduino IDE:1.8.15 Arduino-esp32:1.0.6 PSRAM选项:禁用DEV板:TTGO T8 V1.8彩色显示:ILI9341接口:SPI SPI频率:40 MHz测试代码:HTTPS://github.com/moononournation/ARDUINO_GraphicStest_PDQ.git测试日期:2021 6月16日|基准|adafruit_gfx |arduino_gfx |lovyan_gfx |TFT_ESPI ||------------------ |------------- |------------- | ------------ | ------------ | | Screen fill | 195,782 | 160,094 | 154,341 | 155,938 | | Text | 97,662 | 18,960 | 22,473 | 21,752 | | Pixels | 1,365,211 | 903,549 | 867,702 | 775,781 | | Lines | 1,062,311 | 412,026 | 269,060 | 264,950 | | Horiz/Vert Lines | 17,637 | 14,197 | 13,692 | 13,833 | | Rectangles-filled | 406,817 | 332,696 | 320,761 | 323,908 | | Rectangles | 11,641 | 9,254 | 8,545 | 8,714 | | Triangles-filled | 150,941 | 118,010 | 105,661 | 109,675 | | Triangles | 58,843 | 23,570 | 15,884 | 16,277 | | Circles-filled | 76,739 | 52,170 | 42,787 | 45,827 | | Circles | 118,125 | 40,955 | 25,959 | 25,269 | | Arcs-filled | N/A | 33,381 | 21,546 | N/A | | Arcs | N/A | 66,054 | 47,901 | N/A | | Rounded rects-fill | 408,534 | 338,136 | 318,882 | 323,189 | | Rounded rects | 43,185 | 21,562 | 13,089 | 15,371 |

第九步:为什么要跑“快”?

ArduinoèGFX写尽可能通用,支持多平台;并使用OO父类对各种数据总线类和显示类API进行标准化。这些设计有一点开销。

即使它使ArduinoïGFX无法运行的速度微调LovyanïGFX或TFTïeSPI,数字是“非常接近”:P

以下是一些设计要使Arduino_GFX快速运行:

  • 定制数据总线类。Arduino炣GFX将数金宝博娱乐城据总线操作与显示驱动程序解耦,更容易为每个平台编写单独的数据总线类。E、 在Arduino Nano 33 BLE平台上,NRFXSPI数据总线类比一般HWSPI数据总线类运行速度快得多。
  • 坚持16位颜色空间。对于大多数MCU来说,24位颜色是多余的,而且大多数彩色显示器支持16位颜色(除了SPI模式下的ILI948*)。坚持16位颜色只能简化实现,运行速度更快,并减少库大小占用。
  • 没有读操作。由于并非所有显示器提供读取的图形存储器API,Arduino_GFX跳过读取操作。它可以减少库尺寸占用占地面积,有时会降低操作时间。

第十步:大小是否重要?

是的,如果您使用MCU具有有限的节目空间,例如,Arduino Nano只有32 kB节目空间(排除引导加载程序的大小,最大值为30720字节)。

一旦我在PDQgraphicstest示例中添加了Arcs函数,我发现它不能适应Arduino Nano。显示库耗尽了所有程序空间,这意味着您无法在项目中执行任何操作。这是不可接受的,所以我自己在GitHub中提出了一个问题:

https://github.com/moononournation/Arduino_GFX/iss...

经过各种微调和权衡,现在PDQGraphicStest使用28530字节(92%);和HelloWorld示例使用11496字节(37%),我的东西足以让许多项目足够好。

步骤11:2硬件因素

当您设计显示项目时,有2个可变的硬件因素需要考虑:

  • 开发板。不同的开发板(平台)有不同的GPIO引脚映射,可以使用不同的接口(数据总线)。驱动更高分辨率的彩色显示器也需要更高的处理能力。
  • 显示转接板。不同的显示器有不同的显示驱动程序,可以使用不同的接口(数据总线)。

首先,它必须在DEV板和显示之间具有通用接口,很可能它应该是8位SPI。然后,您需要分配其他GPIO控制引脚,例如,CS,DC,RST和LED。如果您没有偏好使用哪个GPIO,Arduino_GFX已定义一些默认值以易于使用。

由于大多数显示使用8位SPI,只需使用下面的行创建默认的8位SPI数据总线类:

#include  arduino_databus * bus = create_default_arduino_databus();

下面的步骤说明了与每个平台的ILI9341 SPI分组板的PIN连接。

第12步:青少年4.1

连接摘要:

t电子版本4.1->ILI9341 Vin->Vcc GND->GND GPIO 39->CS GPIO 40->重置GPIO 41->D/C GPIO 11(MOSI)->SDI(MOSI)GPIO 13(SCK)->SCK GPIO 22->LED

第13步:Arduino Nano

由于Arduino Nano是5V的开发板,但大多数显示器不具备5V的I/O容限,因此需要在GPIO和显示器引脚之间安装一些电阻器。

连接摘要:

Arduino纳米 - > ili9341 vin  - > vcc gnd  - > GND GPIO 9  - > 3.3K电阻 - > CS GPIO 7  - > 3.3K电阻 - >复位GPIO 8  - > 3.3K电阻 - > D / C GPIO 11(MOSI)- > 3.3K电阻 - > SDI(MOSI)GPIO 13(SCK) - > 3.3K电阻 - > SCK GPIO 6  - > LED

第14步:arduino nano 33 ble

连接摘要:

Arduino Nano 33 BLE->ILI9341 Vin->Vcc GND->GND GPIO 9->CS GPIO 7->重置GPIO 8->D/C GPIO 11(MOSI)->SDI(MOSI)GPIO 13(SCK)->SCK GPIO 6->LED

第15步:黑丸

连接摘要:

黑丸 - > ili9341 vin  - > vcc gnd  - > gnd gpio a4  - > cs gpio a2  - >复位gpio a3  - > d / c gpio a7(mosi) - > sdi(mosi)gpio a5(sck) - > sck gpioA1  - > LED

第16步:ESP8266

连接摘要:

ESP8266  - > ili9341 VIN  - > VCC GND  - > GND GPIO 15  - > CS GPIO 2  - > RESET GPIO 4  - > D / C GPIO 13(MOSI) - > SDI(MOSI)GPIO 14(SCK) - > SCK GPIO 5- > LED.

第17步:见到u志肖

连接摘要:

Seeeduino Xiao  - > Ili9341 VIN  - > VCC GND  - > GND GPIO 3  - > CS GPIO 1  - > RESET GPIO 2  - > D / C GPIO 10(MOSI) - > SDI(MOSI)GPIO 8(SCK) - > SCK GPIO0  - > LED

第18步:RTL8720DN

连接摘要:

RTL8720DN->ILI9341 Vin->Vcc GND->GND GPIO 18->CS GPIO 2->重置GPIO 17->D/C GPIO 21(MOSI)->SDI(MOSI)GPIO 19(SCK)->SCK GPIO 23->LED

裁判。:

//www.sledutah.com/rtl8720dn/

步骤19:ESP32

连接摘要:

ESP32->ILI9341 Vin->Vcc GND->GND GPIO 5->CS GPIO 33->重置GPIO 27->D/C GPIO 23(MOSI)->SDI(MOSI)GPIO 18(SCK)->SCK GPIO 22->LED

步骤20:覆盆子皮皮皮

连接摘要:

覆盆子PI PICO  - > ili9341 VIN  - > VCC GND  - > GND GPIO 17  - > CS GPIO 26  - > RESET GPIO 27  - > D / C GPIO 19(MOSI) - > SDI(MOSI)GPIO 18(SCK) - > SCKGPIO 28  - > LED

第21步:数据总线

Arduino\u GFX现在支持以下数据总线:

  • 8位和9位硬件SPI(ESP32SPI)
  • 8位硬件SPI(HWSPI,ESP8266SPI,MBedSPI,NRFXSPI,RPIPICOSPI)
  • 8位和9位软件SPI(SWSPI)
  • 8位并行接口(AVRPAR8、ESP32PAR8、RPiPicoPAR8、RTLPAR8)
  • 16位并行接口(ESP32PAR16,RPIPICOPAR16)

有关GitHub WiKi的更多详细信息:https://github.com/moononournation/Arduino_GFX/wi...

我不能在这里提及所有数据总线类的细节,只是在下面强调一些特殊的内容。

9位SPI

9位SPI不是这个接口最常用的名称,更常见的名称是3线SPI或3线SPI。但我发现三线SPI有两种不同的含义:

  • 没有DC引脚,为每个8位数据附加1位以表示它是命令或数据。3行是CLK,MOSI和MISO
  • 结合MOSI和MISO引脚,数据输入和输出使用相同的GPIO。3线为直流、CLK和MOSI+MISO

所以我会避免称之为三线SPI。

在数字世界中,最小的数据大小是位,而实际最小的数据计算和存储大小是字节(8位)。所以很多单片机只能支持8位的SPI数据传输,我发现esp32spi可以自由控制位传输的个数,所以我让它支持9位SPI。

软件SPI也可以支持9位SPI,只是速度比较慢。

mbedSPI或NRFXSPI

Arduino Nano 33 BLE的官方SPI在彩色显示方面有点慢,甚至比Arduino Nano慢很多。这是网络上的一个众所周知的问题,原因可能是中间的MBEDOS造成的。当我深入研究固件源代码时,我发现了9个与SPI相关的内部类。我选择了两个类。我认为NRFXSPI的实现可以满足64mhz主频的性能,mbedSPI只是一个备份方案,以防NRFXSPI在mbedOS中出现故障。金宝博娱乐城

并行接口

AVR系列是8位MCU,运行在8或16兆赫,最大SPI速度为4兆赫。似乎不够快的彩色显示,显示在第一个视频。8位并行怎么样?MCU可以使用端口操作命令直接访问同一端口下的所有GPIO在1条指令中。因此,AVR 8位并行接口(AVRPAR8)可以比SPI运行得更快。然而,大多数AVR开发板并没有足够的引脚来进行8位端口操作。例如,Arduino UNO仅中断端口D所有8个GPIO,但使用端口D需要牺牲串行端口引脚。

很多32位单片机也有端口操作,但是端口也在32位。这意味着在只设置8位数据(多于1条指令)之前需要一些位操作,因此它不如8位MCU有效。

RPiPicoPAR16数据总线类利用Raspberry-Pi-Pico 32位数据端口的前16位组成16位并行接口,平均只需要2条左右的指令就可以发送16位数据,因此非常高效。

ESP32PAR8、RTLPAR8和ESP32PAR16实际上是并行接口的半软件实现,所以运行速度不是很快。

步骤22:AVR端口修补

如前所述,许多AVR转接板没有转接所有端口GPIO,限制了端口并行接口的使用。如果你想挑战你的焊接技能,你可以自己把缺失的针脚拔出来;>

以上图片和视频均为Arduino Pro Micro 8MHz端口B的所有插脚,并连接到NT35310显示器。

第23步:显示驱动程序

Arduino\u GFX目前支持以下显示:

  • GC9A01圆形显示器240x240
  • HX8347C 240x320
  • HX8347D 240x320
  • HX8352C 240x400型
  • HX8357A 320x480(目前仅肖像作品,即旋转0和2)
  • HX8357B(9位SPI)320x480
  • ili9225 176x220
  • 伊利9341 240x320
  • 伊利9342 320x240
  • 伊利9481 320x480
  • ili9486 320x480
  • ili9488 320x480
  • JBT6K71 240x320
  • NT35310 320x480
  • NT35510 480x800
  • NT39125 240x376型
  • R61529 320x480型
  • SEPS525 160x128
  • SSD1283A 130x130
  • SSD1331 96x64
  • SSD1351 128x128和128x96
  • ST7735 80x160、128x128和128x160各种标签
  • ST7789 135x240,240x240,圆角显示器240x280和240x320
  • ST7796 320x480型

GitHub Wiki中描述了所有显示类的详细信息:https://github.com/moononournation/Arduino_GFX/wi...

您可以在我以前的指令中找到更多显示讨论:https://www.sledutah.com/select-color-displa ...

我不能在这里提及所有显示细节,只需突出以下某些特殊。

gc9a01.

这是一个带有240x240分辨率的圆形显示屏。与ili9341相同,该显示器不是5V I / O容差,因此如果使用5V MCU如Arduino Nano,则需要在GPIO和显示引脚之间进行一些电阻。

#includeArduino_DataBus*bus=create_default_Arduino_DataBus();Arduino_GFX*GFX=新Arduino_GC9A01(总线,7/*RST*/,0/*旋转*/,真/*IPS*/);

HX8357B

这是一个具有320x480分辨率的IPS显示。此显示仅支持9位SPI,因此可以更好地连接ESP32SPI。

#include  Arduino_Databus *总线= New Arduino_ESP32SPI(-1 / * DC * /,5 / * CS * /,18 / * SCK * /,23 / * MOSI * /,-1 / * MISO * /);Arduino_GFX * GFX = New Arduino_HX8357B(总线,7 / * RST * /,0 / *旋转* /,TRUE / * IPS * /);

NT35510

这是我手中的最高分辨率显示,它是480x800。此显示支持8位或16位并行接口。

#includeArduino\u DataBus*bus=new Arduino\u RPiPicoPAR8(27/*DC*/,17/*CS*/,18/*WR*/,19/*RD*/);Arduino_GFX*GFX=新Arduino_NT35510(总线,7/*RST*/,0/*旋转*/);

第24步:画布

ArduinoGFX提供了各种画布类,有时称为framebuffer,用于在复杂的演示文稿上进行绘图缓冲:

  • 画布(16位颜色,每个像素2个字节)
  • 画布索引(半内存空间)
  • canvas_3bit(1/4内存空间帧缓冲器)
  • canvas_mono(1/16内存空间帧缓冲器)

显示仅需要在画布绘制完成后刷新一次,并调用flush()。它可以大大减少显示的抖动,但需要更多的RAM。

首先声明画布输出显示:

#includeArduino_DataBus*bus=create_default_Arduino_DataBus();Arduino_GFX*output_display=新的Arduino_ST7789(总线,TFT_RST,0/*旋转*/,真/*IPS*/);

然后声明画布:(240x320分辨率需要153600字节RAM)

Arduino_GFX * GFX = New Arduino_Canvas(240 / *宽* /,320 / *高度* /,output_display);

步骤25:TFT 3位驱动器

一些显示屏支持3位颜色空间,如ili9488。很难有效地直接实现3位颜色空间。但它可以在中间的Canvas_3bit类合作:

#包括//3位彩色画布,R1G1B1,8色Arduino G*output\u display=新Arduino\u ILI9488\u 3bit(总线,-1/*RST*/,0/*旋转*/,false/*IPS*/);Arduino_uGFX*GFX=新Arduino\u画布\u 3bit(480/*宽度*/,320/*高度*/,输出显示);

步骤26:支持的设备

Arduino_GFX支持相应地创建默认显示等级,以便在“电路板选择”菜单中选择内置显示DEV设备。以下是可识别的DEV设备:

  • Wio终端
  • M5Stack核心家庭(V1)
  • Odroid Go公司
  • TTGO T-Watch

简单声明:

#包括
arduino_gfx * gfx = create_default_arduino_gfx();

步骤27:示例

ArduinoèGFX有几个示例演示如何使用此库:

(Arduino IDE文件菜单 - >示例 - > Arduino的GFX库)

  • 时钟 - 一个简单的非闪烁模拟时钟实现
  • 你好世界 - 每个人都第一次显示程序
  • HelloWorldGfxfont-更多字体
  • IMGViewer - 显示Flash文件系统或SD卡的动画GIF,BMP,JPEG,MJPEG或PNG图像文件
  • MultipledEvicetest - 同时连接多个显示
  • PDQgraphicsTest-您可以在这里找到许多GFX函数演示
  • WiFiAnalyzer-一种简单的WiFi分析仪,适用于WiFi功能平台
  • wifiphotoframe - 在网上下载照片并在飞行中显示

步骤28:更多应用程序

Arduino比赛

这是
Arduino比赛

第一个分享

    建议

    • 后院比赛

      后院比赛
    • 暑期趣味:学生设计挑战

      暑期趣味:学生设计挑战
    • 关于棍棒速度挑战

      关于棍棒速度挑战

    17条评论

    您的字体是否包括渲染温度的学位符号?与25°C或75°F一样。

    0
    陳亮

    23小时前回复

    尝试`gfx-> println(“23”“\ xf7”c“);`

    1.
    范托尔科

    13天前

    你好!你可以解释我可以在哪里改变MOSI和SCLK PIN的我的NRF52模块(或其他微控制器)?

    0
    陳亮

    13天前回复

    nRF52模块?我手头没有这种类型的开发板,但许多MCU无法重新映射硬件SPI引脚。

    0
    范托尔科

    13天前回复

    nRF52832-nRF52840可以改变SPI管脚,Adafruit GFX工作得很好,但是我不知道在你的Lib中哪里可以重新映射管脚

    0
    陳亮

    23小时前回复

    我找不到Adafruit GFX改变引脚,你有样本代码吗?

    0
    陳亮

    13天前回复

    我没有这个MCU的开发板,你能用它来命名开发板吗?或者直接给我们一个链接?

    0
    陳亮

    12天前回复

    好的,我有预算的时候就买一个试试。

    0
    范托尔科

    12天前回复

    你能告诉我在哪里可以设置味噌和SCLK的参数吗?

    0
    陳亮

    12天前回复

    是的,请稍候

    0
    arnov sharma.

    12天前

    谢谢你这么详细的版本,这是非常有用的!

    0
    圆珠笔

    问题12天前第28步

    优秀的演示!

    在哪里可以找到更好看,更流畅的字体的ILI9341?

    0
    拉芬戈

    13天前

    真是太棒了!当然是我见过的最好的!祝贺 你!!

    1.
    奥拉敦K321

    15天前

    极好的。所有这些信息在一个地方。您已经节省了很多时间的搜索并查找并尝试。

    太棒了!多好的资源啊。:)金宝博比分直播手机版