SSD1683 eInk Display with GxEPD and ESP32 (and CrowPanel 4.2″ HMI): basics and configuration
ePaper (or eInk) displays are a fascinating technology that allows ultra-low power consumption and excellent readability in direct sunlight. In this article, we’ll explore how to use ePaper displays based on the SSD1683 controller, widely adopted in 4.2″ monochrome screens, and we’ll dive into the CrowPanel ESP32-S3 4.2” E-paper HMI Display, a powerful all-in-one solution.

Introduction to SSD1683 ePaper displays
The SSD1683 is a controller designed for ePaper panels. It supports a resolution up to 400×300 pixels and is ideal for 4.2″ monochrome displays. This kind of display is often used in low-power applications such as weather stations, smart tags, and shelf labels.
Display’s Basic parameters
- Product size: 4.2 inch
- Resolution: 400×300
- PPI: 119.05
- Color: Black and White
- Driver IC: SSD1683
- Interface: SPI
- Operating voltage: 3.3V
- Operating temperature: 0-50 ℃
Display’s Main features
- Display feature: Bistable display (retains the current content after a power outage)
- Display mode: Pure reflection
- Viewing angle: Wide viewing angle exceeding 170 degrees
- Surface Treatment: Hard-coated for anti-glare effects
- Energy conservation: No power consumption when not refreshing the screen
- Eye Protection: No blue light emission, zero radiation
Wiring the SSD1683 to an ESP32/ESP8266

To interface a generic SSD1683 eInk display with your ESP32 or ESP8266, you’ll need to wire the following:
SSD1683 Pin | Description | ESP32 Example |
---|---|---|
VCC | Power | 3.3V |
GND | Ground | GND |
SDA | MOSI | GPIO 23 |
SDL | SCK | GPIO 18 |
CS | Chip Select | GPIO 5 |
DC | Data/Command | GPIO 17 |
RST | Reset | GPIO 16 |
BUSY | Busy | GPIO 4 |
Note: always double check voltage requirements and pinout of your specific display module.
Here to buy e-ink display (my choice) CrowPanel ESP32 4.2” E-paper HMI Display - CrowPanel ESP32 4.2” E-paper HMI Display from ALiexpress - WeAct 4.2" Epaper Module SSD1683
Installing and using GxEPD library
We’ll use the popular GxEPD library, which supports many ePaper controllers, including SSD1683.
Install GxEPD:
- Open Arduino IDE
- Go to Library Manager (
Sketch > Include Library > Manage Libraries…
) - Search and install GxEPD
Basic example for SSD1683:
/*
Generic 4.2" SSD1683 ePaper Display Demo
Author: Renzo Mischianti
Website: https://mischianti.org
Description:
This sketch demonstrates how to initialize and display
text on a generic 4.2" ePaper display with SSD1683 controller
using the GxEPD2 library and an ESP32.
*/
#include <GxEPD2_BW.h>
#include <Arduino.h>
// ==============================
// Pin definitions (adjust as needed)
// ==============================
#define EPD_CS 5 // Chip Select
#define EPD_DC 17 // Data/Command
#define EPD_RST 16 // Reset
#define EPD_BUSY 4 // Busy
// =================================
// E-paper power & control pin defs
// =================================
//#define EPD_PWR 7 // Power‐enable pin: HIGH = display powered on, LOW = off
//#define EPD_BUSY 48 // BUSY pin from panel: HIGH = busy drawing, LOW = ready
//#define EPD_RST 47 // RST (Reset) pin: pulse LOW to reset the panel
//#define EPD_DC 46 // D/C (Data/Command) pin: LOW = command, HIGH = data
//#define EPD_CS 45 // CS (Chip Select) pin for SPI transactions
// ==============================
// Instantiate the e-paper object
// ==============================
// Using SSD1683 4.2" display, 400x300px resolution
GxEPD2_BW<GxEPD2_420_GYE042A87, GxEPD2_420_GYE042A87::HEIGHT> display(GxEPD2_420_GYE042A87(EPD_CS, EPD_DC, EPD_RST, EPD_BUSY));
// ==============================
// Power control function (optional) Only for CrowPanel
// ==============================
#ifdef EPD_PWR
void epdPower(int state) {
pinMode(EPD_PWR, OUTPUT);
digitalWrite(EPD_PWR, state);
}
}
#endif
// ==============================
// Display initialization
// ==============================
void epdInit() {
display.init(115200, true, 50, false); // SPI speed, reset, pulse ms, skip init
display.setRotation(0); // 0 = portrait; adjust if needed
display.setTextColor(GxEPD_BLACK); // Draw in black
display.setTextSize(2); // Font scaling
display.setFullWindow(); // Full buffer mode
}
void setup() {
// Enable power rail if used
#ifdef EPD_PWR
epdPower(HIGH);
#endif
epdInit();
display.fillScreen(GxEPD_WHITE); // Clear display
display.drawRect(0, 0, 400, 300, GxEPD_BLACK); // Draw border
display.setCursor(40, 130); // Set cursor
display.print("Hello from mischianti.org!"); // Print message
display.display(); // Refresh screen
display.hibernate(); // Sleep mode
#ifdef EPD_PWR
epdPower(LOW); // Cut power (optional)
#endif
}
void loop() {
// Nothing here — everything runs once in setup()
}
Here the result

