Pressing the manage button (GPIO1) overlays a small QR code -- "SCAN TO MANAGE" -- in the top-right corner of whatever photo is currently on screen, linking to the server's config page, then reverts to the plain photo after 30 seconds. The overlay is spliced into the existing streaming fetch as chunks pass through (frame_client.c's http_read_fn), rather than buffering the full 192,000-byte frame in RAM: only the small overlay rectangle itself (~30KB) is ever held in memory, generated via new stride-parameterized drawing helpers (epd_draw_*_ex in epd_draw.c) that let the existing QR/text drawing code target an arbitrarily-sized buffer instead of a full-frame one. epd7in3e.c is untouched -- it has no idea an overlay exists.
73 lines
3.3 KiB
Markdown
73 lines
3.3 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, three buttons, all 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).
|
|
- **Manage (GPIO1)**: a normal press overlays a "scan to manage" QR code
|
|
on the current photo for 30 seconds, linking to the server's config
|
|
page; see
|
|
[`firmware/README.md`](../firmware/README.md#scanning-to-manage-the-queue).
|
|
|
|
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.
|