摘要:本文主要介绍在Arduino IDE开发环境下,如何快速上手使用MCU驱动不同的墨水屏;一、关于GxEPD2库
在Arduino IDE开发环境中,驱动墨水屏的相关库有:GxEPD / GxEPD2 等;
GxEPD2是GxEPD的升级,专门用于控制带有SPI接口的电子纸显示器(EPD),GxEPD2库依赖于Adafruit_GFX图形库,可用于绘制文本和几何形状等功能;
(除了Adafruit_GFX库的基础功能之外,GxEPD2库还有专用于EPD显示的优化等功能)

关于GxEPD2库
GxEPD2_Arduino库是驱动SPI接口电子墨水屏的强大工具,支持Good Display和Waveshare等的各种E-Paper显示屏;
是一个用于MCU (Arduino / ESP32等) 驱动SPI接口电子纸显示屏的显示库:
主要核心功能:
屏幕驱动与通信抽象:封装了 SPI 通信、初始化、刷新流程,不用直接操作底层命令就能把内容显示到电子纸上;
图形与文字绘制能力:与 Adafruit_GFX 兼容,可绘制文字、线条、矩形、位图等;
支持多种型号与刷新方式:覆盖很多不同尺寸/型号的电子纸,并提供局部刷新/快速刷新等能力;
资源受限设备的使用模式:提供分页/分块等绘制方法,适配小内存的MCU等;
很多裸电子纸面板 / 模块需要3.3V供电与3.3V逻辑电平;不要直接把Arduino的5V_IO接上去,需要电平转换 / 分压等保护措施;

屏幕支持:1.54寸黑白 / 2.13寸4色 / 2.9寸黑白(三色) / 4.2寸黑白(三色) GDEWx、GDEMx、GDEYx 等型号;
开发板支持:ESP32 / ESP8266 / AVR(UNO/Nano) / STM32 / RP2040等;

二、开发环境搭建
1、下载开发环境 Arduino IDE;

2、安装库
1、安装 GxEPD2 库;

2、复制相关头文件
路径:...\Arduino IDE\Documents\libraries\GxEPD2\examples\GxEPD2_HelloWorld
将以下文件复制到自己的工程项目中;

3、关于头文件作用
GxEPD2_display_selection_new_style.h:新版API配置文件(屏幕显示 / 驱动)等功能;
(新版配置方法更加直观)
// 旧版配置方式
#include "GxEPD2_display_selection.h"
#include "GxEPD2_display_selection_added.h"
// 新版配置方式
#include "GxEPD2_display_selection_new_style.h"GxEPD2_selection_check.h:用于检查屏幕类型与驱动类是否匹配;
GxEPD2_wiring_examples.h:显示不同硬件MCU的引脚(默认SPI)连接方式;
三、使用方法

开发方式主要为:
1、裸屏 / 转接板 + 开发板;【大多数开发方式】
2、带接口的主控驱动板 / 带驱动板屏幕 (Waveshare ESP32 Driver Board / E-Paper Shield等);
1、开发硬件
当前使用的开发硬件为:Arduino GIGA R1开发板 + 2.9寸黑白红(三色)墨水屏 + 24pin_SPI转接板;
GIGA R1开发板

2.9寸(296×128)三色墨水屏(WFT0290CZ10)

24pin_SPI转接板


实物搭建效果:

2、参数配置
在 GxEPD2_display_selection_new_style.h 头文件中进行配置;
2.1、屏幕配置
1、显示类型(色彩)配置
当前硬件为三色墨水屏,故取消 #define GxEPD2_DISPLAY_CLASS GxEPD2_3C 注释;
GxEPD2_BW:黑白(两色);
GxEPD2_3C:红黑白(三色);√
GxEPD2_4C:黑白红黄(四色);
GxEPD2_7C:黑白红绿黄橙蓝(彩色);
同时在当前项目.ino中添加所对应的头文件:
#include <GxEPD2_BW.h> //黑白
#include <GxEPD2_3C.h> //3色 √
#include <GxEPD2_4C.h> //4色
#include <GxEPD2_7C.h> //7色(彩色)

2、显示驱动IC配置
当前硬件为WFT0290CZ10 / GDEW029Z10 (IC:UC8151)
故取消 #define GxEPD2_DRIVER_CLASS GxEPD2_290c 注释;
如果实在不知道当前屏幕的IC类型 / 型号是哪个
可以选择当前屏幕所对应色彩(3-color)、分辨率(128x296)下的IC
然后一个个试,直到能正常显示;


2.2、开发板配置
1、使用默认SPI方法
默认SPI引脚示例(GxEPD2_wiring_examples.h)
GxEPD2_wiring_examples.h :有不同开发板所对应的硬件默认SPI(SCK / MOSI)等引脚连接定义;
因此只需在项目中自定义 CS / DC / RST / BUSY 引脚即可
(若不指定,则默认使用 GxEPD2_wiring_examples.h 中的相关引脚定义)
例:

