Files
espresso_frame/docs/hardware.md
T
tfaour d395cf3bb9
Build and push server image / build-and-push (push) Successful in 35s
Add two physical buttons: factory-reset and next-photo
Factory-reset (GPIO3, hold 10s): clears stored WiFi/server config and
restarts into provisioning -- the deliberate, USB-free replacement for
the earlier reverted RST-based auto-reprovisioning idea.

Next-photo (GPIO2, tap): wakes the device and forces the server to
advance immediately via a new POST /frame/advance, instead of waiting
for the refresh interval. Both buttons arm themselves as deep-sleep GPIO
wakeup sources so a press is noticed promptly even while asleep.

Also makes GET /frame/image side-effect-free: it now only advances once
refresh_interval_s has elapsed since the current photo was set (tracked
server-side), so a device reboot for any reason just redisplays the
current photo instead of silently skipping ahead. The server maintains a
small reorderable upcoming-photos queue, viewable and rearrangeable from
the web UI.
2026-07-18 23:28:36 -04:00

69 lines
3.1 KiB
Markdown

# Hardware
## Parts
- An ESP32-C6 dev board (e.g. ESP32-C6-DevKitC-1). Needs 8MB flash --
see [`firmware/sdkconfig.defaults`](../firmware/sdkconfig.defaults) and
[`firmware/partitions.csv`](../firmware/partitions.csv) if yours differs.
- [Waveshare 7.3" E Ink Spectra 6 (E6) panel](https://www.waveshare.com/7.3inch-e-paper-hat-e.htm) --
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`](../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 | -- |
Optionally, two buttons, both wired the same way -- momentary push button
between the GPIO and GND, no external resistor needed (the firmware
enables each pin's internal pull-up, so it idles high and reads low when
pressed):
- **Factory-reset (GPIO3)**: held for 10 seconds, clears the stored
WiFi/server config; see
[`firmware/README.md`](../firmware/README.md#resetting-to-provisioning-mode).
- **Next photo (GPIO2)**: a normal press skips immediately to the next
photo; see
[`firmware/README.md`](../firmware/README.md#skipping-to-the-next-photo).
Both pins were picked because they're within GPIO 0-7 -- the only pins
the ESP32-C6 can wake from deep sleep on -- aren't strapping pins, and
aren't already used by the panel wiring above.
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.