E-paper display, 2.9 inch

A 2.9 inch black and white e-paper module on the Solomon Systech SSD1680, 296 by 128 pixels, over SPI: the Waveshare 2.9 inch V2 and the WeAct 2.9 inch boards.

Aliases: e-ink, epaper, 2.9 inch e-paper.

Pins

Pin What it does
VCC, GND Supply, 2.2 to 3.7 V.
SDA SPI data in (DIN on the Waveshare board).
SCL SPI clock (CLK).
CS Chip select, active low.
DC Low for a command, high for its data.
RES Reset, active low (RST).
BUSY High while the controller works, above all during a refresh.

Reading it on an Arduino

With GxEPD2, which Mokxi ships as GxEPD2_BW.h with the GxEPD2_290_BS and GxEPD2_290_T94_V2 panels:

#include <GxEPD2_BW.h>
GxEPD2_BW<GxEPD2_290_BS, 50> display(GxEPD2_290_BS(10, 9, 8, 7));  // CS, DC, RST, BUSY

void setup() {
  display.init();
  display.setRotation(1);
  display.firstPage();
  do {
    display.fillScreen(GxEPD_WHITE);
    display.setCursor(10, 20);
    display.print("Hello");
  } while (display.nextPage());
  display.hibernate();
}

What the model gets right

It is the same SSD1680 model as the 2.13 inch panel, on 128 sources and 296 gates: the two RAMs, the RAM window and counters, data entry modes, reset and deep sleep, and a picture that changes only when a refresh finishes, with BUSY high while it runs: about 3 s for a full refresh and 0.3 s for a partial one, Waveshare's typical times. The picture stays with the power off.

What it does not model

The flashing of a full refresh, ghosting, the temperature's effect on the refresh time, and reading the RAM back.

Common mistakes

Not waiting for BUSY: commands sent during a refresh are lost.

Refreshing every second: a full refresh takes seconds, and the panel's life is counted in refreshes.

See it in action

Shelf label draws a price tag and marks it down. Open it at /templates.