
Board esp32 v2
sudomesh/disaster-radio
A (paused) work-in-progress long-range, low-bandwidth wireless disaster recovery mesh network powered by the sun.

A pocket e-paper e-reader with physical page-turn buttons, weeks of battery life, and books loaded over Wi-Fi.
InkDeck is an open-source printed circuit board by Yourm5m5, from the Yourm5m5/InkDeck repository on GitHub. It is a 2-layer board of 25 × 67 mm with 17 parts on 11 nets.
It is built around the AO3400. Its parts include 4 switches, 3 resistors, 3 connectors, 1 diode and 1 transistor. It belongs with the lEDs and displays boards of this library.
A pocket e-paper e-reader with physical page-turn buttons, weeks of battery life, and books loaded over Wi-Fi.
InkDeck is a DIY e-reader about the size of a paperback (153 × 72 × 23.5 mm). It has a 4.7" e-paper screen that looks like printed paper, so it's easy on the eyes and readable in sunlight, and it keeps the page on screen even with the power off.
It's built around a LilyGo T5 4.7" E-Paper S3 board (ESP32-S3 + 960 × 540 e-paper + microSD slot), plus a custom grip PCB I designed in KiCad. The grip board sits beside the screen under your right thumb and has:
It reads EPUB and .txt books from the microSD card, and you can add books from your phone over Wi-Fi without taking the card out. Everything fits in a 3D-printed case I modelled in Fusion 360.
I like reading on e-paper, but most e-readers only work properly with one company's book store, and the cheaper ones only have a touchscreen. I wanted real buttons I can press with one thumb while holding it in one hand, like turning a page.
Building it myself means it reads my own DRM-free books (Project Gutenberg, Standard Ebooks) with no account or store. I can also change anything I want, from how long the buttons are held to how the pages look.
It was also a good way to learn about low-power design, which a phone or laptop never makes you think about:
flowchart LR
subgraph Grip["Grip PCB"]
BTN["PREV / NEXT / MENU buttons"]
MOT["Vibration motor via AO3400"]
SW["Power switch"]
end
subgraph LilyGo["LilyGo T5 4.7-inch S3"]
ESP["ESP32-S3 firmware"]
EPD["E-paper 960 x 540"]
SD["microSD card"]
ADC["Battery ADC IO14"]
end
BAT["LiPo battery"]
PHONE["Phone or laptop"]
BTN -->|GPIO 10 39 48| ESP
ESP -->|GPIO 45| MOT
BAT --> SW --> LilyGo
BAT -.-> ADC --> ESP
SD <-->|SPI| ESP
ESP -->|parallel bus| EPD
PHONE <-->|Wi-Fi hotspot| ESPThe e-paper, SD card and touch use almost every GPIO on the LilyGo. Only 4 are free, so the grip PCB uses exactly 4 signals through a 6-pin JST-SH cable:
| J3 pin | Signal | LilyGo | Why this pin |
|---|---|---|---|
| 1 | +3.3V | 3V3 | |
| 2 | GND | GND | |
| 3 | BTN_MENU | IO10 | The only free RTC pin, so MENU can wake the chip from deep sleep |
| 4 | BTN_PREV | IO39 | Internal pull-up |
| 5 | MOTOR | IO45 | Strapping pin, so the PCB has a 10k pull-down to keep it LOW at boot |
| 6 | BTN_NEXT | IO48 | Internal pull-up |
| Button | While reading | In the library |
|---|---|---|
| NEXT / PREV | Next / previous page | Move down / up |
| Hold NEXT / PREV (0.7 s) | Next / previous chapter | Move 5 rows |
| MENU | Open the library | Open the book / vibration on or off |
| Hold MENU 1 s | Wi-Fi upload mode | Wi-Fi upload mode |
| Hold MENU 3 s | Sleep | Sleep |
| MENU while asleep | Wake up on the same page |
While MENU is held, the motor buzzes at 1 s and again at 3 s, so you can feel which action you'll get before letting go.
Written in PlatformIO (Arduino framework) with LilyGo's e-paper library. The full explanation with diagrams and code snippets is in firmware/FIRMWARE.md.
| File | What it does |
|---|---|
config.h | Every pin and setting in one place |
buttons.h | Debounced buttons: tap, hold and long press |
haptic.h | Vibration patterns |
epub.cpp | Turns an EPUB into plain text |
main.cpp | Screens, page layout, Wi-Fi upload, sleep and the main loop |
EPUB reader: an EPUB is a ZIP file full of web pages. The first time a book is opened, the firmware:
content.opf (title + chapter order)After that the book opens instantly. Every chapter starts on a new page.
Pages: a greedy word-wrap fills each line with words until the next one doesn't fit. Where every page starts is saved on the SD card, so the footer can show Ch 3/27 57 / 312 70% and going back a page is instant.
Deep sleep: the e-paper keeps the page visible with no power, so the reader looks the same asleep. MENU wakes it:
while (digitalRead(PIN_BTN_MENU) == LOW) delay(10); // never sleep while MENU is held
esp_sleep_enable_ext0_wakeup(GPIO_NUM_10, 0); // MENU wakes it up
esp_deep_sleep_start();Haptics:
| Buzz | Meaning |
|---|---|
| 1 short | Page turn |
| 2 short | Chapter jump |
| 3 quick | Can't go further |
| 1 long | Going to sleep |
Testing: the parts haven't arrived yet, so the EPUB converter and a simulation of the whole firmware (fake buttons, screen and SD card) are tested on a computer, in firmware/pc_tests.
Designed in KiCad: a 25 × 67 mm two-layer grip board that sits beside the LilyGo inside the case. Power is on the front layer, button signals on the back, with ground fill on both sides. It passes DRC with 0 errors, 0 unconnected.
Modelled in Fusion 360 with user parameters, so it can be updated once the real parts are measured. It's 3 printed parts:
The grip is on the right so your thumb reaches the buttons, and USB-C is on the left so the cable doesn't get in the way.
Shows how the screen, grip PCB, battery, motor, printed parts and screws fit together. The parts list, step-by-step assembly and wiring are in CAD/ASSEMBLY.md.
The screen window, USB-C, microSD and battery sizes are placeholders and will be checked against the real parts before the final print.
All parts are from AliExpress except the custom PCB, which comes from JLCPCB. Prices are approximate AUD and change with sales, exchange rates and shipping. Many small parts only come in packs, so you'll have spares. Where a listing has several options (value, size, pin count, pack size), pick the one in the Part column.
| # | Part | Qty | Approx. AUD | Link |
|---|---|---|---|---|
| 1 | LilyGo T5 4.7" E-Paper S3 V2.3 (ESP32-S3, N16R8) | 1 | $65.00 | AliExpress |
| 2 | 3.7 V LiPo battery, ~2000 mAh, ~60 × 50 × 6 mm (605060), JST-PH 2.0 | 1 | $12.00 | AliExpress search (pick 605060 with a PH 2.0 plug) |
| 3 | 10 mm coin vibration motor, 3 V (pack of 10) | 1 pack | $5.00 | AliExpress |
| 4 | 6 × 6 mm tact switches (pack of 100) | 1 pack | $3.00 | AliExpress |
| 5 | SS12D00 mini slide switch (pack of 20) | 1 pack | $3.00 | AliExpress |
| 6 | AO3400 N-channel MOSFET, SOT-23 (pack of 50) | 1 pack | $3.00 | AliExpress |
| 7 | 1N4148 diode (pack of 100) | 1 pack | $2.00 | AliExpress |
| 8 | 10k resistors, 0805 (pack of 100) | 1 pack | $2.00 | AliExpress |
| 9 | JST-SH 1.0 mm 6-pin connectors + pre-crimped cable | 1 set | $5.00 | AliExpress |
| 10 | JST-PH 2.0 mm 2-pin connectors + pre-crimped cable | 1 set | $4.00 | AliExpress |
| 11 | microSD card, 8–32 GB | 1 | $8.00 | AliExpress |
| 12 | Custom grip PCB, 5 pcs + shipping (JLCPCB) | 1 order | $18.00 | JLCPCB (upload the Gerbers in PCB/) |
| Electronics subtotal | $130.00 |
| # | Part | Qty | Approx. AUD | Link |
|---|---|---|---|---|
| 13 | PLA or PETG filament (~80 g of a 1 kg roll) | 1 | $3.00 | AliExpress |
| 14 | M2 brass heat-set inserts (need 8, pack of 50) | 1 pack | $6.00 | AliExpress |
| 15 | M2 screw assortment (4× M2×5, 4× M2×8) | 1 kit | $6.00 | AliExpress |
| 16 | Thin double-sided foam tape (holds the battery) | 1 roll | $3.00 | AliExpress |
| Enclosure subtotal | $18.00 |
| AUD | |
|---|---|
| Electronics | $130.00 |
| Enclosure | $18.00 |
| Estimated total | ≈ $148.00 |
Charging is through the LilyGo's own USB-C port, so any phone charger and USB-C cable works.
AliExpress listings change often. If a link stops working, search AliExpress for the exact part name in the table (e.g. "LilyGo T5 4.7 S3", "AO3400").
InkDeck/
├── README.md
├── JOURNAL.md ← build log, day by day
├── PCB/ ← KiCad project + Gerbers (grip PCB)
├── CAD/
│ ├── ASSEMBLY.md ← parts list, assembly steps, wiring
│ ├── step/ stl/ ← printable parts + assemblies
│ └── images/ ← exploded view, renders, drawing
└── firmware/
├── platformio.ini
├── FIRMWARE.md ← how everything in the code works
├── src/ ← the firmware
└── pc_tests/ ← EPUB + firmware tests that run on a computer| Qty | Value | Footprint | References |
|---|---|---|---|
| 2 | 10K | Resistor_SMD:R_0805_2012Metric | R1, R3 |
| 1 | 100 | Resistor_SMD:R_0805_2012Metric | R2 |
| 1 | 1N4148 | Diode_SMD:D_SOD-123 | D1 |
| 1 | AO3400 | Package_TO_SOT_SMD:SOT-23 | Q1 |
| 1 | BAT IN | Connector_JST:JST_PH_S2B-PH-K_1x02_P2.00mm_Horizontal | J1 |
| 1 | BAT OUT | Connector_JST:JST_PH_S2B-PH-K_1x02_P2.00mm_Horizontal | J2 |
| 1 | LilyGo | Connector_JST:JST_SH_SM06B-SRSS-TB_1x06-1MP_P1.00mm_Horizontal | J3 |
| 1 | MENU | Button_Switch_THT:SW_PUSH_6mm | SW5 |
| 1 | NEXT | Button_Switch_THT:SW_PUSH_6mm | SW4 |
| 1 | PREV | Button_Switch_THT:SW_PUSH_6mm | SW3 |
| 1 | SW_SPDT | Button_Switch_SMD:SW_SPDT_PCM12 | SW1 |
| 1 | Vibration motor | Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical | M1 |
The 13 most common of 17 parts.
It measures 25 × 67 mm and has 2 copper layers, 1.6 mm thick.
17 parts, built around the AO3400. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the Yourm5m5/InkDeck repository on GitHub, at the commit this page was made from: the board is PCB/_restore_backup_2026-10-16T16-21-23-037/Inkdeck.kicad_pcb and its schematic PCB/Inkdeck.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository states no licence, so its author keeps all rights: ask Yourm5m5 before reusing the design.

sudomesh/disaster-radio
A (paused) work-in-progress long-range, low-bandwidth wireless disaster recovery mesh network powered by the sun.

Spritetm/picframe_colepd
A WiFi picture frame allowing for remote photo uploads, using an ESP32-C3 and a 5.6" color E-ink display

Tjeerdie/SPECTRE
Speeduino compatible engine control unit (ECU) based around black STM32F407VET6 board.


FeruzTopalov/eleph
GPS-based local relative navigation system for group of up to 6 members


FeruzTopalov/spoke
Standalone LoRa-based real-time off-grid relative GPS navigation for group of up to 5 people. Improved version of LRNS Eleph