2、使用自定义SPI方法
(更多其他MCU 自定义SPI配置方法详见:【GxEPD2_Example.ino】示例)
示例:
// ESP32 开发板
SPIClass hspi(HSPI);
void setup{
...
hspi.begin(SCLK_Pin, MISO_Pin, MOSI_Pin, CS_Pin); // SCLK, MISO, MOSI, SS
display.epd2.selectSPI(hspi, SPISettings(4000000, MSBFIRST, SPI_MODE0));
display.init(115200);
...
}
-------------------------------------------
// ARDUINO_ARCH_RP2040 / ARDUINO_RASPBERRY_PI_PICO / ARDUINO_RASPBERRY_PI_PICO_W
arduino::MbedSPI SPIn(miso_pin, mosi_pin, sck_pin); // MbedSPI(int miso, int mosi, int sck);
void setup{
...
display.epd2.selectSPI(SPIn, SPISettings(4000000, MSBFIRST, SPI_MODE0));
display.init(115200);
...
}3、软件SPI驱动方法示例:...\Arduino IDE\Documents\libraries\GxEPD2\extras\sw_spi
3、示例代码
相关英文字体文件路径:...\Arduino IDE\Documents\libraries\Adafruit_GFX_Library\Fonts
相关display功能函数API(对应屏幕色彩头文件):#include <GxEPD2_3C.h>
若要使用默认相关中文字体,需导入 U8g2_for_Adafruit_GFX 库;
#include <U8g2_for_Adafruit_GFX.h>
使用示例
1、包含主要相关头文件
#include "GxEPD2_display_selection_new_style.h"
#include <GxEPD2_3C.h>
2、选择SPI方式 (默认 / 自定义)
1、自定义相关引脚
#define EPD_CS / DC / RST / BUSY
2、选择不同MCU所对应的SPI配置方法 (详见:GxEPD2_Example.ino)
示例代码
#include "GxEPD2_display_selection_new_style.h" // 在该文件中定义 GxEPD2_DRIVER_CLASS / GxEPD2_DISPLAY_CLASS
#include <GxEPD2_3C.h> // 3色
// #include <GxEPD2_BW.h> //黑白
#include <Fonts/FreeSansBold18pt7b.h> //定义在 Adafruit_GFX库中fonts文件夹的英文字体
// 自定义引脚
#define EPD_CS 10
#define EPD_DC 8
#define EPD_RST 9
#define EPD_BUSY 7
// 1、默认SPI: 引脚定义在 `GxEPD2_wiring_examples`
// 若使用分页模式: GxEPD2_DRIVER_CLASS::HEIGHT / 2
// GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, GxEPD2_DRIVER_CLASS::HEIGHT> display(
// GxEPD2_DRIVER_CLASS(/*CS=*/ EPD_CS, /*DC=*/ EPD_DC, /*RST=*/ EPD_RST, /*BUSY=*/ EPD_BUSY));
// 2、指定SPI:
// 若为 ESP32: SPIClass hspi(HSPI);
// 若为 Arduino_MbedOS
arduino::MbedSPI SPIn(12, 11, 13); // MbedSPI(int miso, int mosi, int sck);
// 指定自定义引脚
GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, GxEPD2_DRIVER_CLASS::HEIGHT> display(
GxEPD2_DRIVER_CLASS(/*CS=*/ EPD_CS, /*DC=*/ EPD_DC, /*RST=*/ EPD_RST, /*BUSY=*/ EPD_BUSY));
void helloWorld()
{
display.setRotation(1); //设置显示方向
display.setFont(&FreeSansBold18pt7b); //设置字体
display.setTextColor(GxEPD_RED); // 设置字体颜色
int16_t tbx, tby; uint16_t tbw, tbh;
display.getTextBounds("Hello World", 0, 0, &tbx, &tby, &tbw, &tbh); // tbx:X轴偏移量 tbw:文本总宽度
uint16_t x = ((display.width() - tbw) / 2) - tbx; // 水平居中
uint16_t y = ((display.height() - tbh) / 2) - tby;// 垂直居中
display.setFullWindow();
display.firstPage();
do
{
display.fillScreen(GxEPD_WHITE); // 清屏
display.setCursor(x, y); // 居中显示
display.print("Hello World");
}
while (display.nextPage());
}
void setup()
{
Serial.begin(115200);
// Arduino_MbedOS
display.epd2.selectSPI(SPIn, SPISettings(4000000, MSBFIRST, SPI_MODE0)); // SPI设置
// 若为 ESP32
/* hspi.begin(13, 12, 14, 15); // SCLK, MISO, MOSI, SS
display.epd2.selectSPI(hspi, SPISettings(4000000, MSBFIRST, SPI_MODE0)); */
display.init(115200); // 初始化屏幕
helloWorld();
display.hibernate(); // 进入休眠模式
}
void loop() {};四、效果演示
屏幕显示“Hello World”字符;



我要赚赏金
