mirror of
https://github.com/imjasonh/esp32
synced 2026-07-06 23:52:24 +00:00
95 lines
4 KiB
Markdown
95 lines
4 KiB
Markdown
|
|
# 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 5–10 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 5–10 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`.
|