Every kitchen timer has the same flaw, and once you notice it you cannot un-notice it: it starts counting when you press the button.

But "three minutes for a soft-boiled egg" does not mean three minutes from when you pressed start. It means three minutes of boiling. So you stand at the stove watching for bubbles, press the button at some moment that feels about right, and accept that breakfast is a coin flip. A watched pot, as the saying goes, never boils.

PotWatch is a small device that clips onto the rim of the pot, drops a stainless probe into the water, and takes that judgement away from you. It waits until the water reaches the temperature it is looking for, and only then starts the countdown. Then it shouts.

That is the whole idea. The interesting part is what "the temperature it is looking for" turned out to mean.

Water does not boil at 100 °C

This is the part everybody knows and nobody accounts for. Water boils at whatever the local air pressure says it should — lower if you live somewhere high, and drifting by a fraction of a degree as weather systems roll through. A device that waits for a fixed 100 °C will either wait forever or start early, and both failure modes ruin the egg.

So PotWatch carries a BMP280 barometer and computes its own threshold:

trigger = calibratedTemperature
        + (currentPressure − calibratedPressure) × 0.03
        clamped to 85…102 °C

The 0.03 °C per hectopascal falls out of Clausius–Clapeyron and is close enough to linear over the ±30 hPa that weather actually moves. Altitude is a much bigger jump than that, and it is not handled by the formula at all — it is handled by calibrating once, in your own kitchen, against your own pot.

Detection then requires five consecutive readings at or above the threshold, sampled once a second. A splash, a burst of steam, or one noisy conversion resets the counter. Under-engineering this was the difference between a device that works and a device that starts the timer when you stir the pot.

The feature I did not plan: the threshold is a setting

The calibration screen exists so you can tell the device where your water boils. What I actually do with it is different, and I think better.

Water does not go from still to rolling in one step. Long before a full boil it is already working hard — bubbles streaming off the base, the surface moving, plenty of heat going into the food. On my hob that point arrives around 88 °C. So that is what I set the trigger to. The countdown starts there and the hob comes down, and the food cooks in water that is lively rather than violent.

Which reframes the whole device. It is not really a boil detector. It is "start the timer when the water reaches this temperature" — anywhere from 85 to 102 °C — and boiling just happens to be the obvious default. Nobody asked for that; it fell out of using the thing.

The failure that nearly killed the project

The first prototypes kept destroying their temperature sensors.

Not gradually — a DS18B20 would work perfectly for a few sessions and then return garbage forever. I replaced sensors, blamed the wiring, blamed the water, blamed the cheap modules. Then I noticed the common factor: it only happened on the induction hob.

An induction cooktop is a large, unshielded coil throwing a serious alternating magnetic field around, and I had helpfully placed a bare semiconductor inside a metal tube right next to it. The steel thermowell I had chosen to protect the sensor was doing the exact opposite — acting as an antenna and delivering the interference straight to the part I was trying to protect.

Two changes fixed it:

  1. Bed the sensor in thermal paste — ordinary CPU heatsink compound — before sliding it into the well.
  2. Bond the steel thermowell itself to ground with a wire.

The grounded tube is almost certainly doing the real work: it turns the sleeve from an antenna into a shield wrapped around the sensor. The paste was originally there to improve thermal coupling, and it does — the probe responds noticeably faster with the air gap gone — but it also holds the sensor mechanically still inside a grounded enclosure, which cannot hurt.

Since that change the probe has survived repeated use on induction with no failures. That is several months of evidence rather than several years, so I am stating it as "this fixed it for me" rather than "this is solved". If you build one and still lose a sensor, I want to hear about it.

Failure handling, because it lives next to boiling water

Three things the firmware refuses to be naive about:

Two firmware details worth stealing

The alarm does not block. The obvious way to play a melody on a piezo is a chain of tone() and delay() calls, and the obvious consequence is a device that ignores its own buttons while it beeps at you. Version 4.0 replaced that with a tiny non-blocking sequencer: an array of frequencies, an array of durations, and a service function called from the main loop. The device stays fully responsive while the alarm runs, and the temperature keeps being sampled throughout.

Two buttons pressed "simultaneously" never are. The custom timer screen uses SET and OK for plus and minus, and both together to start. Except one of them always lands a few milliseconds before the other, so every start also applied a stray ±1 minute — a bug that took embarrassingly long to characterise because it looked like an off-by-one in the arithmetic. The fix was to hold a single-button press for 80 ms before acting on it: long enough to recognise a deliberate chord, short enough that no human notices the latency.

One more piece of hard-won trivia

A piezo disc is nearly mute away from its mechanical resonance. I swept the frequency and listened for the peak rather than picking a round number — it came out at 3 kHz for this element, and that is what is in the firmware. If you fit a different disc, sweep it again; the volume difference is not subtle.

What is still wrong

The clip. It holds the device on the pot rim only when its screws are done up hard, and the tension slackens with use. Slack enough, and the device can tip — lifting the probe out of the liquid and into the air, where it will faithfully report that your water is cold and wait forever.

Usefully, the mount is the most self-contained part of the design: two printed parts, holder1.step and holder2.step, carry the bought spring clip, and nothing else depends on their shape. A better clamp costs you two files rather than a rebuild. If clamping mechanisms are your area, this is where help would be most valuable.

Build it

The whole thing is common hobby parts, about €25: an ESP32-C3 Super Mini, a DS18B20 in a stainless thermowell, a BMP280, an SSD1306 OLED, a passive piezo, two panel-mount buttons and a 3D-printed clip body. Power is a LiPo pouch through a TP4056 charger and a 3.3 V step-down module, so it is cordless and charges over USB-C.

Firmware is a single commented Arduino sketch, GPLv3. Models, diagrams and documentation are CC BY-SA 4.0 — use them commercially if you like, but credit the original, say what you changed, and keep your version under the same licence. The whole credit requirement is one line: PotWatch by Ilia Kuzmin — https://potwatch.net — CC BY-SA 4.0. Modified from the original. Copyright covers these files, not the idea: draw your own enclosure and you owe me nothing. Nothing is patented or trademarked and nothing ever will be.