aboutsummaryrefslogtreecommitdiffstats
path: root/rpi-temp-control.py
diff options
context:
space:
mode:
Diffstat (limited to 'rpi-temp-control.py')
-rw-r--r--rpi-temp-control.py60
1 files changed, 60 insertions, 0 deletions
diff --git a/rpi-temp-control.py b/rpi-temp-control.py
new file mode 100644
index 0000000..d99824a
--- /dev/null
+++ b/rpi-temp-control.py
@@ -0,0 +1,60 @@
+#!/usr/bin/env python3
+
+##
+# rpi-temp-control
+#
+#
+#
+# Matt Kohls
+
+import subprocess
+from gpiozero import Motor
+from pid import PID
+from time import sleep
+
+# Defaults
+TEMP_TARGET = float(47.0)
+FAN_PIN = 17 # Pin the fan control is tied to
+DUMMY_PIN = 18 # Any unused pin. Used to setup Motor from gpiozero
+MIN_FAN_SPEED = 80 / 100
+
+## Grabs Temperature of GPU/CPU
+#
+# @return temperature of GPU/CPU
+def grab_temp():
+ try:
+ file = open("/sys/class/thermal/thermal_zone0/temp", "r")
+ val = int(file.readline()) / 1000
+ file.close()
+ return val
+ except:
+ print("Error reading from thermal zone")
+ return 0
+
+# Initial loop setup
+ploop = PID(1, 1, .02, Integrator_max=100, Integrator_min=0, Set_Point=TEMP_TARGET)
+cycle = 1
+fan = Motor(FAN_PIN, DUMMY_PIN)
+fan.forward(cycle)
+last_duty_cycle = 0
+last_temp = 0
+
+while True:
+ sleep(1)
+ temp = grab_temp()
+ print(temp)
+ cycle_change = (ploop.update(temp)) * -1
+ cycle = (100 + int(cycle_change)) / 100 # Since fan.forward() wants a number between 0 and 1
+
+ if cycle <= .2:
+ cycle = 0
+ elif cycle > 1:
+ cycle = 1
+ elif cycle < MIN_FAN_SPEED:
+ cycle = MIN_FAN_SPEED
+
+ if cycle == 0:
+ fan.stop()
+ elif last_duty_cycle != cycle:
+ fan.forward(cycle)
+ last_duty_cycle = cycle \ No newline at end of file