【ESP32-arduino】墨水屏使用GxEPD2库(以微雪墨水屏为例)

最近发现墨水屏还是挺好玩的,在低功耗的场景下十分实用,鉴于arduino有着非常丰富的第三方库,这次试着使用以arduino为框架去搭建工程,使用了GxEPD2电子墨水屏库。

http://​ https://github.com/ZinggJM/GxEPD2 ​

环境:vscode+PlatformIO

硬件:ESP32-S3-WROOM-1-N8R2模组 微雪2.9寸黑白双色墨水屏

创建工程

点击new project

板子配置选一个和你手上板子型号匹配的,如果没有完全匹配的就选择相近的就行,后面可以在platformio.ini文件里面进行芯片配置的详细修改。

框架选择Arduino。

修改工程配置

板级配置

工程创建之后会自动打开platform.ino文件,这时如果你的板子和选择的板子硬件配置上不是完全配备,可以在此文件进行详细修改。

例如我的板子是使用的esp32-s3-wroom模组,有外挂8MB的flash和2MB的PSRAM,就可以加多两行配置:

board_build.flash_size = 8MB
board_build.psram = true

更多设置可以查看官方网站进行了解:

https://docs.platformio.org/page/projectconf.html

连接第三方库

我们需要使用到GxEPD2库,需要将他下载到我们的工程中。

点击Libraries。

搜索GxEPD2。

点击进去下载到工程。

会发现libdeps\esp32-s3-devkitm-1下多出了三个库,GxEPD2就是我们要接触的库。

复制GxEPD2\example\GxEPD2_WS_ESP32_Driver的GxEPD2_WS_ESP32_Driver.ino文件到工程根目录下的src文件夹,删除main.cpp,将GxEPD2_WS_ESP32_Driver后缀改成.cpp

报错暂时不用管。

添加头文件

屏幕配置选择

颜色选择

// select the display class (only one), matching the kind of display panel
#define GxEPD2_DISPLAY_CLASS GxEPD2_BW
//#define GxEPD2_DISPLAY_CLASS GxEPD2_3C
//#define GxEPD2_DISPLAY_CLASS GxEPD2_4C
//#define GxEPD2_DISPLAY_CLASS GxEPD2_7C

首先是选择屏幕颜色,按照自己屏幕规格选

尺寸及显示IC选择

// select the display driver class (only one) for your  panel
//#define GxEPD2_DRIVER_CLASS GxEPD2_290     // GDEH029A1   128x296, SSD1608 (IL3820), (E029A01-FPC-A1 SYX1553)
//#define GxEPD2_DRIVER_CLASS GxEPD2_290_T5  // GDEW029T5   128x296, UC8151 (IL0373), (WFT0290CZ10)
//#define GxEPD2_DRIVER_CLASS GxEPD2_290_T5D // GDEW029T5D  128x296, UC8151D, (WFT0290CZ10)
//#define GxEPD2_DRIVER_CLASS GxEPD2_290_I6FD // GDEW029I6FD  128x296, UC8151D, (WFT0290CZ10)
//#define GxEPD2_DRIVER_CLASS GxEPD2_290_T94 // GDEM029T94  128x296, SSD1680, (FPC-7519 rev.b)
#define GxEPD2_DRIVER_CLASS GxEPD2_290_T94_V2 // GDEM029T94  128x296, SSD1680, (FPC-7519 rev.b), Waveshare 2.9" V2 variant
//#define GxEPD2_DRIVER_CLASS GxEPD2_290_BS // DEPG0290BS  128x296, SSD1680, (FPC-7519 rev.b)
//#define GxEPD2_DRIVER_CLASS GxEPD2_290_M06 // GDEW029M06  128x296, UC8151D, (WFT0290CZ10)

选择屏幕规格,一般看两个参数,一个是屏幕尺寸,一个是显示IC的型号,以我手上的板子为例,尺寸是2.9,显示IC是SSD1680,所以把这行取消注释,进行屏幕的选择,这里大家在选择的时候要看清除屏幕显示IC是否对的上,可以通过查阅数据手册了解屏幕的显示IC型号。(屏幕规格太多,其他的屏幕代码就不放上去了)

