95 lines
2.4 KiB
Python
95 lines
2.4 KiB
Python
import RPi.GPIO as GPIO
|
|
import signal
|
|
import sys
|
|
from gpiozero import CPUTemperature
|
|
import time
|
|
from pathlib import Path
|
|
import configparser
|
|
|
|
|
|
|
|
# initializing GPIO, setting mode to BOARD.
|
|
# Default pin of fan is physical pin 8, GPIO14
|
|
Fan = 8
|
|
GPIO.setwarnings(False)
|
|
GPIO.setmode(GPIO.BOARD)
|
|
GPIO.setup(Fan, GPIO.OUT)
|
|
|
|
def handle_exit(signum, frame):
|
|
print(f"Signal {signum} received, setting fan to 100%")
|
|
p.ChangeDutyCycle(100)
|
|
time.sleep(0.5) # waiting to ensure that PWM is set
|
|
p.stop()
|
|
GPIO.cleanup()
|
|
sys.exit(0)
|
|
|
|
#initialize GPIO
|
|
p = GPIO.PWM(Fan, 50)
|
|
p.start(0)
|
|
|
|
signal.signal(signal.SIGTERM, handle_exit)
|
|
signal.signal(signal.SIGINT, handle_exit) # optional (Ctrl+C)
|
|
|
|
def read_config():
|
|
confparser = configparser.ConfigParser()
|
|
f = Path("/boot/config.txt")
|
|
if f.is_file():
|
|
confparser.read('/boot/config.txt')
|
|
else:
|
|
f = Path('/boot/firmware/config.txt')
|
|
if f.is_file():
|
|
confparser.read('/boot/firmware/config.txt')
|
|
|
|
|
|
return confparser
|
|
confparser = read_config()
|
|
|
|
def parse_config():
|
|
confparser = read_config()
|
|
stages= []
|
|
|
|
stage0_temp = float(confparser['fan']['fan_temp0_temp'])
|
|
stage0_speed = float(confparser['fan']['fan_temp0_speed'])
|
|
stage1_temp = float(confparser['fan']['fan_temp1_temp'])
|
|
stage1_speed = float(confparser['fan']['fan_temp1_speed'])
|
|
stage2_temp = float(confparser['fan']['fan_temp2_temp'])
|
|
stage2_speed = float(confparser['fan']['fan_temp2_speed'])
|
|
|
|
stages.append({'temp': stage0_temp,'speed': stage0_speed})
|
|
stages.append({'temp': stage1_temp,'speed': stage1_speed})
|
|
stages.append({'temp': stage2_temp,'speed': stage2_speed})
|
|
return stages
|
|
|
|
stages = parse_config()
|
|
print(f'stages={stages}')
|
|
try:
|
|
stage= oldstage = 0
|
|
print(f'stage={stage}')
|
|
while True:
|
|
cpu = CPUTemperature()
|
|
temperature = cpu.temperature
|
|
|
|
#print(f'temperature={temperature}/{temp}')
|
|
|
|
if temperature < stages[0]['temp']:
|
|
stage = 0
|
|
elif temperature > stages[1]['temp'] and temperature < stages[2]['temp']:
|
|
stage = 1
|
|
elif temperature > stages[2]['temp']:
|
|
stage = 2
|
|
|
|
if stage != oldstage:
|
|
oldstage = stage
|
|
print(f'stage={stage},temperature={temperature}°C')
|
|
p.ChangeDutyCycle(stages[stage]['speed'])
|
|
|
|
time.sleep(0.2)
|
|
except KeyboardInterrupt:
|
|
pass
|
|
finally:
|
|
# ensure on exit that fan runs full speed
|
|
p.ChangeDutyCycle(100)
|
|
p.stop()
|
|
GPIO.cleanup()
|
|
|