← Build Log

Up in Smoke

hardware prototype

A brief and brilliant career

The Adafruit package finally arrived. Light sensor, VOC sensor, microphone. The full sensor suite that turns a soil probe into an actual plant monitoring platform. This meant it was time for Alert Auk, the next prototype up from Aspirational Ani. Same QT Py ESP32-S3 brain, but now with breakout boards for light, air quality, and sound on top of the existing soil moisture and temperature. The plan was simple: pull Ani out of the raised bed, reuse the QT Py, wire up the new sensors, and have a fully-loaded prototype by dinner.

The plan went great, right up until it didn’t.

The uprooting

Aspirational Ani has been living in my cold frame bed for about a week, faithfully reporting soil moisture and temperature every six hours. Pulling her out felt oddly ceremonial. Like retiring a spacecraft. A spacecraft made of hot glue and a battery box with a screwdriver hole in the side, but still.

I brought her inside, cracked open the battery box, and got to work.

Aspirational Ani opened up on the soldering mat, QT Py crammed in with batteries, soil sensor sticking out the side
Ani on the operating table. The battery box, the QT Py, the soil sensor poking out the side. Peak engineering.

Disconnected the soil sensor and wired up the new breakout boards. Everything was going to share the QT Py’s power rail and live in the same battery box.

The sensors work

I got the sensors up first, before worrying about the enclosure. Plugged into USB, loaded up CircuitPython, and within an hour I had all five sensors reading. Light in lux. VOC index. Temperature. Moisture percentage. Even the mic was picking up ambient noise levels.

This is the part that never gets old. You wire some boards together, write a few lines of Python, and suddenly you can measure things about the world that were invisible five minutes ago. The SGP40 was already picking up something in my office air that I’m choosing not to investigate further.

The battery box

Then I went to put it back in the battery box. This is where Ani’s enclosure design, such as it is, starts to matter. Three AA batteries in a waterproof holder, with the QT Py crammed inside and wires running out through a hole I made with a screwdriver and sealed with hot glue.

The original solder joints on the battery leads had failed. Not surprising. I’d done them quickly during the first build and the wires had been flexing every time I opened the box. So I resoldered them.

I resoldered them wrong.

The smoke

Reverse polarity. Positive where negative should be. I connected the battery pack, and the QT Py let me know immediately by releasing its magic smoke.

For the uninitiated: all electronics run on magic smoke. Let the smoke out and they stop working. I don’t make the rules.

Check your polarity. Then check it again. Then check it a third time, because you definitely didn’t actually check it the first two times. You just looked at the wires and thought “yeah, that’s right.” It wasn’t right.

The QT Py is dead. The soil sensor survived because it wasn’t connected yet. The new breakout boards are fine because they were on a separate header. Just the brain. Just the $10 part that everything else depends on.

The damage report

Dead QT Py ESP32-S3 held in hand, showing scorch marks
Rest in peace, little guy. You deserved better.

One dead QT Py ESP32-S3. One intact soil sensor. Three brand new, untouched breakout boards. One battery box that has now destroyed more microcontrollers than it has successfully powered. And one raised bed that no longer has a sensor watching it, because I pulled Ani out to do this upgrade.

I have a spare QT Py. I ordered two because I’m not a complete fool, just a partial one.

The comeback

Swapped in the backup board and decided I was done negotiating with battery terminals for the day. Wired the whole thing to a rechargeable battery pack instead, skipping the battery box entirely. Dignity is overrated. Got Alert Auk running with all five sensors. Soil moisture, temperature, lux, UV, and VOC. Deployed outside among the seedlings and reporting home.

Alert Auk prototype deployed outside among potted seedlings, wires running to breakout boards
alert-auk-001, alive and watching seedlings. The wires add character.

With actual sensors producing actual data, I also built out the duty cycle system. Phoebe wakes every 15 minutes for the fast sensors (soil, light, UV) and every 6 hours for the slow ones (VOC needs a 10-second heater warmup, the mic needs a longer sample window). When a device is first registered, it runs in calibration mode for 48 hours: short ticks every 5 minutes, long ticks every hour. Aggressive, but the world model needs dense data to get its bearings.

The best part: the timing is server-tunable. Every time the device phones home with a reading, the response includes updated tick intervals. Phoebe can eventually adjust her own sampling rate. “This plant is drying fast, I need readings every 5 minutes.” Or: “Plant is dormant, checking in every 30 is fine.” The device just does what it’s told.

What now

Alert Auk is in calibration mode. For the next 48 hours she’s waking every 5 minutes instead of every 15, flooding the world model with data. Light curves through the day. Soil moisture trending between waterings. VOC baselines for this specific spot on the deck. The model needs density to learn, and right now it’s getting it.

The real question is what all this data can actually tell Phoebe. Five sensors is a start, but there are 56 more on a slow boat from Shenzhen. VOC sensors with built-in humidity compensation. Temperature probes at 40 cents each. Capacitive soil moisture sensors. I2S microphones. UV sensors. Lux sensors. All for less than the cost of a nice dinner. The per-unit economics of Chinese electronics are genuinely unhinged.

Whether a $30 sensor suite and some borrowed agronomic math can actually model a plant remains to be seen. But the data is flowing, the model is learning, and I have a backup QT Py. Onward.

— Ben