E-Ink / E-Paper
Interfacing Waveshare 29 EPD E-Ink / E-Paper with Raspberry Pi
What is the Waveshare 29 EPD?
Waveshare 29 EPD practical reference
The Waveshare 2.9" E-Paper Display is a 296×128 pixel, monochrome e-paper panel that retains its last image with zero power draw — only refreshing (which takes ~2-3 seconds and briefly flashes black/white) actually consumes current. This makes it ideal for battery-powered price tags, shelf labels, industrial instruments, and status indicators that update infrequently.
The panel uses microcapsule electrophoretic display technology: charged particles suspended in a clear fluid migrate when an electric field is applied, reflecting ambient light to create a paper-like image. No backlight is required, and the display remains clearly visible under natural or lamplight with a viewing angle of nearly 180°.
It communicates over SPI and is driven on Arduino-family boards through Jean-Marc Zingg's GxEPD2 library, which abstracts away the panel's refresh sequencing. Waveshare provides their own library for Raspberry Pi and other platforms, with full C/C++ and Python examples available.
Versions: The module exists in multiple hardware revisions (V1, V2, V2.1). Newer versions (V2.1+) include an onboard level translator, making them compatible with both 3.3V and 5V MCUs. The V2 version is the most common and is what this entry targets. Check for a "V2" label on the back of the screen to confirm.
Key specifications
- Resolution: 296 × 128 pixels, monochrome (black/white)
- Grayscale: 4 levels
- Operating voltage: 3.3V / 5V (V2.1+ with level translator; V1 is 3.3V only)
- Interface: SPI (3-wire or 4-wire)
- Full refresh time: ~2-3 seconds, visible black/white flash
- Refresh power: 26.4 mW (typical)
- Standby current: < 0.01 µA (image persists with no power)
- Viewing angle: >170°
- Display dimensions: 66.89 × 29.05 mm
- Outline dimensions (driver board): 89.5 × 38 mm
- Dot pitch: 0.227 × 0.226 mm
- Operating temperature: 0 ~ 50 °C
Pinout and connection notes
Critical usage notes:
- Refresh interval: It is recommended to wait at least 180 seconds between refreshes, and refresh at least once every 24 hours to prevent image retention damage.
- Power down: Always put the display into sleep mode or power it off after updating — leaving it powered on keeps the driver in a high-voltage state and will damage the panel.
- FPC cable: The flat flex cable is fragile — do not bend it vertically, do not bend it toward the front of the screen, and avoid repeated excessive bending.
- Physical handling: The glass substrate is delicate — avoid dropping, bumping, or pressing hard on the screen.
- Version compatibility: V1 boards are 3.3V only; V2.1+ boards include a level translator and support both 3.3V and 5V. Check the version label on the back before wiring.
- Border color: The border color can be adjusted via registers 0x3C or 0x50 (refer to the datasheet).
- Image data: If images appear distorted, verify the image width and height settings match the display resolution.
- VCC: Power — 3.3V or 5V depending on board version (V2.1+ supports both)
- GND: Ground
- DIN: SPI data in (MOSI)
- CLK: SPI clock (SCK)
- CS: SPI chip select (active low)
- DC: Data/command select — low for command, high for data
- RST: Reset, active low
- BUSY: Goes high during refresh — poll or interrupt before sending new data
Integration checklist
- Confirm the exact part number and breakout-board revision.
- Verify supply voltage, current demand, logic levels, and signal direction against the datasheet.
- Check controller pin assignments and bus address or interface mode against the example code.
- Power up with external loads disconnected, then test signals before full integration.
- If readings or communication fail, check power and ground first, then pin mapping, interface settings, and library initialization.
Troubleshooting and reproducibility
Record the board used, wiring, library/version, supply arrangement, and measured behavior. Use the selected board-specific wiring example as the source of truth. Never assume visually similar modules share identical voltage tolerance or pin order.
Setting Up Waveshare 29 EPD with Raspberry Pi
Library
Waveshare epd2in9 by Waveshare
sudo raspi-config # Interface Options -> SPI -> Enable, then reboot pip3 install waveshare-epd Pillow
Wiring
| Component pin | Raspberry Pi pin | Note |
|---|---|---|
| VCC | Pin 1 (3.3V) | |
| GND | Pin 6 (GND) | |
| DIN | GPIO10 (MOSI, Pin 19) | |
| CLK | GPIO11 (SCK, Pin 23) | |
| CS | GPIO8 (CE0, Pin 24) | |
| DC | GPIO25 (Pin 22) | |
| RST | GPIO17 (Pin 11) | |
| BUSY | GPIO24 (Pin 18) |
Swipe sideways to see every column →
- Enable SPI via
raspi-configfirst — it's off by default on Raspberry Pi OS. epd.sleep()drops the panel into low-power hold; callepd.init()again before the next update.- The Waveshare Python library provides examples for both V1 and V2 versions — use
epd2in9for V1 andepd2in9_V2for V2.
Related Components
Related Guides & Projects
Raspberry Pi Pico W and Pico 2 W: Install MicroPython with Thonny or UF2
Hold BOOTSEL, drag the correct UF2 file, open the REPL and blink the onboard LED. Includes the Pico vs Pico W vs Pico 2 W firmware differences and what to do when the drive does not appear.
Raspberry Pi Pico W Web Server in MicroPython: Control an LED and Read a Sensor
Connect the Pico W to WiFi, serve a responsive control page, switch an LED and display the onboard temperature or an external sensor, with timeouts and reconnect handling.
Raspberry Pi Pico Oscilloscope with MicroPython
Convert a Raspberry Pi Pico into a basic 500 kSPS oscilloscope using its 12-bit ADC and MicroPython. Displays waveforms on an SSD1306 OLED or streams samples over USB serial to a Python plotter on your PC.
Self-Hosted Nextcloud NAS on Raspberry Pi 4
Build a private, durable Nextcloud NAS on a Raspberry Pi 4 -- SSD boot instead of a failure-prone SD card, Docker Compose with Redis caching, Tailscale for remote access with zero ports forwarded, and an automated backup strategy that actually runs.