1
0
Fork 0
mirror of https://github.com/imjasonh/esp32 synced 2026-07-06 23:52:24 +00:00
esp32/eink-plan.md

95 lines
4 KiB
Markdown
Raw Normal View 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](https://slint.dev/) 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`.