最近发现墨水屏还是挺好玩的,在低功耗的场景下十分实用,鉴于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
烧录之后即可看到现象