---
title: "An ESPHome-powered Smart PWM Fan Controller"
description: "Control your fan walls with style from HomeAssistant"
date: 2025-05-16
tags:
  - DIY
  - Home Automation
---

## The Motivations

I have a few fan arrays/walls throughout my house, namely two in my garage, and one I plan to build in my room over my bed to replace a tower fan.

But PC fans can be noisy, and control is ideal. So I decided to build myself a relatively simple ESPHome-based fan controller!

## The Design

I of course wanted to base the design off the ESP32, which is my go-to microcontroller for all ESPHome-related devices these days. One crucial feature of the ESP32 is that it contains 8 pulse counter units, which allow the chip to count pulses - like a fan tachometer - very quickly and without using the CPU. I selected my venerable slim HW-395 model, which I also use for [my](/posts/the-supersensor) [Supersensors](/posts/the-supersensor-2.0), as its compact size but full pin count makes designing around it very easy.

The ESP32 alone can output PWM as well, so I didn't need any sort of fancy controller chip - I just hooked the PWM lines up to each fan and let the ESPHome software do the rest. Lastly a relay controls power to the fans, for simple on/off control in addition to the PWM level control, giving the full range of control needed for a fan array.

I also needed a way to step down the 12VDC input to the 5V that both the ESP32 and relay needed, so for that I selected a basic adjustable DC-DC converter. This did require initial tuning during each board's assembly, but once set it should never need further adjustment. I used an SMD-like method with a hot air gun to ensure a flat profile with good contact for this board, while everything else is through-hole soldered. You can also find versions of this board with a fixed 5V output that would work well instead.

I designed the board in EasyEDA and ordered from JLCPCB for a very reasonable price (though shipping costs are not what they used to be). The overall design is quite simple, with power routing capable of at least 3A of current at a minimum. The schematics can be found on [the GitHub project](https://github.com/joshuaboniface/smart-pwm-fan-controller).

![Board Design](board-design.png)

![Board Layout](board-layout.png)

Which when fabricated looks lovely in black.

![Board](board.png)

And assembled it looks very sleek.

![Assembled](assembled.png)

Lastly, the HomeAssistant view shows everthing we might need, with power and speed controls as well as the RPM tachometer output of each fan (useful to see levels or if a fan fails).

![HomeAssistant Device](hass.png)

ESPHome code and schematics for the PCB can be found on [the GitHub project page](https://github.com/joshuaboniface/smart-pwm-fan-controller).

## Parts List (prices as of May 2025)

| Qty       | Component                | Cost (CAD, ex. shipping) | Links |
|-----------|--------------------------|--------------------------|-------|
| 1         | ESP32 HW-395             | $6.67                    | [AliExpress](https://www.aliexpress.com/item/1005006019875837.html)* |
| 8         | 4-pin fan header         | $0.21 ($1.02/5)          | [AliExpress](https://www.aliexpress.com/item/1005007499957251.html) |
| 1         | MP1584EN DC-DC converter | $1.34 ($13.99/10)        | [Amazon](https://www.amazon.ca/dp/B07THSDWHX) |
| 1         | SRD-05VDC-SL-C relay     | $1.52 ($18.16/12)        | [Amazon](https://www.amazon.ca/dp/B098JHY5TP) |
| 1         | DC barrel jack           | $0.98 ($9.79/10)         | [Amazon](https://www.amazon.ca/dp/B011HFLKI2) |
| 2         | 1kΩ resistor (1%)        | $0.06 ($10.99/200)       | [Amazon](https://www.amazon.ca/dp/B096PK4XN5) |
| 1         | 1N4004 diode             | $0.07 ($20.99/300)       | [Amazon (kit)](https://www.amazon.ca/dp/B07YK3XMQQ) |
| 1         | BC337 transistor         | $0.06 ($12.13/200)       | [Amazon (kit)](https://www.amazon.ca/dp/B07X62PBMH) |
| 1         | 3mm LED                  | $0.05 ($15.99/350)       | [Amazon (kit)](https://www.amazon.ca/dp/B073GRZNRL) |
| 1         | Custom PCB (JLC)         | $0.50 ($5.00/10)         | [GitHub](https://github.com/joshuaboniface/esphome-pwm-fan-controller) |
| **TOTAL** |                          | $12.99                   |       |

* Items marked with an asterisk (`*`) require selection of the correct specific component on the page.

* Several pieces came as part of larger variety kits, so individual prices may not be completely accurate.

## Final Thoughts

This was a fun little project, and I'm quite happy with how it turned out. And it will definitely help keep me cool this summer. Here's 3 of them powering fan walls throughout my garage; with many more around my house.

![Man Door](4830.jpg)
![Workbench](4831.jpg)
![Main Door](4832.jpg)


Happy hacking!
