Recently I had hacked a Riverbed Steelhead x55 and installed pfSense (OpenBSD) Firewall on it.
Under normal operation, when you first turn the machine on the 3 turbine fans should turn on to full speed and then slow down according to however hot the CPU is. The fan speeds then varies as required for heat dissipation.
If there is a problem (eg. temperature sensor broken or software not controlling the fans) then the fail-safe is that the fans will function at just below max speed 100% of the time.
This cooling system is controlled by ACPI (Advanced Configuration and Power Interface) and is an industry standard, which OpenBSD also supports. So imagine my frustration when I found that the fans turned on and stayed on! I spent the better part of a day trying to figure how to fix this in software (OpenBSD was able to see the temperature but had no idea what it was doing with the fan) and finally concluded that it is some proprietary controller which I won’t be able to control through OpenBSD.
I was doomed to listen to those damn fans, forever!

/faceplam
Or was I?…
The box has plenty of room for an Arduino Pro Mini and some electronics. I had the required parts lying around and put together a fan speed controller and temperature sensor in under an hour. You can too! Here is what you need:
- Arduino Pro Mini (5V)
- 10K Thermistor
- 10K Ohm resistor
- Wire
- Soldering iron & solder
- Electrical tape
Step 1 – Tap in to Steelhead power
The Arduino requires 5v to run, which luckily is what powers USB. So we can tap in to the 5v of the USB to power the Arduino. Here are the pins you need to tap in to.

Pull 5v from these pins.
You will notice that these are the same pins which are powering your USB drive for booting the SH. Unfortunately, the other USB pins on the same header are not working, so splicing in to the existing one required.
Step 2 – Upload code to Arduino
Download the code and upload it to the Arduino.
Step 3 – Wiring the Arduino
Each fan has 4 wires. The yellow one is used to control the speed, so cut this wire (leaving the other 3 still plugged in to the board) and strip the end, you will need to solder some wire on to the end to extend the length. Then solder the other end to pins 3, 6, and 9 (one for each fan) in any order on the Arduino.
- Solder the thermistor to +5V/VCC and Analog pin 0.
- Solder the 10K resistor to ground and Analog pin 0.
Make sure the thermistor wires are long enough so you can nestle it between the two heat sinks so that it will read the temperature of the CPU and north-bridge as accurately as possible.
Step 3 – Test
The code has a built-in testing feature which will simulate the temperature rising and falling steadily. The serial monitor will also show you the current temperature and the fan states which is useful for debugging.
Once all is tested and working, be sure to tape up the Arduino so that there are no exposed metal surfaces and then put everything back together.
Fin!
December 23, 2017 at 11:47 pm
Hey.
Thank you for your project! It’s inspiring.
There is a question.
What duty cycle of PWM pulses should be at room temperature? (25-28 degrees Celsius).
I start pulses only after heating the thermistor.
I use arduino pro mini with ebay, something like this: https://www.ebay.com/itm/310568454961
with respect!
fafhrd
December 27, 2017 at 6:16 pm
sorry
I fixed a prolem.
I was wrong.
February 24, 2018 at 2:11 am
Or Control fan via Software 🙂 Don’t ask
setup_minnow_fans()
{
(
cd /sys/devices/pci0000:00/0000:00:1f.3/i2c-0/0-002e/
chmod +w *
for i in 1 2 3; do
echo 2500 > fan${i}_min
echo 100 > pwm${i}_auto_point1_pwm
# Listen to all temp inputs, not just CPU
echo 7 > pwm${i}_auto_channels_zone
done
# Fan settings based on CPU temp
echo 55000 > zone1_auto_point1_temp
echo 75000 > zone1_auto_point2_temp
echo 80000 > zone1_auto_point3_temp
# Fan settings based on SIO temp
echo 42000 > zone2_auto_point1_temp
echo 52000 > zone2_auto_point2_temp
echo 62000 > zone2_auto_point3_temp
# Fan settings based on LAN
echo 47000 > zone3_auto_point1_temp
echo 57000 > zone3_auto_point2_temp
echo 67000 > zone3_auto_point3_temp
February 25, 2018 at 9:11 pm
Fantastic!!! I will need to try this out. I won’t the ability to for a few months but will update once I do so.
Is this something which is run only one? or does the function need to be executed at every boot?
October 31, 2020 at 11:06 am
Looks like this is incomplete code. Do you have the rest?
November 3, 2018 at 4:12 am
Your schematic has the thermistor between +5v and A0, but your writeup has thermistor between ground and A0.
The schematic is the correct arrangement, correct? (I imagine the intent is a voltage divider the A0 pin reads).
November 7, 2018 at 8:08 am
Yes, the schematic is correct. Thanks for catching that. I have updated the blog to reflect the schematic.
May 22, 2019 at 12:55 am
Hola que buen proyecto, tengo un proyecto similar pero en mi caso el thermistor no es de 10K si no que es de 2K, en este caso que modificaciones debo hacer al código para que el sistema funcione correctamente?…Gracias.
October 31, 2020 at 10:58 am
A 2K resistor should be fine
July 14, 2019 at 1:50 am
Not working with Arduino Pro Micro
The temperature sensor is detected and show correct temperature but fan speed don’t work (fans keeps full speed)