place fan_control.service in /etc/systemd/system and then:
$ sudo systemctl enable fan_control
$ sudo systemctl start fan_control
import wiringpi | |
import time | |
from subprocess import PIPE, Popen | |
def init_fan(): | |
wiringpi.pwmSetMode(0) # PWM_MODE_MS = 0 | |
wiringpi.wiringPiSetupGpio() | |
wiringpi.pinMode(18, 2) # pwm only works on GPIO port 18 | |
wiringpi.pwmSetClock(6) # this parameters correspond to 25kHz | |
wiringpi.pwmSetRange(128) | |
def fan_set(percent): | |
wiringpi.pwmWrite(18, int((percent/100.0)*128)) | |
def get_cpu_temperature(): | |
"""get cpu temperature using vcgencmd""" | |
process = Popen(['vcgencmd', 'measure_temp'], stdout=PIPE) | |
output, _error = process.communicate() | |
return float(output[output.index(b'=') + 1:output.rindex(b"'")]) | |
desired_temperature = 52.0 | |
fan_speed = 100 | |
sum = 0 | |
p_temp = 15 | |
i_temp = 0.4 | |
def get_fan_speed(actual_temperature): | |
global fan_speed,sum | |
diff = actual_temperature - desired_temperature | |
sum = sum + diff | |
pDiff = diff * p_temp | |
iDiff = sum * i_temp | |
fan_speed = pDiff + iDiff | |
if fan_speed > 100: | |
fan_speed = 100 | |
if fan_speed < 10: | |
fan_speed = 0 | |
if sum > 100: | |
sum = 100 | |
if sum < -100: | |
sum = -100 | |
return fan_speed | |
init_fan() | |
control = 0 | |
while True: | |
temp = get_cpu_temperature() | |
control = get_fan_speed(temp) | |
fan_set(control) | |
# print(control, temp) | |
time.sleep(1) |
[Unit] | |
Description=PWM fan control | |
After=network.target | |
[Service] | |
ExecStart=/usr/bin/python3 fan_control.py | |
WorkingDirectory=/home/pi/bin | |
StandardOutput=inherit | |
StandardError=inherit | |
Restart=always | |
User=root | |
[Install] | |
WantedBy=multi-user.target |