1.54-inch E-Paper: ESP32 Setup & Troubleshooting
Identify your panel, connect a compatible SPI driver board, run a first-image example and troubleshoot refresh and sleep behavior.
On this page
1. Identify your display before connecting it2. Hardware and software needed3. Example wiring for a classic ESP324. Install the driver and run a first image5. Full refresh, partial refresh and ghosting6. Sleep and battery-powered operation7. Troubleshooting8. Compatibility and reference notesThis ESP32S guide explains how to identify a 1.54-inch SPI e-paper module, wire a compatible driver board, display a first image and troubleshoot refresh problems. It is an original integration tutorial, not a reproduction of another supplier’s manual.
1. Identify your display before connecting it
“1.54-inch” is a size, not a driver specification. There are 200×200 and 152×152 panels, monochrome and color versions, and different controller revisions. Record the panel code on the flexible cable, controller/driver-board revision, resolution and color type.
The code below is specifically for a GDEH0154D67-compatible 200×200 black-and-white panel using SSD1681, as identified by the GxEPD2 driver. It is not a universal example for every 200×200 panel, every V2 board or the 152×152 display listed in our store. Use the matching driver class for your actual panel.
2. Hardware and software needed
- A classic ESP32-WROOM-32 development board with the GPIOs listed below exposed.
- The identified panel with a compatible SPI driver/breakout board and a known pinout. A raw flexible cable cannot be wired directly as though it were a complete SPI module.
- USB data cable, short jumper wires and a suitable power supply.
- Arduino IDE, the Espressif ESP32 board package, GxEPD2 by Jean-Marc Zingg, and its Adafruit GFX dependency.
Record the installed board-package and library versions with your project. The example is based on documented library APIs and has not been bench-tested on your particular hardware.
3. Example wiring for a classic ESP32
Disconnect power while wiring. This example assumes a driver module that explicitly accepts a 3.3 V supply and 3.3 V signals. Verify its documentation first. Do not apply 5 V to a bare panel or ESP32 GPIO.
| Module signal | Classic ESP32 GPIO | Purpose |
|---|---|---|
| VCC | 3V3, only if permitted by the module | Module supply |
| GND | GND | Common ground |
| DIN / MOSI | 23 | SPI data to display |
| CLK / SCK | 18 | SPI clock |
| CS | 27 | Chip select |
| DC | 26 | Data/command selection |
| RST / RES | 25 | Display reset |
| BUSY | 33 | Refresh-completion signal |
The example does not use MISO. Do not reuse these GPIO numbers blindly on ESP32-C3, S3 or an integrated e-paper board: inspect its schematic and update every assignment. If the module has a separate power-enable signal, implement the required sequence from its documentation before initialization.
4. Install the driver and run a first image
- Install GxEPD2 through Arduino Library Manager, including its required graphics dependency.
- Select your exact ESP32 board and serial port.
- Confirm the panel identification and choose the matching GxEPD2 driver class.
- For the specific D67/SSD1681 configuration above, compile and upload the example below.
- Open Serial Monitor at 115200 baud. Expect a full refresh and the message on the display; visible flashing during this operation is not by itself a fault.
#include <SPI.h>
#include <GxEPD2_BW.h>
// Only for the identified GDEH0154D67 / SSD1681 monochrome panel.
constexpr int EPD_CS = 27;
constexpr int EPD_DC = 26;
constexpr int EPD_RST = 25;
constexpr int EPD_BUSY = 33;
GxEPD2_BW<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> display(
GxEPD2_154_D67(EPD_CS, EPD_DC, EPD_RST, EPD_BUSY));
void setup() {
Serial.begin(115200);
SPI.begin(18, -1, 23, EPD_CS);
display.epd2.selectSPI(SPI, SPISettings(4000000, MSBFIRST, SPI_MODE0));
display.init(115200);
display.setRotation(0);
display.setFullWindow();
display.firstPage();
do {
display.fillScreen(GxEPD_WHITE);
display.setTextColor(GxEPD_BLACK);
display.setTextSize(2);
display.setCursor(12, 70);
display.print("Hello ESP32S");
} while (display.nextPage());
display.hibernate();
}
void loop() {
// Keep the first test static. Add scheduled updates only after validation.
}
Expected result: a white background with black text, remaining visible after the display is put into its documented idle state. The ESP32 itself remains awake in this example; hibernate() is a display-library operation, not ESP32 deep sleep. If your driver board requires special reset timing, use its supported initialization parameters rather than guessing a pulse width.
5. Full refresh, partial refresh and ghosting
Start with full refresh. Only add partial updates after confirming that the actual panel and driver support them. A partial-update driver may require initialization of the previous-image state, and that state may not survive display power loss.
Residual images are commonly called ghosting. Follow the panel’s instructions for periodic full refresh, allowed update intervals and operating temperature. There is no universal “every five updates” rule for all e-paper. Do not force a waveform from a different panel or run a tight refresh loop.
For an application with a changing value, maintain the required previous frame, use the supported partial-window API and schedule full refresh according to the actual driver documentation. Test repeated updates and a complete power cycle before relying on this mode.
6. Sleep and battery-powered operation
A typical product cycle is: wake the ESP32, obtain data, compose the image, finish the refresh, put the display into its documented sleep state, then sleep the ESP32. Wait for refresh completion before removing display power.
Display image retention does not mean the whole board draws no current. Measure regulators, LEDs, sensors and radio activity as well. After waking, reinitialize the display as required; do not assume that a controller’s RAM or partial-refresh baseline survives hibernation or power removal.
7. Troubleshooting
| Symptom | Checks |
|---|---|
| Screen remains blank | Verify supply, common ground, cable orientation, power enable and exact panel driver. An old retained image does not prove that the module is powered. |
| BUSY timeout | Check the BUSY connection, reset behavior, supply stability and driver polarity. Keep completion handling enabled rather than bypassing the timeout. |
| Distorted or offset image | Check resolution, driver class, rotation and bitmap encoding; size alone is not sufficient identification. |
| Ghosting grows over time | Return to the supported full-refresh path, verify temperature and update interval, and review previous-frame handling. |
| ESP32 resets during an update | Inspect supply droop, wiring and serial logs. Reduce the setup to the standalone display example before adding Wi-Fi. |
8. Compatibility and reference notes
Reviewed October 15, 2026. The upstream GxEPD2 D67 driver definition identifies the example’s panel, controller and resolution. Consult the GxEPD2 project for the driver list, documentation and library license. This guide’s wiring, explanation and demonstration sketch are provided as an original integration example; they do not certify an untested module as compatible.
For other panels, browse our E-Paper Screen collection. Read the e-paper selection guide for display, memory and power planning, or the firmware flashing guide for programming basics.
Share the product link, hardware revision, software version and any error messages.
Contact ESP32S support →