使用GxEPD2库深入了解CrowPanel ePaper显示器的功能
扫描二维码
随时随地手机看文章
介绍
在上一篇文章中,我们探讨了CrowPanel ePaper显示器的主要特性,并通过一个简单的示例学习了如何使用Elecrow库与Arduino一起控制5.79″面板。
这一次,我们将通过使用GxEPD2库(用于控制ePaper屏幕的流行Arduino库)深入了解该显示器的功能,并将我们所学到的一切应用于具体项目:实时比特币价格监视器。
GxEPD2库
GxEPD2是GxEPD的演变,是Arduino库的第一个版本,专门用于控制带有SPI接口的电子纸显示器(EPD -电子纸显示器)。GxEPD2由Jean-Marc Zingg (ZinggJM)开发,扩展了其前身的功能,并为Good Display和Waveshare等领先制造商的各种显示器提供支持。
GxEPD2库依赖于另一个广泛使用的库Adafruit_GFX进行操作。这个库由Adafruit开发,是Arduino生态系统中最受欢迎的库之一。它提供了一组功能,用于在各种显示器上绘制文本和几何形状,如LCD和OLED屏幕。
这两个库之间的关系可以总结如下:虽然Adafruit_GFX处理图形原语并提供渲染图形和文本的基本工具,但GxEPD2通过专门管理ePaper显示器(EPD)及其SPI通信接口的控制来补充它。这样,Adafruit_GFX管理可视化表示,GxEPD2侧重于epd的操作和功能。
接下来,我将解释如何在Arduino IDE 2中安装GxEPD2和Adafruit_GFX库,以便与5.79″Elecrow面板一起使用它们,以及如何利用它们的功能来显示文本,图形和图像。
在本教程中,我假设您已经安装并配置了Arduino IDE 2,以使用5.79英寸的CrowPanel。如果没有,我建议您阅读我之前的文章,在那里我解释了如何设置它。
安装
在使用这些库之前,您需要按照标准过程将它们安装到Arduino IDE中。
由于GxEPD2依赖于Adafruit_GFX,您只需要直接安装GxEPD2。在安装过程中,IDE将检测依赖项并提示您安装Adafruit库。此时,只需确认并继续安装即可。
该过程与安装任何其他库相同。单击左侧工具栏中的库管理器或从主菜单中选择工具→管理库。
使用任何一种方法都会打开一个搜索框。输入GxEPD2来搜索库,当找到它时,单击INSTALL按钮。
版本:确保安装最新版本的GxEPD2,不要将其与GxEPD混淆,后者是旧版本。
在IDE中,您应该看到如下内容:
图1所示。安装GxEPD2
单击INSTALL后,IDE将检测与其他库(如Adafruit_GFX)的依赖关系,并询问您是否也想安装它们。单击INSTALL ALL确认
图2所示。GxEPD2的依赖项
几分钟后,IDE将下载并安装所有必要的文件。
连接
使用GxEPD2库的第一步是配置ePaper连接,指定将哪些微控制器引脚分配给各种控制信号。在这种情况下,我们需要定义BUSY, RST(复位),DC(数据/命令),CS(芯片选择),SCK(串行时钟)和MOSI(主输出,从输入)信号。
幸运的是,Elecrow已经在他们的存储库中分享了该面板的原理图,使得检查和识别ESP32上连接到这些信号的引脚变得容易。
图3所示。5.79″面板电路(片段)
我们感兴趣的连接是前面图片中用红色标记的那些:
图4所示。电子报连接
安装好所有库并准备好ePaper连接细节之后,我们就可以开始使用GxEPD提供的各种特性编写代码了。为了使其更具吸引力,我们将朝着一个具体的目标努力:开发一个充分利用该面板的特定应用程序。
实时比特币监控
接下来,我们将探索使我们能够控制ePaper显示的几个GxEPD2函数。我们的目标是建立一个实时比特币价格监视器。该设备将从在线服务中获取加密货币的当前值并将其显示在屏幕上。我们将包括图像、文本和数字,以一种有吸引力和视觉组织的方式呈现关键信息。
最终的结果看起来像这样:
图5所示。行动中的监视器
为了开发这个应用程序的代码,我们将学习如何单独控制每个元素。我们将分解并分析每一步,所以让我们从基础开始。
显示文本
让我们从简单的事情开始:在屏幕上显示文本。这不仅可以帮助我们熟悉与文本相关的函数,还可以教我们如何正确地初始化面板和库。
GxEPD2提供了处理文本的各种功能,例如编写消息、选择字体、调整颜色和定义大小。
下面是一个使用不同字体和文本大小显示经典“Hello, World!”消息的示例:
让我们分解代码来理解它是如何工作的:
在代码的第一行中,我们发现了几个#include指令。第一个集成了GxEPD2库,特别是为单色显示设计的版本(因此添加了BW)。下面的#include指令用于加载字体定义,稍后我们将使用这些定义在屏幕上显示文本。
可用的字体是在Adafruit_GFX库中定义的,位于fonts文件夹中。每种字体都使用头文件(.h)定义。
图6所示。字体定义
每种字体的名称表示字体、样式和大小。例如,前面示例中使用的字体FreeSans24pt7b可以分解为以下元素:
Free:表示该字体为自由字体,没有许可限制。
Sans:指现代风格的字体,如Arial。它也可以是Mono,一种简单的等宽字体,或Serif,一种更具装饰性的字体,如Times New Roman。
加粗:表示字体加粗。如果没有指定,它也可以是斜的(斜体)或正则的。
24pt:指以点为单位的字体大小。
7b:表示使用7位值定义字体。
要选择显示文本的字体,必须使用setFont方法,但首先需要通过包含相应的头文件来加载字体定义。
继续进行代码分析,我们找到了几个指定ePaper连接的常量的定义,如前所述。这些值是必需的,稍后将用于创建表示显示的对象。
下一步是创建与显示相关联的对象。为此,我们使用一个名为GxEPD2_BW的模板,它接受以下参数:
GxEPD2_579_GDEY0579T93:类标识符,充当此显示模型的特定驱动程序。
GxEPD2_579_GDEY0579T93::HEIGHT:一个常量,它定义了显示的高度,并确定将使用分页模式还是非分页模式(不要担心,稍后我会解释这意味着什么)。
5.79″CrowPanel(像其他型号一样)没有在GxEPD2支持的显示器中列出,因为它是除了ePaper显示器之外集成了几个组件的设备。根据我的测试,所包含的显示器的特性与Good display中的GDEY0579T93型号匹配,该型号是本示例代码中使用的型号。
最后,为显示对象使用构造函数(如果愿意,您可以重命名它),再次将显示标识符作为参数与连接引脚的详细信息一起传递(使用我们前面定义的常量)。
CrowPanel的另一个独特之处在于它包含了一个控制屏幕电源的电路,从而实现了高效的能源管理。
该电路的控制引脚是GPIO7,因此在尝试访问显示器之前,第一步是通过将该引脚设置为HIGH来打开电源。
为了实现这一点,我包含了displayPowerOn函数,它处理这个任务:
继续编写代码,我们将转向Arduino中的设置函数。
正如您所看到的,它由对属于显示对象的各种方法的调用组成,这就是使用语法display.method(parameters)的原因。让我们回顾一下每个方法的作用:
init:初始化显示对象的几个元素。这里,我们提供值115200,它为通过串行监视器的诊断输出设置波特率。您可以通过将其设置为0来禁用它,但这有助于理解库正在做什么。
setFullWindow:表示将使用整个屏幕。也可以只使用屏幕的一部分来加速刷新过程(这称为部分刷新,我们将在后面讨论)。
fillScreen:用一种颜色填充屏幕,在本例中为白色(GxEPD_WHITE),清除之前的任何内容。您可以使用任何支持的颜色:
黑色(GxEPD_BLACK)
白色(GxEPD_WHITE)
以90度的倍数定义屏幕的方向。
setTextColor:设置文本颜色。
setTextSize:设置文本的大小。
最后,有几个块使用不同的字体显示文本:setFont指定要使用的字体或字体,setCursor将光标定位在所需的位置(原点(0,0)位于左上角),print将文本输出到屏幕上。
实际上,上面提到的方法并不直接在屏幕上显示任何内容。相反,所有指令都作用于缓冲区或内存区域,然后必须将其传输到屏幕上以使其可见。实现这一点的一种方法是使用display方法,稍后我们将探讨另一种方法。
将缓冲区的内容传输到屏幕的过程也称为刷新。
下面是代码的实际效果:
图7所示。使用不同字体的文本
图形
GxEPD2库还包括绘制图形元素(如点和线)以及几何形状(如矩形、圆形和三角形)(空心和填充)的方法。
在下面的示例中,我使用其中一些方法来显示条形图。代码如下:
如您所见,第一部分与“Hello World!”示例非常相似。这里,我们还包括必要的库,定义引脚,并创建显示对象。设置函数开始时显示的初始化也非常相似。
接下来,我们有绘制条形图的部分。为此,我反复使用两种方法来绘制直线和矩形:
drawLine(x0, y0, x1, y1, color):以指定颜色绘制从点(x0, y0)到点(x1, y1)的直线。
drawRect(x, y, w, h, color):以指定的颜色绘制一个从左上角(x, y)开始的矩形,宽度为w像素,高度为h像素。注意,矩形的原点是它的左上角,它是“向下”绘制的。
fillRect(x, y, w, h, color):类似于drawRect,但是矩形被指定的颜色填充。
图8所示。图形使用示例
具体来说,这个例子创建了一个500像素宽、200像素高的画布,然后使用水平线和垂直线对其进行细分。左侧的标签表示不同的值。由于画布水平分为50个部分,因此定义了一个包含50个随机值的数组,并将其显示为黑色条。
图片
如果上面提到的图形元素还不够,而您想要显示位图图像,不要担心——gxepd2也支持这一点。此外,图像不需要占据整个屏幕;您可以显示任何大小的位图,并将它们放置在任何位置。
该过程与我在前一篇文章中解释的过程相同:首先,获取图像(必须是单色的),并使用image2lcd程序将其转换为头文件(.h)。然后,使用#include指令将该文件包含在代码中,并使用drawBitmap方法将其放置在屏幕上。
drawBitmap的语法如下:
drawBitmap (x, y, bitmap, w, h, color);
地点:
x, y:位图的起始坐标(左上角)。
bitmap:图像的标识符(在.h文件中定义)。
w, h:位图的宽度和高度,以像素为单位。
颜色:“前景”颜色,以区别于屏幕背景。
您需要采取的唯一预防措施是在将图像转换为image2lcd之前对其进行水平镜像。
图9所示。反映图像
在下面的示例中,我将向您展示如何加载位图(在本例中为比特币符号)并将其显示在屏幕中央。
在这个例子中,width()和height()方法的使用值得注意。这些方法返回屏幕尺寸,使计算原点坐标(bitmapX和bitmapY)以正确居中位图变得容易。
运行上述代码后,显示如下图像:
图10所示。位图使用实例
局部刷新
在前面的示例中,我们使用了不同的方法来显示文本、图形和图像。在每种情况下,使用display()方法更新整个屏幕,该方法在屏幕上呈现操作的结果。此外,在所有示例中,我们都使用setFullWindow()初始化屏幕。这确保了display()重新绘制整个屏幕,执行所谓的完全刷新。
更新整个屏幕是一个相对缓慢的过程。虽然在程序开始时执行一次通常不会出现问题,但是当需要频繁更新值时,例如使用每两秒钟刷新一次的温度传感器时,这就变得不方便了。在这种情况下,延迟是不可接受的。
幸运的是,5.79″CrowPanel支持一个称为部分刷新的功能,它允许只更新屏幕的特定部分,而无需重新绘制所有像素。这不仅明显更快,而且还消除了与完全刷新相关的闪烁。由于部分刷新,可以在更新更快的ePaper上显示动态值。
并非所有的ePaper显示器都支持部分刷新。它在单色电子纸显示器上比在多色电子纸显示器上更常见。
下面的视频演示了两种刷新技术之间的比较。它显示计数器的值,从1到10,首先使用完全刷新,然后使用部分刷新。差异是显著的。
在本例中,我使用GxEPD中所谓的分页模式对方法进行了略微不同的结构。
分页模式是为RAM有限的微控制器(如Arduino UNO)设计的。不是在内存中存储整个屏幕的缓冲区,而是只存储屏幕的一小部分(例如,一半)。然后分两个步骤执行刷新:首先,在缓冲区中生成一半屏幕的内容并传输,然后重用相同的缓冲区来准备和传输另一半屏幕。虽然这种方法比一次刷新整个屏幕要慢,但它显著减少了内存使用。
要使用分页模式,首先需要指定缓冲区仅代表全屏的一小部分。这是在创建显示对象时完成的。例如,要使用一半的屏幕,您可以将缓冲区大小设置为HEIGHT/2。
接下来,访问屏幕的方法必须遵循这个结构:
使用firstPage方法启动分页周期。
将修改屏幕的方法包含在do..while循环中。
在nextPage方法返回true时重复循环,这表明仍有数据有待传输到屏幕。
回到这个例子,虽然我将定义缓冲区以覆盖整个屏幕(因为这个面板上的ESP32-S3有足够的内存),但我将以分页模式的风格组织代码:
正如您所看到的,关键的区别在于,在第一部分中,屏幕是用setFullWindow()初始化的,而随后是用setPartialWindow()完成的。
setPartialWindow()方法在屏幕中定义了一个“窗口”,它将被修改和更新,而屏幕的其余部分保持不变。
这个方法的语法是:
setPartialWindow (x, y, w, h);
地点:
x, y:部分刷新窗口的起始坐标。
w, h:窗口的宽度和高度。
界面按钮
所有CrowPanel模型都在侧面包含一组按钮以支持用户交互。它们由两个按钮和一个连接到ESP32-S3的旋转开关组成,ESP32-S3的状态可以直接从程序中读取。
图11所示。用户按钮
连接引脚如图所示:
图12所示。按钮连接
这意味着MENU连接到GPIO2, EXIT连接到GPIO1,旋转开关为GPIO6,为GPIO4,按下旋转开关激活GPIO5。每个输入都有一个PULL_UP电阻,所以当它们被拉低时被激活。
把它们放在一起
我们终于到达终点了!如果你已经走到这一步,恭喜你的耐心!
让我们把我们所学到的一切应用到实际应用中:比特币价格监视器。该监视器将从CoinGecko(一个具有非常简单API的网站)获取比特币的实时价格。该API允许我们在不需要注册或API密钥的情况下发出GET请求。
我们将每30秒发出一个请求(重要的是不要过于频繁地发出请求,因为站点可能会返回0的值),检索值将使用部分刷新显示在面板上。此外,我们将实现按钮控制:按MENU将显示美元(USD)的价格,按EXIT将显示欧元(EUR)的价格。
请求使用的端点如下:
并以JSON格式返回值:
{“比特币”:{“美元”:101971年,“欧元”:98173}}
为了提取不同的字段(通常称为“解析JSON”),我们将使用ArduinoJson库。
下面是比特币监视器的运行情况。
存储库
这个项目中使用的代码和图像可以在这个存储库中找到。其余的示例可以在另一个存储库中获得。
结论
在本文中,我们通过使用GxEPD2库探索了5.79英寸CrowPanel的高级功能,GxEPD2库是一种广泛采用的用于控制ePaper显示的通用工具。从最初的设置到集成文本渲染、图形和部分刷新等功能,我们成功构建了一个融合了设计和功能的比特币监视器。
在整个过程中,我们学会了:
在Arduino IDE环境中安装和配置基本库,如GxEPD2和Adafruit_GFX。
使用Elecrow提供的原理图定义ePaper面板的物理连接。
使用先进的技术,如部分刷新,以优化电子纸显示性能,减少刷新时间,消除不必要的闪烁。
合并物理控件,如CrowPanel按钮,以提供交互式用户界面。
通过利用CoinGecko API来获取美元和欧元的实时价格更新,实现实时比特币监控。
构建此监视器不仅展示了CrowPanel和GxEPD2库的功能,而且还提供了开发微控制器动态应用程序的实用方法,特别是在数据可视化方面。
虽然这个例子集中在比特币监视器上,但所提供的工具和概念适用于使用ePaper显示器的广泛项目,从环境监视器到信息面板。使用GitHub存储库中的示例,您可以自定义和扩展此项目以满足您的特定需求。
本文编译自hackster.io