I’ve converted the measurements: battery 61.9 × 33.3 × 3.2mm, buttons approximately 12.7 × 12.7 × 12.7mm with 12.7mm pin spacing, and switch approximately 7.9 × 8.5 × 3.2mm with 3.2mm travel. I’ll use rear-left = Previous and rear-right = Next, revise the circuit and firmware, then re-place and reroute the PCB around those rear controls and battery envelope.
The electrical conversion is underway; the remaining work is the mechanically sensitive rear-button placement and rerouting around the Feather/battery volume. I’m continuing through the validation pass rather than stopping with a partially revised board.
The rework executor stopped before completing the revision. I’m checking exactly what landed, then I’ll finish the two-button schematic/firmware changes and independently verify the rear placement and routing.
Rear-left SW3 = Previous, connected to Feather GPIO26.
Rear-right SW4 = Next, connected to Feather GPIO25.
Both 12mm tactile buttons are mounted on the PCB bottom/rear side.
Power switch and corrected portrait 1×9 display header remain.
Board is fully routed with 0 airwires and no open ERC/DRC warnings or errors.
The battery is an enclosure-mounted item, not PCB-mounted. Next, the firmware and enclosure should be finalized around the rear buttons and 61.9 × 33.3 × 3.2mm battery.
GPIO12 is avoided because it is a boot-strapping pin. GPIO13 is avoided because it drives the onboard red LED. Input-only GPIO34/36/37/39 are not used as outputs.
Arduino IDE Setup
Install Arduino IDE 2.x.
Install esp32 by Espressif Systems.
Select Adafruit Feather ESP32 V2.
Enable PSRAM if the selected core exposes a PSRAM tool option.
Select an 8 MB flash partition scheme with a useful LittleFS/SPIFFS data partition. The sketch mounts LittleFS.
Install:
TFT_eSPI by Bodmer
ESP32Encoder by madhephaestus
The firmware uses the Feather's USB-to-UART bridge. Serial appears as a CP2102N/CH9102F serial port; no ESP32-S3 native-USB settings are required.
TFT_eSPI Setup
Copy the downloaded header into the TFT_eSPI library folder and include it from User_Setup_Select.h:
Cpp
#include<User_Setup_Pocket_Feather_Reader.h>
The display controller is confirmed as ST7796, 320×480. Keep ST7796_DRIVER enabled in the supplied TFT_eSPI setup header; no ILI9488 configuration is required.
Storage and Memory Safety
Feather ESP32 V2 has 8 MB flash and 2 MB PSRAM.
Firmware requires detected PSRAM before loading books.
Each book is limited to 1500 KiB and additionally limited by current free PSRAM minus a 256 KiB reserve.
Allocation, exact read length, and page-index construction are checked before entering reading mode.
Failed or oversized books show an error and do not overwrite the currently stored file.
Uploads use /books/.upload.tmp, optional CRC32 verification, then atomic rename.
Controls
Menu rotation: select a book.
Menu short press: open selected book.
Reading rotation: change page.
Reading short press: toggle light/dark theme.
Reading hold for 0.9 s: save position and return to menu.
Per-book page state is stored in Preferences under a filename hash.
Serial Protocol
Commands use 115200 baud and LF line endings:
HELP
LIST
STATUS
PUT
DELETE
SELECT
BRIGHT
Examples:
Bash
python -m pip install pyserial
python feather_reader_uploader.py --port auto ports
python feather_reader_uploader.py --port COM7 list
python feather_reader_uploader.py --port COM7 upload book.txt --name "My Book.txt"python feather_reader_uploader.py --port /dev/cu.usbserial-0001 status
python feather_reader_uploader.py --port /dev/ttyUSB0 brightness 160
Backlight Warning
The Q1 circuit is verified as inverted: higher GPIO duty pulls BLK low for more of the period. Bench measurements found approximately 1.1 mA BLK current at 3.18 V, confirming a low-current active-high control input. The downloaded firmware's inverted brightness mapping is correct.
Validation Status
Python uploader passed python -m py_compile.
TFT_eSPI header passed delimiter and malformed-literal checks.
The Arduino sketch was structurally reviewed but has not been compiled against a specific installed Arduino-ESP32/TFT_eSPI version or tested on hardware.