E-paper 2.9-inch with an Arduino Uno

A 2.9-inch, 296x128 black-and-white E-Ink module that holds its image with zero power and updates over SPI.

E-paper 2.9-inch, A 2.9-inch, 296x128 black-and-white E-Ink module that holds its image with zero power and updates over SPI.
In short

The 2.9-inch e-paper's full frame is 4,736 bytes (296 × 128 / 8), more than double the Arduino Uno's 2 KB of SRAM, so on the Uno it is drawn in bands with GxEPD2's paged loop. It sits on the Uno's hardware SPI pins, DIN on D11 and CLK on D13, with CS on D10 and DC, RST and BUSY on D9, D8 and D7.

Wiring the E-paper 2.9-inch to the Arduino Uno

Pin by pin.

E-paper 2.9-inchArduino Uno
VCC5V
GNDGND
DIND11
CLKD13
CSD10
DCD9
RSTD8
BUSYD7
  • Waveshare driver boards from V2.1 on carry level conversion and take 5 V on VCC with 5 V signals, as wired here. Older boards are 3.3 V only: on those, power VCC from 3V3 and put a level shifter on DIN, CLK, CS, DC and RST.

What to know on the Arduino Uno

  • The sketch caps GxEPD2's page buffer at 800 bytes on AVR, which is 50 rows of 16 bytes, so the 296-pixel-long frame is sent in six passes of firstPage()/nextPage(). Half a frame (148 rows, 2,368 bytes) would still exceed the Uno's 2,048 bytes of SRAM.Arduino UNO R3 tech specs; Waveshare 2.9inch e-Paper V2 specification rev 2.1, p. 4
  • Every page is redrawn from scratch inside the do/while loop, so the drawing code runs six times per refresh on the Uno. Keep it deterministic: anything computed between passes, such as a sensor read, must be done once before firstPage().GxEPD2 library, paged drawing
  • The Uno's SPI pins drive 5 V while the panel itself runs from 2.2 V to 3.7 V. Waveshare driver boards from revision V2.1 carry level conversion, and Waveshare wires their VCC to the Uno's 5V so supply and signals share one level; on an older board, keep VCC on 3.3V and put a level shifter on DIN, CLK, CS, DC and RST.Waveshare 2.9inch e-Paper V2 specification rev 2.1, p. 12; Waveshare 2.9inch e-Paper Module manual, Working With Arduino
  • The panel draws 1.5 mA at most while updating, so an older board on 3.3 V is well within the 50 mA the Uno's 3.3V pin can supply.Waveshare 2.9inch e-Paper V2 specification rev 2.1, pp. 12 to 13; Arduino UNO R3 tech specs

E-paper 2.9-inch code for the Arduino Uno

Compiled for arduino:avr:uno on 2026-10-30.

Libraries: zinggjm/GxEPD2
// E-paper 2.9-inch on Arduino Uno: wiring and a free simulation at https://www.tinkered.ai/components/epaper-2in9/arduino-uno
#include <GxEPD2_BW.h>

// Waveshare 2.9" B/W V2 (SSD1680, 128x296 native; setRotation(1) = landscape).
//
// The page buffer is WIDTH/8 * rows bytes, so the row count must be capped on
// 2368, against the Uno's 2048 total. 800 bytes = 50 rows = six pages.
#if defined(__AVR)
  #define MAX_DISPLAY_BUFFER_SIZE 800
#else
  #define MAX_DISPLAY_BUFFER_SIZE 32768
#endif
#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) \
                         ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8))

GxEPD2_BW<GxEPD2_290_T94_V2, MAX_HEIGHT(GxEPD2_290_T94_V2)> display(
    GxEPD2_290_T94_V2(/*CS=*/10, /*DC=*/9, /*RST=*/8, /*BUSY=*/7));

void setup() {
  display.init();
  display.setRotation(1);              // landscape 296x128
  display.setTextColor(GxEPD_BLACK);
  display.setCursor(10, 40);
  display.firstPage();
  do {
    display.fillScreen(GxEPD_WHITE);
    display.setCursor(10, 40);
    display.print("Hello e-Paper!");
  } while (display.nextPage());
}

void loop() {}

E-paper 2.9-inch on the Arduino Uno: questions

Can an Arduino Uno drive a 2.9-inch e-paper display?

Yes, with a paged library such as GxEPD2. A full 296 × 128 frame needs 4,736 bytes and the Uno has 2,048 bytes of SRAM, so the image is sent in bands; the example uses an 800-byte buffer and six pages.

Why does my e-paper sketch fail to link or crash on the Uno?

Almost always the page buffer is too big. Size it with the MAX_HEIGHT macro and a buffer of about 800 bytes on AVR, as the example does; HEIGHT / 2 is still 2,368 bytes.

Does the e-paper need a level shifter on the Arduino Uno?

Only on older driver boards. The panel runs from 2.2 V to 3.7 V (Waveshare specification, p. 12); boards from revision V2.1 convert levels themselves with VCC on the Uno's 5V, while earlier ones need a level shifter on the five signal lines from the Uno.

For AI assistants

This guide as plain Markdown. /components/epaper-2in9/arduino-uno.md

What will you build with it?