Understanding refresh behavior
eInk screens don’t work like TFTs. You must call display.display()
to actually update the screen. Additionally, partial updates are tricky and slower than TFT redraws, but they consume far less power and do not require a backlight.
Advanced: partial refresh
GxEPD allows partial update on some displays. To avoid ghosting and flashing, call display.refresh(true);
for full clean update occasionally.
Spotlight: CrowPanel ESP32-S3 4.2” E-paper HMI Display
The CrowPanel ESP32-S3 4.2″ is a powerful integrated solution combining:
- 4.2″ eInk 400×300 SSD1683 display
- ESP32-S3 MCU (with USB and PSRAM)
- USB-C for programming and power
- Touch buttons (capacitive)
- IO breakout (headers and JST)
- MicroSD slot
- RTC, buzzer, and more
Pinout reference:
Refer to my full article: CrowPanel ESP32-S3 4.2” HMI – Pinout and Specs

You can use the same GxEPD library with the following default pins:
Function | Pin |
---|---|
CS | 45 |
DC | 46 |
RST | 47 |
BUSY | 48 |
PWR | 7 |
// =================================
// E-paper power & control pin defs
// =================================
#define PWR 7 // Power‐enable pin: HIGH = display powered on, LOW = off
#define BUSY 48 // BUSY pin from panel: HIGH = busy drawing, LOW = ready
#define RST 47 // RST (Reset) pin: pulse LOW to reset the panel
#define DC 46 // D/C (Data/Command) pin: LOW = command, HIGH = data
#define CS 45 // CS (Chip Select) pin for SPI transactions
// ==============================
// Instantiate the e-paper object
// ==============================
// Using SSD1683 4.2" display, 400x300px resolution
GxEPD2_BW<GxEPD2_420_GYE042A87, GxEPD2_420_GYE042A87::HEIGHT> display(GxEPD2_420_GYE042A87(EPD_CS, EPD_DC, EPD_RST, EPD_BUSY));
Tip: The CrowPanel is ideal for building sophisticated low-power GUIs with custom touch menus or IoT dashboards.
Power considerations
The CrowPanel can be powered via USB-C or battery. Thanks to the ePaper display, you can keep it in deep sleep most of the time and wake it periodically to refresh the content — ideal for battery-powered weather stations, clocks, and status panels.

Thanks
With the fundamentals of wiring, SPI configuration, and screen updates now in place, you’re ready to take your eInk projects further. In upcoming articles, we’ll dive into advanced graphics: you’ll learn how to load and render custom fonts, draw vector shapes, and display images on your SSD1683 panel. Finally, in our last installment, we’ll combine everything you’ve learned to build a simple weather station—complete with live temperature, humidity, and forecast data—right on your 4.2″ CrowPanel HMI. Stay tuned!
- ESP32: pinout, specs and Arduino IDE configuration
- ESP32: integrated SPIFFS Filesystem
- ESP32: manage multiple Serial and logging
- ESP32 practical power saving
- ESP32 practical power saving: manage WiFi and CPU
- ESP32 practical power saving: modem and light sleep
- ESP32 practical power saving: deep sleep and hibernation
- ESP32 practical power saving: preserve data, timer and touch wake up
- ESP32 practical power saving: external and ULP wake up
- ESP32 practical power saving: UART and GPIO wake up
- ESP32: integrated LittleFS FileSystem
- ESP32: integrated FFat (Fat/exFAT) FileSystem
- ESP32-wroom-32
- ESP32-CAM
- ESP32: use ethernet w5500 with plain (HTTP) and SSL (HTTPS)
- ESP32: use ethernet enc28j60 with plain (HTTP) and SSL (HTTPS)
- How to use SD card with esp32
- esp32 and esp8266: FAT filesystem on external SPI flash memory
- Firmware and OTA update management
- Firmware management
- OTA update with Arduino IDE
- OTA update with Web Browser
- Self OTA uptate from HTTP server
- Non-standard Firmware update
- Integrating LAN8720 with ESP32 for Ethernet Connectivity with plain (HTTP) and SSL (HTTPS)
- Connecting the EByte E70 to ESP32 c3/s3 devices and a simple sketch example
- ESP32-C3: pinout, specs and Arduino IDE configuration
- Integrating W5500 with ESP32 Using Core 3: Native Ethernet Protocol Support with SSL and Other Features
- Integrating LAN8720 with ESP32 Using Core 3: Native Ethernet Protocol Support with SSL and Other Features
- Dallas ds18b20:
- Guide to I2C on ESP32: Communication with Heterogeneous 5V and 3.3V Devices, Additional Interface Management and Scanner
- Display
- Complete Guide: Using an ILI9341 Display with the TFT_eSPI Library
- Integrating Touch Screen Functionality with Your ILI9341 TFT Display
- SSD1683 eInk Display with GxEPD and ESP32 (and CrowPanel 4.2″ HMI): basics and configuration
- Complete Guide: Using an ILI9341 Display with the TFT_eSPI Library
- Integrating Touch Screen Functionality with Your ILI9341 TFT Display
- SSD1683 eInk Display with GxEPD and ESP32 (and CrowPanel 4.2″ HMI): basics and configuration