Skip to content
E-Ink / E-Paper

Waveshare 2.9" E-Paper Display

Ultra-low-power e-paper display that holds its image without power.

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[reference:0].

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[reference:1]. No backlight is required, and the display remains clearly visible under natural or lamplight with a viewing angle of nearly 180°[reference:2].

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[reference:3][reference:4].

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[reference:5][reference:6]. 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.

Specifications

Resolution296 × 128 pixels, monochrome (black/white)
Grayscale4 levels
Operating voltage3.3V / 5V (V2.1+ with level translator; V1 is 3.3V only)
InterfaceSPI (3-wire or 4-wire)
Full refresh time~2-3 seconds, visible black/white flash
Refresh power26.4 mW (typical)
Standby current< 0.01 µA (image persists with no power)
Viewing angle>170°
Display dimensions66.89 × 29.05 mm
Outline dimensions (driver board)89.5 × 38 mm
Dot pitch0.227 × 0.226 mm
Operating temperature0 ~ 50 °C

Pinout

PinNameDescription
1VCCPower — 3.3V or 5V depending on board version (V2.1+ supports both)
2GNDGround
3DINSPI data in (MOSI)
4CLKSPI clock (SCK)
5CSSPI chip select (active low)
6DCData/command select — low for command, high for data
7RSTReset, active low
8BUSYGoes high during refresh — poll or interrupt before sending new data

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[reference:7].
  • 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[reference:8].
  • 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[reference:9].
  • Physical handling: The glass substrate is delicate — avoid dropping, bumping, or pressing hard on the screen[reference:10].
  • 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[reference:11].
  • Border color: The border color can be adjusted via registers 0x3C or 0x50 (refer to the datasheet)[reference:12].
  • Image data: If images appear distorted, verify the image width and height settings match the display resolution[reference:13].

Variants

Choose based on your color needs: monochrome (4 grayscale) for text and simple graphics, or the B/C variants for red or yellow accents. The NFC-powered version is ideal for truly wireless, battery-free deployments.

VariantTemp rangeHum rangeAccuracyProtocolPrice
Waveshare 2.9" EPD (monochrome)~$15-20
Waveshare 2.9" EPD (B)~$18-22
Waveshare 2.9" EPD (C)~$18-22
Waveshare 2.9" NFC-Powered EPD~$25-30

Board Integration

Library

GxEPD2by Jean-Marc Zingg

Arduino IDE → Library Manager → search "GxEPD2" → Install

Wiring

Component pinBoard pinNote
VCC5VV2.1+ supports 5V; V1 requires 3.3V
GNDGND
DIND11 (MOSI)
CLKD13 (SCK)
CSD10
DCD9
RSTD8
BUSYD7

Code

C++

Notes

  • firstPage()/nextPage() is a paged full-buffer render loop — always draw inside that do/while.
  • Call display.hibernate() after each update to hold the image at zero power.
  • For V1 boards (3.3V only), power VCC from the Uno's 3.3V pin, not 5V.