first commit

This commit is contained in:
2026-04-01 10:47:17 +02:00
parent 3e6dcd7200
commit e154348dd7
3 changed files with 190 additions and 0 deletions

94
fanctrl.py Normal file
View File

@@ -0,0 +1,94 @@
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()