Build and push server image / build-and-push (push) Successful in 32s
- LICENSE: MIT, with attribution notes for the vendored qrcode/epaper_fonts/ dns_server code and the epd7in3e driver's transcription of Waveshare's register sequence. - Top-level README.md: project overview, hardware list, quick-start pointing at firmware/ and server/, repo layout, license, Claude Code attribution. - firmware/README.md: full rewrite (was still the stock ESP-IDF captive portal example's README) -- build/flash instructions, Kconfig reference table, first-boot walkthrough, and how to reset to provisioning mode via NVS erase (the only way in right now; a proper reconfigure trigger is a future addition). - docs/hardware.md: wiring table + parts list + strapping-pin/SPI-speed notes. - docs/architecture.md: sequence diagram and walkthrough of the full provision -> connect -> fetch -> display -> sleep cycle, plus the reasoning behind doing image processing server-side and reusing Immich's face detection instead of bundling a detector. - server/README.md: fixed stale endpoint docs (missing GET /frame/config, POST /api/config still describing removed immich_url/api_key fields).
2.4 KiB
2.4 KiB
Hardware
Parts
- An ESP32-C6 dev board (e.g. ESP32-C6-DevKitC-1). Needs 8MB flash --
see
firmware/sdkconfig.defaultsandfirmware/partitions.csvif yours differs. - Waveshare 7.3" E Ink Spectra 6 (E6) panel -- 800x480, 6-color, SPI.
- A USB cable for flashing/power.
Wiring
The panel connects over SPI plus three control lines (data/command, reset,
busy). Defaults below match the reference build and are set in
firmware/components/epd7in3e/Kconfig --
override via idf.py menuconfig under E-Paper Display (epd7in3e)
Configuration if your wiring differs.
| Panel pin | ESP32-C6 GPIO | Kconfig option |
|---|---|---|
| CLK | 20 | EPD_PIN_CLK |
| DIN | 19 | EPD_PIN_MOSI |
| CS | 18 | EPD_PIN_CS |
| DC | 9 | EPD_PIN_DC |
| RST | 10 | EPD_PIN_RST |
| BUSY | 11 | EPD_PIN_BUSY |
| VCC | 3.3V | -- |
| GND | GND | -- |
A couple of things worth knowing if you pick different pins:
- Avoid the ESP32-C6's strapping pins (GPIO 4, 5, 8, 9, 15) and the USB-JTAG pins (12, 13) where possible -- strapping pins are sampled at reset to select boot mode. The reference wiring above already uses GPIO9 for DC, which is a strapping pin; it's only sampled during power-on/reset, so it's safe once the app is running, but if flashing/boot ever misbehaves on your board, check whether the panel is pulling that line low during reset.
- The panel's SPI interface is rated well above the firmware's default
4MHz clock (
EPD_SPI_CLOCK_HZ), but breadboard/dupont-wire connections are often unreliable much past a few MHz. Raise it once your physical wiring is confirmed solid.
Power
The device spends nearly all its time in deep sleep, waking briefly once an hour (configurable, see the server's web UI) to fetch and display a photo. A full-color refresh on this panel takes 15-30+ seconds and draws more current than deep sleep by a wide margin -- expect battery life (if not running from USB power) to be dominated by refresh frequency, not sleep current.