An ESPHome-driven smart controller for 12V PWM fans.
Classical radiators (K2/K3) typically require relatively high flow temperatures to heat up a room. Using forced convection can significally enhance their efficiency, especially at low flow temperatures. While there are a number of commercial solutions available, these did not need my needs. They are either too loud while running or switching on/off using a relais, don't properly switch at low flow temperatures, are too expensive or simply not powerful enough. Hence, I set out to build my own solution using standard 120/140mm PWM-capable PC fans. High-end fans run at low speeds (<500 RMP) are essentially inaudible and provide a definite boost to the room temperature. Being able to smartly control the fan speed and integrate them into Home Assistant - while not a must - is definitely very nice to have if you want to control fan speed based on time of day, current room temperature or room occupancy. The fans can even be used as a kind of thermostat to modulate room temperature without restricting flow to the radiators, which is especially crucial when using a heat pump that perform best with an open loop circulation and no TRVs.
Using these device throughout our house, we can run out heat pump at flow temperatures typically reserved for good underfloor heating setups (Vaillant heat curve at 0.25 - 30°C flow temperature at 0°C, 35°C flow temperature at -10°C).
- M5Stack Atom Lite / Atom Lite S3 pluggable µC with usable Grove port for arbitrary I2C device support
- 8 fan connectors in 2x4 rows
- Each row can be individually PWM controlled (this is not enabled by default)
- RPM measurement for the first fan in each row
- Global on/off switch for fans that don't support zero output at zero PWM
- Plug-in connectors for two DS18B20-compatible temperature sensors
- Power supply: 12V barrel jack (2.1/2.5 mm), center positive
- Reverse voltage & transient overvoltage protection, 2.5 A resettable fuse
- Fully ESPHome compatible
- Controllable via Home Assistant or through any browser via stand-alone webserver
- Automatic fan curve driven speed control
- Setup & Connection to local WiFi via improv WiFi Hotspot on first boot
Don't connect to USB when the Atom lite is plugged into the PCB - there is no mechanism to block voltages between the included buck converter and the computer.
- Compile & flash ESPHome firmware on the Atom Lite using USB. Skip this step if you have a pre-flashed controller. The ESPHome directory on GitHub contains the yaml as well as factory & ota images so you can directly flash this without a local ESPHome compiler set up.
- Connect DS18B20 to the push-in terminal blocks. The wire designations are marked on the PCB and are (from left to right): +3.3V, Data, GND. It's easiest to insert them all at the same time. Hold the wires in one hand in the correct order and insert them into the terminal. Then push all orange levers down at the same time and push the wires down as far as possible. The levers should almost return to the initial position and not be stuck halfway down. If you want to use more than one sensor, you need to manually edit the ESPHome yaml and include the individual IDs of the DS18B20s.
You can set 5 temperature points and associated fan speeds to build a temperature-dependent fan speed response. The speed between the points is interpolated linearly. The temperatures have to increase from 1 to 5; this is also enforced by internal logic. Temperatures above/below the highest/lowest setpoint keep the speed of this setpoint. Set "Auto Fan Curve Control" to on in order to use this feature.
In the below example, the fans are off below 20°C, increase between 0 and 29% speed in the range between 20 and 21°C, then increase up to 100% at 25°C. Above that, speed decreases to 28% at 30°C and the fans are off again at 35°C.
When fan speed is set to zero, the internal high-level switch also cuts all power to the fans. Some fans (e.g. Arctic PXX PWM) turn off with a zero PWM signal and wouldn't need this functionality, however many other fans cannot be turned off via PWM alone.