Singapore is warm enough that I started paying closer attention to the rabbits’ balcony setup: air temperature, humidity, whether the floor felt comfortable, and how quickly the area warmed up during the day.
That became the start of Hoppsicle, a small home project for experimenting with a cooled surface near their space.
The goal is not to replace proper cooling. It is smaller than that: move a bit of heat away, measure the conditions, and give me a local controller I can check quickly. Because this is on the balcony, simply solving it with aircon is limited. I wanted something small enough to sit next to the enclosure and clear enough to show me when it is not working well.
The Build
The current version runs on a Raspberry Pi. A Rust gRPC server talks to the hardware, and a Slint frontend runs on the Pi’s 800x480 touchscreen.
The hardware is a mix of sensors and outputs:
- SHT31 for air temperature and humidity.
- DS18B20 for the cooled surface temperature.
- PZEM-004T for voltage, current, and power.
- ZJ-S401 flow meter for the water loop.
- Relays for the pump, fans, and peltier modules.
The screen shows the things I want to know without opening a terminal: current mode, target temperature, air temperature, humidity, dew point, cooled surface temperature, power draw, water flow, and recent logs.
The dashboard turned out to be its own learning project. I had not spent much time building real device UIs in Rust before, and Slint was a good fit for this kind of small touchscreen: simple layout, fast enough on the Pi, and easy enough to connect buttons to Rust callbacks.
It also changed how I worked on the project. At first I mostly cared about sensors and relays. Once the UI was on the table, I started thinking more about what I would want to see while standing next to the enclosure. Big numbers matter more than a perfect layout. A target temperature control needs to be hard to mis-tap. Logs should be readable enough to tell me whether a sensor dropped out or recovered.
Noisy Sensors
The first real hardware problem was electrical noise.
When the pump or peltiers switched, the sensors did not always behave cleanly. The SHT31 could stop responding on I2C. The DS18B20 could disappear from the 1-wire bus, or briefly report exactly 25.000°C, which is its power-on reset value.
That 25°C reading is annoying because it looks believable. I did not want the thermostat logic making decisions from a reset spike, so the server became more careful about sensor data.
The SHT31 runs in a background polling task. If reads fail repeatedly, the server sends the sensor’s soft reset command and marks the reading unavailable until it recovers.
The DS18B20 has separate handling. Empty reads and CRC failures are rejected. Sudden 25°C reset values are ignored when they do not fit the previous readings. After enough failures, the server can re-scan the 1-wire bus and power-cycle the probe through a GPIO-controlled supply.
That last bit is very much a hardware-project fix. Sometimes the answer is just turning the confused part off and on again, but doing it deliberately instead of pretending the sensor never lies.
Water Flow
Peltier modules are easy to turn on, but the rest of the system still needs basic safety checks. Hot-side heat removal is handled separately by PC cooling radiators and fans. The flow meter is not there to prove the hot side can dump heat; it is there to confirm that the water loop itself is actually moving.
I added a ZJ-S401 flow meter. The first attempt used GPIO interrupts, but that was not reliable enough on the Raspberry Pi setup I had. The current version polls the pin in a small loop, counts rising edges, and converts the frequency into liters per minute.
That gives the controller a basic safety signal: if cooling is active but flow is missing, it can shut the pump and peltiers down instead of quietly running in a bad state.
The water loop also needs some normal maintenance thinking. I added algae protection so the reservoir does not become another source of problems, and I swapped the pump for an ultra quiet submerged PC water pump with an integrated reservoir. The newer pump is also less electromagnetically noisy, which matters because the earlier setup made the sensor issues worse around switching events.
Peltiers, PWM, and Thermostat Logic
The peltier part took the most trial and error.
I first tried to think about the peltiers like something I could control smoothly with PWM. That did not really work. The cooling effect is slow, the thermal mass of the surface matters, and changing duty cycles did not feel like precise temperature control. It mostly added complexity around something that wanted to be managed more slowly.
So the current direction is simpler: pump and peltiers are controlled by the server as a thermostat loop, with relays and hysteresis rather than trying to continuously “dim” the cooling.
There is also the efficiency problem. Peltiers are convenient for a prototype because they are small and easy to wire, but they waste a lot of energy as heat. For this first version that is acceptable because I am mostly learning about the control loop, sensors, UI, and water path. For a second version, I would probably move closer to a small HVAC-style design instead of trying to get more cooling out of more peltiers.
Condensation is another concern. Cooling a surface too far below the room’s dew point is not a good idea, so the server calculates dew point from air temperature and humidity and uses that as a floor for auto mode.
The cooled surface also does not stop changing temperature the moment a relay switches. The code now uses hysteresis, shifted thresholds, and consecutive readings before changing state, which keeps the relays from reacting to every noisy sample.
Auto mode avoids recalculating the target constantly too. If the dew point is hovering around a boundary, changing the target every few seconds creates unnecessary movement. Holding a target for a while makes the controller calmer.
Where It Is Now
Hoppsicle is still a home build. The current version is useful for experimenting, but I am still learning what cooling is realistic, how stable the water loop is, how much sensor isolation is needed, and how cleanly I can package the enclosure.
A small pet comfort idea turned into a control system with sensors, relays, flow checks, recovery code, and a local dashboard that taught me more about Rust UI work than I expected.
