PotWatch / Firmware

Firmware

One Arduino sketch, about 900 commented lines, no configuration files and no cloud. This page covers getting the tools installed, flashing the board, calibrating it once, and changing the presets to your own taste.

Download potwatch.ino Source on GitHub ↗
Step 1

Install the Arduino IDE.

  1. Download the Arduino IDE from arduino.cc/en/software. Version 2.x is the current one; it is free and available for Windows, macOS and Linux.
  2. Add ESP32 board support. Open File → Preferences and paste this into "Additional boards manager URLs":
    https://espressif.github.io/arduino-esp32/package_esp32_index.json
    Then open Tools → Board → Boards Manager, search for esp32 and install the Espressif package. It is a large download and takes a few minutes.
  3. Install five libraries from Tools → Manage Libraries. Search each name and install the version with the matching author:
    OneWire
    DallasTemperature
    Adafruit GFX Library
    Adafruit SSD1306
    Adafruit BMP280 Library
    The Adafruit libraries will offer to pull in their own dependencies — accept. Wire and Preferences are already part of the ESP32 core and need nothing.
Step 2

Flash the board.

  1. Download the sketch and put it in a folder named potwatch, so the path ends in potwatch/potwatch.ino. The Arduino IDE requires the folder and the file to share a name and will offer to fix it for you if they do not.
  2. Select the board. Tools → Board → esp32, then the entry matching your module — for the Super Mini, ESP32C3 Dev Module works. Leave the other settings at their defaults to begin with.
  3. Enable USB CDC On Boot. In the Tools menu set USB CDC On Boot to Enabled. The Super Mini talks over native USB rather than a separate serial chip, and without this the serial monitor stays silent.
  4. Disconnect the battery before plugging into USB-C. Then select the port under Tools → Port.
  5. Press Upload. If no port appears at all, hold the BOOT button while connecting the cable to force the board into download mode, then release it.
  6. Listen for two beeps. That is the boot confirmation. The menu appears on the display, and the serial monitor at 115200 baud prints live temperatures and the current boiling point — genuinely useful while testing.

If the upload fails

Two things account for almost every failure. First, some USB-C cables are charge-only and carry no data — try a different cable before anything else. Second, if the board never appears as a port, the BOOT-button trick above is the reliable way in.

Step 3

Calibrate it, once.

The defaults are 97.6 °C at 1013.25 hPa. Calibration is where you replace that with a number of your own — and the number does not have to be the boiling point. It is simply the temperature at which the countdown starts, anywhere from 85 to 102 °C.

  1. Bring a pot of water to a rolling boil and put the probe in, exactly as you would use it normally.
  2. Open Calibrate from the menu. The screen splits: live temperature on the left, the adjustable boiling point on the right.
  3. Wait for the live reading to settle — a full, unmistakable boil that holds steady for a minute.
  4. Match the right-hand number to the left using SET (+0.1 °C) and OK (−0.1 °C).
  5. Hold SET for two seconds to save. Three confirmation beeps mean the temperature and the current air pressure are stored together. From then on the firmware slides that reference point up and down as the weather changes.

You can set it lower on purpose — and there is a good reason to

Water does not go from still to rolling in one step. Long before a full boil it starts working hard: bubbles streaming off the bottom of the pan, the surface moving, plenty of heat going into the food. On the author's hob that point arrives around 88 °C — and it is a perfectly good moment to start cooking and turn the hob down.

So the trigger is set to 88 rather than to the true boiling point, and the countdown begins there. That is not a workaround; it is the more useful behaviour for gentle cooking, and it avoids the rolling, spitting boil you rarely actually want.

Think of the calibration screen as "start the timer when the water reaches this temperature". Setting it to your genuine boiling point is the obvious default. Setting it a few degrees lower, where the pan is lively but not violent, is a deliberate and often better choice.

Calibration survives reflashing

Settings live in the ESP32's non-volatile storage under the namespace clipegg — the project's original name, deliberately left unchanged so that saved calibration is not lost when you upgrade the firmware. If you rename it, calibration resets to the defaults.

Reference

Two buttons, six menu items.

SET moves, OK chooses. Everything else is a variation on those two.

Menu item
What it does
Benedict — 1 min
Waits for the boil, then counts one minute
Soft egg — 3 min
Waits for the boil, then counts three minutes
Hard egg — 5 min
Waits for the boil, then counts five minutes
Soup…
Adjustable in 15-minute steps, from 15 minutes to 2 hours
Timer…
Free-form, 1 minute to 6 hours, with accelerating hold-to-scroll
Calibrate
The one-time tuning described above
Control
Action
SET (tap)
Next menu item · +15 min in soup mode · +1 min in timer mode · +0.1 °C when calibrating
OK (tap)
Select · start · cancel a running countdown · −1 min in timer mode · −0.1 °C when calibrating
hold SET
Fast scroll, accelerating in three stages · hold 2 s while calibrating to save
hold OK (3 s)
Full reset back to the menu, from anywhere
SET + OK
In timer mode: tap both to start · hold both 1.5 s to leave without starting

Why the two-button chord needs a window

Pressing two buttons "at the same time" never is — one always lands a few milliseconds before the other. Earlier versions therefore applied a stray ±1 minute before recognising the chord, and the timer started one minute off. Version 4.0 holds a single-button press for 80 ms before acting on it: long enough to tell a deliberate chord from a lone tap, short enough that nobody notices the delay.

Make it yours

The numbers worth changing.

All of these are constants at the top of the sketch. Change, save, reflash — that is the whole workflow.

Constant
What it controls
PRESET_MINUTES[]
Cooking time of the three egg presets, { 1, 3, 5 }. The menu labels are generated from this array, so they can never disagree with it
BOIL_CONFIRM_COUNT
How many consecutive hot readings confirm a boil (default 5). Raise for more caution, lower for a faster start
DEFAULT_BOIL_TEMP
Fallback boiling point before calibration, 97.6 °C
DRY_POT_TEMP
Temperature that counts as "no water left", 105 °C
DRY_POT_PROTECT
Set to 0 to switch dry-pot detection off entirely
SOUP_MIN / MAX / STEP
Range and granularity of soup mode — 15 to 120 minutes in 15-minute steps
TIMER_MIN / TIMER_MAX
Range of the free-form timer, 1 to 360 minutes
BUZZER_FREQ
Alarm pitch in hertz. 3000 Hz was chosen by sweeping the frequency and listening for the loudest point — a piezo disc is close to mute away from its resonance, and a different disc may peak elsewhere. Worth repeating the test if you fit another one
PIN_*
Pin assignments, if you wire it differently from the diagram

Send your changes back

The firmware is GPL v3: modify it freely, and if you distribute a device or a fork, keep the source open. If you fix something or add a preset worth having, I would genuinely like to hear about it.