Third-party Arduino Library for Heltec E-Ink Displays.
Run-time drawing, using Adafruit-GFX.
See Getting Started with Vision Master for instructions on setting up Arduino IDE or PlatformIO.
(Important platformio.ini config)
| Model | Driver Class | Front Image | Rear Image | Resolution (px) |
|---|---|---|---|---|
| E213 V1.1 | EInkDisplay_VisionMasterE213V1_1 |
![]() |
![]() |
250 x 122 |
| E213 | EInkDisplay_VisionMasterE213 |
![]() |
![]() |
250 x 122 |
| E290 | EInkDisplay_VisionMasterE290 |
![]() |
![]() |
296 x 128 |
#include "heltec-eink-modules.h"
EInkDisplay_VisionMasterE213 display;
void setup() {
display.print("Hello, World!");
display.update();
}
void loop() {}See Getting Started with Wireless Paper for instructions on setting up Arduino IDE or PlatformIO.
(Important platformio.ini config)
| Hardware Version | Driver Class | Flex Connector Label | Front Image | Rear Image |
|---|---|---|---|---|
| V1.2 | EInkDisplay_WirelessPaperV1_2 |
(not visible) | (no image available) | (no image available) |
| V1.1.1 | EInkDisplay_WirelessPaperV1_1_1 |
(not visible) | (no image available) | (no image available) |
| V1.1 | EInkDisplay_WirelessPaperV1_1 |
(not visible) | ![]() |
![]() |
| Original (V1.0) | EInkDisplay_WirelessPaperV1 |
FPC-7528B | ![]() |
![]() |
#include "heltec-eink-modules.h"
EInkDisplay_WirelessPaperV1_1 display;
void setup() {
display.print("Hello, World!");
display.update();
}
void loop() {}A low power state is available for the whole board (18μA while sleeping).
Pay attention to the model name: you will need it to use the library.
| Model Name | Flex Connector Label | Front Image | Rear Image | Colors | Screen Protector | Resolution (px) | Fastmode (partial refresh) |
|---|---|---|---|---|---|---|---|
| DEPG0154BNS800 | FPC-7525 | ![]() |
![]() |
Black, White | Red Tab | 152 x 152 | Yes |
| DEPG0150BNS810 | FPC-8101 | ![]() |
![]() |
Black, White | Red Tab | 200 x 200 | Yes |
| GDEP015OC1 ? | HINK-E0154A05-A2 | ![]() |
![]() |
Black, White | Blue Tab | 200 x 200 | Yes |
| Model Name | Flex Connector Label | Front Image | Rear Image | Colors | Screen Protector | Resolution (px) | Fastmode (partial refresh) |
|---|---|---|---|---|---|---|---|
| DEPG0213RWS800 | FPC-7528B | ![]() |
![]() |
Black, White, Red | Red Tab | 250 x 122 | No |
| QYEG0213RWS800 | FPC-7528 | ![]() |
![]() |
Black, White, Red | Red Tab | 250 x 122 | No |
| Model Name | Flex Connector Label | Front Image | Rear Image | Colors | Screen Protector | Resolution (px) | Fastmode (partial refresh) |
|---|---|---|---|---|---|---|---|
| DEPG0290BNS800 | FPC-7519 rev.b | ![]() |
![]() |
Black, White | Red Tab | 296 x 128 | Yes |
| DEPG0290BNS75A | FPC-750 | ![]() |
![]() |
Black, White | Red Tab | 296 x 128 | Yes |
| GDE029A1 | SYX-1553 | ![]() |
![]() |
Black, White | Blue Tab | 296 x 128 | Yes |
DEPG0290BNS800 can also be used with an external driver board that provides
active-low reset and switched power. The external constructors add a 60-second
active-high BUSY timeout and leave power enabled after successful full or fast
updates; the original module and Vision Master E290 constructors keep their
existing behavior. Its fast mode supports selected image-RAM windows, but this
does not establish that the controller drives only the selected gate region.
The exact controller part number is not asserted here because the available
panel-specific documentation does not identify it conclusively. See the
panel API for constructor and recovery details.
| Model Name | Colors | Resolution (px) | Fastmode (partial refresh) |
|---|---|---|---|
| DEPG1020BNS770F1 | Black, White | 960 x 640 | Experimental window refresh |
DEPG1020BNS770F1 requires a suitable SSD1677 driver board; do not connect the
panel FPC directly to a microcontroller. This driver supports monochrome full
refresh and experimental partial-window refresh using the supplied SSD1677
MCU-loaded waveform. Establish a successful full-screen image before selecting
fastmodeOn() and setWindow(), and perform periodic full refreshes to reduce
residual images. Full and partial refreshes now keep driver-board power on;
only BUSY timeout protection disables it. See the
panel API for compatibility and recovery requirements.
Paging avoids allocating the complete 76,800-byte framebuffer: a page height
of 32 rows uses 3,840 bytes. Full-refresh paged drawing initializes both 0x24
and 0x26 with identical image data before partial updates. The user confirmed
normal display on the RC32 setup on 2026-10-08 after this baseline fix. RC52,
long-term partial refresh, and timeout recovery still require hardware validation.
Warning: in some cases, connecting directly to the display will cause damage!
See your boards's wiring page for specific information:
- Wiring: Arduino Uno R3 / Arduino Nano
- Wiring: Arduino Mega 2560
- Wiring: ESP32
- Wiring: ESP8266
- Wiring: SAMD21G18A
// Specify your wiring when declaring the display
DEPG0150BNS810 display(dc, cs, busy);
// Optional: specify SDI and CLK (ESP32 & SAMD21* only)
DEPG0150BNS810 display(dc, cs, busy, sdi, clk)See here for limitations of SAMD21G18A wiring
The DRAW() operation allows for RAM saving tricks (paging). Required for older boards, configurable for new boards.
More info about DRAW() here.
/*
Use DRAW() if:
- you need to support Arduino Uno R3 / Mega 2560, or
- you desperately need to save RAM
*/
DRAW(display) {
display.print("Hello, ");
display.print("World!");
}
// Otherwise, you're free to use update() instead
display.clearMemory();
display.print("Hello, ");
display.print("World!");
display.update();Drawing operations come from the Adafruit GFX library You'll find a full list of supported commands in the API. Check out the examples folder to see them in action. Alternatively, the official adafruit-gfx tutorial is a good place to start.
The library comes with a selection of custom fonts. You can create more with truetype2gfx.
See the Fonts example.
As decided by the Adafruit library, the ancient "XBitmap" is the format of choice for pre-rendered graphics. Luckily, GIMP maintains good support for it. If you need a hint on how to use it, I have thrown together a tutorial on preparing XBitmap images.
It is possible to load and save .bmp images, using a cheap SD card SPI adapter. Read more
E-Ink displays generally take several seconds to refresh. Some displays have an alternative mode, where the image updates much faster.
The trade-off is that images drawn in fast mode are of a lower quality. The process may also be particularly difficult on the hardware. Use sparingly.
Not all displays support fast mode.
Call fastmodeOn() to enable.
Call fastmodeOff() to return to normal.
* Technically, this mode is not a true "partial refresh", as the whole display image is updated.
-
Double-check your wiring
On breadboard, or header pins, it is easy to be one row out.
Make sure to use a level-shifter, if needed. -
Double-check your constructor
// Make sure to use the correct class for your display model EInkDisplay_WirelessPaperV1_1 display; // SPI displays: make sure your pins are set correctly DEPG0150BNS810 display(dc, cs, busy);
-
Take a look at the examples, and the API
Some commands might not work the way you would expect. If unsure, double check. -
Disconnect and Reconnect
If the display has been used incorrectly, it can get "stuck".
Remove all power from the display and Arduino for 5 seconds. -
Make sure your build environment is configured correctly
Library can be installed to Arduino IDE with Sketch -> Include Library -> Add .Zip Library.., or through the built-in Library Manager.
Available through the built-in library registry, or alternatively, can be installed by extracting the Zip file to the lib folder of your project.
For Vision Master and Wireless Paper boards, your platformio.ini file needs to be correctly configured.
- Display information referenced from both official Heltec sources, and GxEPD2.
- Drawing functions provided by GFX Root, which itself is a stripped down version of Adafruit GFX.
- A bundled version of SdFat is used with some platforms.
- TJpg_Decoder is bundled with certain examples.

























