Automatic 4-channel pwm PC fan controller.
How to make “Automatic 4-channel quiet pwm PC fan controller.” With optional programmable RGB LED display.
Arduino 4-channel automatic fan controller with programmable RGB LED strip
I received an new Antec 902 case with tons of air flow but the unit came with these intensely bright blue LED 2-wire fans. These fans while not particularly loud themselves, were just noisy enough to force me to turn up my volume excessively when watching movies. This wasn’t considerate to the rest of the household as I’m the only nite-owl. Not to mention the ultra bright LEDs glaring over the movies of a darkened room, not cool.
So to remedy this I made a 4-channel automatic pwm fan controller using an Arduino UNO, LCD Smartie, Sensor Bridge (an add-on for LCD Smartie).
Here’s how I did it:
Novice Help: How to wire up a fan to be controlled by an Arduino.
Hardware:
You can grab the Fritzing file for this here.
Or if you intend to make/order a PCB, snag the whole Fan Controller archive to get the Gerber files too.
Please note: The 2-Ohm resistors and the 1000mf capacitors are optional, but they really do help a LOT to make PWM’d fans quiet. You will need heat-sinks if you do include them. Alternatively, you can omit the 2-Ohm resistors and replace the TIP120′s with TIP31′s, for they have a higher internal resistance. However, all the heat dissipation will then depend entirely upon the heat-sink/air-flow.
For anyone that would like to know more about controlling 3 or 4-wire fans click here. Otherwise read on…
Software:
I use LCDsmartie to send data to my Arduino UNO via usbSerial link:
- Get/extract LCD Smartie (it just runs from the place you extracted it to).
- Get an add-on for it called “Sensor Bridge” extract it to the LCD Smartie/plugins/ folder. If it gives you trouble running it, just read the forum for advice.
- Inside LCD Smartie select the display plugin: testdriver.dll
- Set the COM port your Arduino uses. (Mine is COM5) ie, I use the init string of: COM5,115200,8,N,1
- Just to the left of the init string box there is a vertical tab called ‘Screen’, set the ‘LCD size’ to 1×40.
- Close the program. This frees the com port so we can upload the sketch.
Grab a copy of the sketch here.
Unzip it. There should be 3 files:
- SA4chanFCv4.ino - were the options are for you to play with.
- addLEDstrip.ino – this is an optional file for playing with programmable RGB LED light strips. (Colors and intensity are temperature responsive.)
- program.ino – the actual program that does the work.
Don’t want the LED stuff, its just junk to you? No, problem. Just throw it out! (delete the file)
Open the SA4chanFCv4.ino file in your Arduino IDE tweak as needed and upload.
Now lets get this show on the road.
Remember the folder that you extracted the SensorBridge.dll plugin into? Look at it again. Since we ran LCD Smartie once already, SensorBridge made a log file called SBReport.txt, the lines were interested in are the ones that start with ‘Command : ‘ followed by something like: $dll(SB,3,0,0.00) its these entries we need to use later.
Open it and you’ll see the list of the sensors it found in your PC. Will need this info later, so keep it open for now.
Almost done:
Fire up LCD Smartie again, this time lets put it to work…
The Arduino sketch indexes the numbers by using the preceding lowercase letter, records the data sent, then validates the end of entry by looking for the next alphabetical letter to cap it off. Then repeats until the serial buffer is empty.
In the setup screen under Screen settings in the long text box put, an lowercase a followed (no spaces anywhere) by one of those $dll(SB,#,#,0) entries, follow that with the subsequent lowercase letter, in this example its a b so a chain of these would look like:
a$dll(SB,3,0,0)bb$dll(SB,2,9,0)cc$dll(SB,2,10,0)dd$dll(SB,2,11,0)e
For me I used:
a$dll(SB,5,0,0)bb$dll(SB,3,9,0)cc$dll(SB,1,10,0)dd$dll(SB,1,11,0)ee$dll(SB,9,0,0)ff$dll(SB,9,2,0)gg$dll(SB,3,5,0)hh$dll(SB,3,6,0)ii$dll(SB,3,7,0)jj$dll(SB,3,8,0)k
My layout: aGPUtempbbCPUtempccVregTempddSysTempeeHD0TempffHD1TempggCore0TemphhCore1TempiiCore2TempjjCore3Tempk
That’s it. Hook up your fans. From here on out its just a matter of tweaking the sketch.
Although its easy to change, just remember; By default the Arduino sketch is looking for data in the order of GPUtemp, CPUtemp, VregTemp, SysTemp, HD0Temp, HD1Temp, Core0Temp, Core1Temp, Core2Temp and Core3Temp.



