MICHAEL MORALEPORTFOLIO SET · 6 SHEETS
LINKEDIN

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
FIG. 5 — THE DIAL, REDRAWN AND RUNNABLE
SEGMENT 1 / 5 CHEST 1:00 DEMO ROUTINE 3:45

DEMO ROUTINE · 5 SEGMENTS

  1. Chest 1:00
  2. Neck 0:45
  3. Face 0:30
  4. Hands 0:30
  5. 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

  1. Segment timing, pause/resume and the score cap are unit-tested on the host with -Wall -Wextra -Werror.
  2. Recovery score: 60 for completion, 20 for consistency, 20 for colder water, stepping up at 4.4, 7.2, 10 and 12.8 °C.
  3. The wall case is a parametric ForgeCAD model that passes 14 checks. A plate script confirms all three parts fit the printer.
  4. 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