ChilledPi - Keep your Raspberry Pi cool with a fan
Nobody likes it when computers overheat, especially when you venture into the realms of over-clocking!

So we thought it would be great if you could setup a fan for a Raspberry Pi to work the same way they do in a laptop, turning on when it gets too hot and turning off again when it is sufficiently cooled.
We have a drive control board, PicoBorg, which should be plenty capable of driving a PC style fan, and a small fan suitable for the task.
The result was ChilledPi.py, a Python script which reads the current processor temperature and controls PicoBorg appropriately:
Here's the code, you can download the ChilledPi script file as text here
Save the text file on your pi as ChilledPi.py
Make the script executable usingchmod +x ChilledPi.py
and run usingsudo ./ChilledPi.py
If you also want to monitor the temperature of your Raspberry Pi check out our How hot is my Pi? script.
#!/usr/bin/env python
# coding: latin-1
# Import libary functions we need
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
import time
# Set which GPIO pins the drive outputs are connected to
DRIVE_1 = 4
DRIVE_2 = 18
DRIVE_3 = 8
DRIVE_4 = 7
# Set all of the drive pins as output pins
GPIO.setup(DRIVE_1, GPIO.OUT)
GPIO.setup(DRIVE_2, GPIO.OUT)
GPIO.setup(DRIVE_3, GPIO.OUT)
GPIO.setup(DRIVE_4, GPIO.OUT)
# Map the on/off state to nicer names for display
dName = {}
dName[True] = 'ON '
dName[False] = 'OFF'
# Function to set all drives off
def MotorOff():
GPIO.output(DRIVE_1, GPIO.LOW)
GPIO.output(DRIVE_2, GPIO.LOW)
GPIO.output(DRIVE_3, GPIO.LOW)
GPIO.output(DRIVE_4, GPIO.LOW)
# Setup for processor monitor
lProcessorFans = [DRIVE_1] # List of fans to turn on when processor is too hot
pathSensor = '/sys/class/thermal/thermal_zone0/temp' # File path used to read the temperature
readingPrintMultiplier = 0.001 # Value to multiply the reading by for user display
tempHigh = 37000 # Reading at which the fan(s) will be started (same units as file)
tempLow = 33000 # Reading at which the fan(s) will be stopped (same units as file)
interval = 1 # Time between readings in seconds
try:
# Start by turning all drives off
MotorOff()
raw_input('You can now turn on the power, press ENTER to continue')
fansOn = False
while True:
# Read the temperature in from the file system
fSensor = open(pathSensor, 'r')
reading = float(fSensor.read())
fSensor.close()
# Adjust fan(s) depending on current status
if fansOn:
if reading <= tempLow:
# We have cooled down enough, turn the fans off
for fan in lProcessorFans:
GPIO.output(fan, GPIO.LOW)
fansOn = False
else:
if reading >= tempHigh:
# We have warmed up enough, turn the fans on
for fan in lProcessorFans:
GPIO.output(fan, GPIO.HIGH)
fansOn = True
# Print the latest reading and the current state of all 4 drives
print '%02.3f %s %s %s %s' % (reading * readingPrintMultiplier, dName[GPIO.input(DRIVE_1)], dName[GPIO.input(DRIVE_2)], dName[GPIO.input(DRIVE_3)], dName[GPIO.input(DRIVE_4)])
# Wait a while
time.sleep(interval)
except KeyboardInterrupt:
# CTRL+C exit, turn off the drives and release the GPIO pins
print 'Terminated'
MotorOff()
raw_input('Turn the power off now, press ENTER to continue')
GPIO.cleanup()

