A tiny physical book-reading tracker built around an ESP32 e-ink display. Press a button every time you finish a book — the count is saved forever, even when the battery dies.
| Finished a book | Reset animation |
|---|---|
![]() |
![]() |
| Front | Side |
|---|---|
![]() |
![]() |
- E-ink display — readable in sunlight, no backlight drain
- Up button — increments count with a confetti burst animation
- Down button (short press) — decrements count
- Down button (long press, 1.5 s) — resets to zero with a T-Rex walking in and chomping the number away
- Persistent NVS storage — count survives power cuts and battery swaps
- Light sleep between presses — long battery life
| Part | Link |
|---|---|
| Heltec Vision Master E213 V1.1 (ESP32 + 2.13" e-ink) | AliExpress |
| Li-Po battery | AliExpress |
| Tactile button | Amazon UK |
Print files are in the PrintFiles/ folder. Also available on Creality Cloud.
| File | Description |
|---|---|
3MF/BookCounterWithArrows.3mf |
Ready-to-slice 3MF with both panels (recommended) |
Front Panel v7.stl |
Front panel with button cutout and display window |
Back Panel V5.stl |
Back panel / battery cover |
Step/front new button.step |
Editable STEP source for the front panel |
Step/Back Panel v5.step |
Editable STEP source for the back panel |
Print in your filament of choice — no supports needed.
Download and install the Arduino IDE (version 2.x recommended).
- Open File → Preferences
- Paste the following URL into the Additional boards manager URLs field:
https://resource.heltec.cn/download/package_heltec_esp32_index.json - Open Tools → Board → Boards Manager, search for Heltec ESP32, and install it
Open Tools → Manage Libraries and install the following:
| Library | Install name | Notes |
|---|---|---|
| Heltec eInk Modules | heltec-eink-modules |
Drives the e-ink display — provides EInkDisplay_VisionMasterE213V1_1 |
| Preferences | (built-in) | Part of the ESP32 Arduino core — no separate install needed |
The ESP32 light-sleep functions used in the code (
esp_light_sleep_start,esp_sleep_enable_gpio_wakeup,gpio_wakeup_enable) are also part of the ESP32 Arduino core and require no extra libraries.
- Open
BookCounterdino/BookCounterdino.ino - Go to Tools → Board and select Heltec Vision Master E213
- Select the correct COM port under Tools → Port
- Click Upload
| GPIO | Role |
|---|---|
| 17 | UP button (active low, internal pull-up) |
| 39 | DOWN button (active low, external 10 kΩ pull-up required — see note below) |
Important — GPIO 39 has no internal pull-up: GPIO 39 on the ESP32 is an input-only pin that does not support internal pull-up resistors.
INPUT_PULLUPis silently ignored for this pin. Without an external pull-up, the pin floats and the DOWN button (and sometimes the UP button) will stop responding after a cold power-on.Fix: Solder a 10 kΩ resistor between the GPIO 39 pin and the 3.3 V pin on the board. One leg to 3.3 V, the other leg to GPIO 39. The button itself is wired between GPIO 39 and GND as normal — no other changes needed.
3.3V ──┤10kΩ├── GPIO 39 ──── Button ──── GND
Power on ──► display saved count
UP press ──► count++ ──► confetti animation ──► display new count
DOWN short ──► count-- ──► display new count
DOWN long ──► count = 0 ──► T-Rex CHOMP animation ──► display 0
Between presses: ESP32 light sleep (GPIO wake-up)
Count is stored in NVS (Preferences library) under the key bookctr/count so it persists across reboots and battery changes.
MIT — do whatever you like with it.



