1
0
Fork 0
mirror of https://github.com/imjasonh/esp32 synced 2026-07-06 23:52:24 +00:00
esp32/eink-plan.md
Jason Hall 9d28a3b437 initial commit
Signed-off-by: Jason Hall <imjasonh@gmail.com>
2026-05-02 11:43:41 -04:00

4 KiB
Raw Blame History

E-ink display — plan

The Inland ESP-WROOM-32 dev board doesn't have a software-controllable LED (see notes.txt), so the visible-output story for this project is an e-ink display. This file captures the hardware choice, the Rust graphics stack we'll use, and a shortlist of projects to build on top.

Hardware

  • Display: Inland 2.13" e-ink (Micro Center SKU 632694).
    • 250×122 mono, SPI, ~Waveshare 2.13" rebrand
    • 8-pin male header: VCC, GND, DIN, CLK, CS, DC, RST, BUSY
    • Pre-soldered headers — no soldering required
  • Refresh characteristics (SSD1680 driver, typical for this panel):
    • Full refresh ~2s, with the black/white flash that clears ghosting
    • Partial refresh ~300ms, no flash, but ghosting accumulates
    • Run a full every 510 partials
    • No grayscale, no animation. "Update once, look at it for a while."
  • Supporting hardware: half-size solderless breadboard, Dupont jumper assortment (F-F at minimum). Both boards are 3V3, no level shifter needed.

Wiring sketch (pins on the ESP32 are conventional for SPI2/HSPI, adjust as needed once the panel arrives):

e-ink   ESP32
-----   -----
VCC  -> 3V3
GND  -> GND
DIN  -> GPIO23 (MOSI)
CLK  -> GPIO18 (SCK)
CS   -> GPIO5
DC   -> GPIO17
RST  -> GPIO16
BUSY -> GPIO4

Rust graphics stack

All no_std-friendly, all sit on top of the existing esp-idf-svc setup — just add deps to Cargo.toml and draw onto the display via the embedded-graphics DrawTarget that epd-waveshare implements.

  • embedded-graphics — primitives, base DrawTarget trait
  • epd-waveshare — Waveshare e-ink driver, includes the 2.13" panel
  • u8g2-fonts — large font collection, far better than the embedded-graphics built-ins
  • embedded-text — text wrapping / multi-line layout in a bounding box
  • embedded-layout — vertical/horizontal stacking, alignment helpers (no Flexbox, but covers most positioning we'll need)
  • tinybmp — render include_bytes!'d 1-bit BMPs as embedded-graphics images; the easy path for icons
  • embedded-iconoir — optional, ready-made Iconoir icons

Default starting set: embedded-graphics + u8g2-fonts + embedded-text + tinybmp. Pull in embedded-layout once positioning gets tedious.

Heavier option: Slint

Slint has an MCU backend with explicit e-ink support. Write .slint markup, get live layout preview. Workable on the ESP32-WROOM-32 but noticeable flash/RAM footprint. Reach for it only if iterating on layout becomes a bottleneck with the embedded-graphics stack.

Project shortlist

Ordered by cool : effort ratio.

  1. Wi-Fi info screen — weather, next calendar event, GitHub PR count, refreshed every 510 minutes. Best first project: smallest end-to-end exercise of Wi-Fi + HTTP + JSON + e-ink rendering. Once it works, the rest are variations on the same skeleton.
  2. Build status badge — last commit's CI state for one or more repos. Sits on the desk, nags when CI breaks.
  3. Pomodoro timer — two physical buttons, big "WORK 17:32" / "BREAK 04:00" text. E-ink wins because no backlight to distract.
  4. Now-playing card — Spotify Web API. Refresh slowness fits since tracks last minutes.
  5. Door / desk status sign — "available / heads-down / on a call", toggled from phone via tiny HTTP server on the ESP32. Battery + e-ink = days of runtime.
  6. Home Assistant / MQTT subscriber — display whatever the home automation system publishes.
  7. Conference badge / desk name tag — name + handle + QR code, updateable over Wi-Fi.
  8. Status dashboard for a personal service — uptime, last-deploy time, error count from one of Jason's own services.

Crate stack already in place

The current Cargo.toml has esp-idf-svc 0.51 with binstart + native features, plus log and anyhow. That covers Wi-Fi, HTTP client, NTP, NVS storage. For the e-ink work we just add the embedded-graphics family of crates listed above and an SPI driver from esp-idf-hal.