// somehow there should be an easier way to do this
#define GxEPD2_BW_IS_GxEPD2_BW true
//#define GxEPD2_3C_IS_GxEPD2_3C true
//#define GxEPD2_7C_IS_GxEPD2_7C true
//#define GxEPD2_1248_IS_GxEPD2_1248 true
#define IS_GxEPD(c, x) (c##x)
#define IS_GxEPD2_BW(x) IS_GxEPD(GxEPD2_BW_IS_, x)
// #define IS_GxEPD2_3C(x) IS_GxEPD(GxEPD2_3C_IS_, x)
// #define IS_GxEPD2_7C(x) IS_GxEPD(GxEPD2_7C_IS_, x)
// #define IS_GxEPD2_1248(x) IS_GxEPD(GxEPD2_1248_IS_, x)

把不用的宏注释掉

初始化屏幕

#if defined(ESP32)
#define MAX_DISPLAY_BUFFER_SIZE 65536ul // e.g.
#if IS_GxEPD2_BW(GxEPD2_DISPLAY_CLASS)
#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8))
#elif IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS)
#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8))
#elif IS_GxEPD2_7C(GxEPD2_DISPLAY_CLASS)
#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2))
#endif
GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25));
#endif

这里配置和初始化了屏幕

引脚分析(可跳过)

通过查看模组数据手册发现,

IO27 、IO26、IO25引脚并未引出,被用于与flash之间进行通信,所以要进行引脚的修改

引脚修改
GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=*/15, /*DC=*/16, /*RST=*/17, /*BUSY=*/3));

 在这行代码中根据自己的实际需求对引脚进行修改。

位图选择

// comment out unused bitmaps to reduce code space used
// #include "bitmaps/Bitmaps200x200.h" // 1.54" b/w
// #include "bitmaps/Bitmaps104x212.h" // 2.13" b/w flexible GDEW0213I5F
// #include "bitmaps/Bitmaps128x250.h" // 2.13" b/w
#include "bitmaps/Bitmaps128x296.h" // 2.9"  b/w
// #include "bitmaps/Bitmaps176x264.h" // 2.7"  b/w
// #include "bitmaps/Bitmaps400x300.h" // 4.2"  b/w
// #include "bitmaps/Bitmaps640x384.h" // 7.5"  b/w
// 3-color
// #include "bitmaps/Bitmaps3c200x200.h" // 1.54" b/w/r
// #include "bitmaps/Bitmaps3c104x212.h" // 2.13" b/w/r
// #include "bitmaps/Bitmaps3c128x296.h" // 2.9"  b/w/r
// #include "bitmaps/Bitmaps3c176x264.h" // 2.7"  b/w/r
// #include "bitmaps/Bitmaps3c400x300.h" // 4.2"  b/w/r

注释掉不用的位图节省代码空间

SPI引脚修改

hspi.begin(13, 12, 14, 15); // remap hspi for EPD (swap pins)

在void setup()函数里可以对进行引脚修改

函数声明

void helloWorld();
void helloWorldForDummies();
void helloFullScreenPartialMode();
void helloArduino();
void helloEpaper();
void deepSleepTest();
void showBox(uint16_t x, uint16_t y, uint16_t w, uint16_t h, bool partial);
void drawCornerTest();
void showFont(const char name[], const GFXfont *f);
void drawFont(const char name[], const GFXfont *f);
void showPartialUpdate();
void drawBitmaps();
void drawBitmaps128x296();

将后面的测试函数放到前面声明,在void setup()前面插入这段就好了

编译

build一下,没有问题

接线

按照自己修改的引脚进行接线

CS   --> 15
DC   --> 16
RST  --> 17
BUSY --> 3
CLK  --> 13
DIN  --> 14
GND  --> GND
VCC  --> 3.3V

烧录之后即可看到现象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值