Nano Fan Controller

This device is a fan controller that you can put in your computer case to keep the temperature of the air inside it under control, for a cooler and quieter operation. It can be powered by a single fan header on the motherboard and it controls up to 3 independent fans (more if you have splitters).

The device

Schematic

Schematic for Nano Fan Controller

A few notes:

  • You can build the device on a breadboard or on a PCB. The specs recommend AWG26 wiring
  • You can connect the device to both 12V and USB simultaneously. This makes configuration much simpler
  • The diode in front of VIN has 2 functions:
    • Drops the 12V input to about 11.5V, which is better for the VRM on the Arduino Nano
    • Prevents damage to the motherboard and power supply if you connect the USB while the PC is powered off
  • Make sure to connect the fans BEFORE the diode, not after it
  • Don't worry about connecting multiple fans to a single fan header, they're designed to handle a sustained load of at least 1A and up to 2.2A for 1 second. A fan typically draws 0.2A
  • The device does not measure RPM, nor does it report anything to the motherboard

Software

Project files: Download from here | Browse GitHub repository

To flash the device, load the project in Arduino IDE, connect your Arduino Nano, and upload the sketch.

For an explanation on how the device generates the proper PWM signals, see this article.

Configuration

The device can be easily configured with some serial commands. Settings are stored in the internal EEPROM. Go to Tools > Serial Monitor to begin.

Here's a list of commands:

  • p : prints the current status:
    • Raw: raw 10-bit sensor reading
    • Temp: measured temperature (raw/SENSOR_CALIBRATION)
    • Fan1: duty% of Fan 1
    • Fan2: duty% of Fan 2
    • Fan3: duty% of Fan 3
  • g : prints the current configuration as a bunch of numbers:
    • SENSOR_CALIBRATION: change this if the measured temperature is incorrect. Lower means higher temperature, higher means lower temperature. Default: 7.55
    • TEMP_MIN_1: the temperature at which Fan 1 turns on. Default: 30.0
    • TEMP_MAX_1: the temperature at which Fan 1 runs at full speed. Default: 50.0
    • CURVE_1: the curve for Fan 1. Lower values make the fan spin faster earlier, higher values make the fan spin faster later. Default: 0.7, Minimum: 0.0
    • TEMP_MIN_2: the temperature at which Fan 2 turns on. Default: 30.0
    • TEMP_MAX_2: the temperature at which Fan 2 runs at full speed. Default: 50.0
    • CURVE_2: the curve for Fan 2. Lower values make the fan spin faster earlier, higher values make the fan spin faster later. Default: 0.85, Minimum: 0.0
    • TEMP_MIN_3: the temperature at which Fan 1 turns on. Default: 30.0
    • TEMP_MAX_3: the temperature at which Fan 1 runs at full speed. Default: 55.0
    • CURVE_3: the curve for Fan 1. Lower values make the fan spin faster earlier, higher values make the fan spin faster later. Default: 0.75, Minimum: 0.0
  • s config : sets a new configuration for the device. config is a string of numbers separated by a space like the one outputted by the g command above
  • M temp : ignores the temperature sensor and pretends that the measured temperature is temp. Useful for testing. The device does not store this setting
  • m : returns control of the temperature to the sensor
  • D and d: turns debug mode on/off. The device remembers this setting
  • R: reboots the device

Once you're done setting up the device, you can unplug the USB cable. Remember to turn off debug mode if you enabled it.

License

The project is licensed under the GNU GPL v3 license

Share this article

Comments