DETAIL 3 / E-201 — BENCHPROJECT 5 OF 7
Cold Plunge Timer
ESP32-S3 FIRMWARE · PRINTED CASE
A guided cold-plunge timer with a knob, temperature sensors and a wall case I designed in code.
- DETAIL
- 3 / E-201
- SHEET
- E-201 · BENCH
- STATUS
- WORKING PROTOTYPE
- ZONE / LAYER
- BENCH · ELECTRONICS
- BUILT WITH
- C++, ESP32-S3, LVGL
DEMO ROUTINE · 5 SEGMENTS
- Chest 1:00
- Neck 0:45
- Face 0:30
- Hands 0:30
- Stillness 1:00
PROBLEM
I wanted a guided timer that shows water temperature and tracks consistency without a phone near the water. Only the probe goes in the water; the display hangs outside the splash zone on a USB power bank.
BUILD
C++17 with PlatformIO and LVGL 8 on a purchased round 2.1-inch ESP32-S3 touch display with a rotary knob. Five screens: dashboard, active session, routine editor, summary and settings. Routines split into segments (chest, neck, face, hands, stillness). A DS18B20 probe reads the water, an I2C sensor reads the air, and sessions append to LittleFS as JSONL.
STATUS
Working prototype (v1). Firmware and host tests built April 2026. The enclosure was revised through early May 2026 after a first test print.
STACK
- C++17
- Arduino (ESP32-S3)
- PlatformIO
- LVGL 8.4
- ArduinoJson 7
- OneWire / DallasTemperature
- LittleFS
- Python host tests
- ForgeCAD
- Bambu Studio
KEYNOTES · BUILD NOTES
- Segment timing, pause/resume and the score cap are unit-tested on the host with -Wall -Wextra -Werror.
- Recovery score: 60 for completion, 20 for consistency, 20 for colder water, stepping up at 4.4, 7.2, 10 and 12.8 °C.
- The wall case is a parametric ForgeCAD model that passes 14 checks. A plate script confirms all three parts fit the printer.
- Config and session files seed on first boot, and a malformed config falls back to safe defaults.
MICHAEL MORALE · DETAIL 3 — COLD PLUNGE TIMER
DETAIL
3 / E-201
SHEET
E-201