diff options
author | Matt Kohls <mattkohls13@gmail.com> | 2018-06-17 16:03:00 -0400 |
---|---|---|
committer | Matt Kohls <mattkohls13@gmail.com> | 2018-06-17 16:03:00 -0400 |
commit | dd45d017cf6d256acafccf17953b26d2ffaa0cb6 (patch) | |
tree | ffd7c79ce02a6b4f4a2922683922aaa936b275b2 | |
parent | 60ead3fadb1bac2e79b54be885bf1b3a15674b1e (diff) | |
download | rpi-temp-control-dd45d017cf6d256acafccf17953b26d2ffaa0cb6.tar.gz rpi-temp-control-dd45d017cf6d256acafccf17953b26d2ffaa0cb6.tar.bz2 rpi-temp-control-dd45d017cf6d256acafccf17953b26d2ffaa0cb6.zip |
Adding in comments and reworking how temp is read from CPU
-rw-r--r-- | README.md | 40 | ||||
-rw-r--r-- | rpi-temp-control.py | 22 |
2 files changed, 50 insertions, 12 deletions
diff --git a/README.md b/README.md new file mode 100644 index 0000000..d88c3ff --- /dev/null +++ b/README.md @@ -0,0 +1,40 @@ +# rpi-temp-control + +A temperature monitor and control program for the Raspberry Pi's CPU. This is done by monitoring the reported temperature +of the combined CPU and GPU package, which is fed into a PID loop that controls the speed of a fan mounted above it. + +I wrote this so my Pi would be quite when it is doing simple tasks, but would be able to enable a fan to cool the CPU +when I need to compile things or surf the web. + +# Using + +To run this program, you are going to need root privileges but can be run by simply entering + +``` +# python rpi-temp-control.py +``` + +This will leave the program running forever, and you should notice the fan changing speed as the Pi gets warmer and +cooler. At some point I will turn this into a proper daemon service that can be setup and forgotten about. + +There are only a couple of things that should be noted when using this, first that you need to connect a fan to the Pi +in a safe way. You should NOT drive the fan from the gpio pins on the Pi directly, but instead the pin that this +program controls should be some sort of enable line on either a power transistor or motor control board. The second +thing is that this program is writing a pwm signal to that pin, which means the fan is really turning on and off quickly +and may make not allow this program to work with motor controllers that use other methods to control motor speed. Also +be aware that there is probably a minimum speed (or pulse rate) that the fan will work at, so the minimum fan speed +may need to be tweaked because of that. + +Please don't expect this to solve all overheating issues your Pi may experience, this just a dumb PID loop. Really any +Raspberry Pi 3 (at least in my experience) should have at least a heatsink on their CPU to help with limiting when +thermal throttling will happen. A case or mounting for a fan should have enough airflow for the fan so it won't burn out +the motor, but if the air the fan is moving across the CPU will limit how cool it can make the CPU. +# Copyright and License + +2018 Matt Kohls +GPL v3 + +Based on the work by [rudybrian](https://github.com/rudybrian/PID_Fan_Control) + +This program is distributed in the hope it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty +of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
\ No newline at end of file diff --git a/rpi-temp-control.py b/rpi-temp-control.py index d99824a..fb7f0aa 100644 --- a/rpi-temp-control.py +++ b/rpi-temp-control.py @@ -3,11 +3,14 @@ ## # rpi-temp-control # -# +# Changes speed of system fan to try and control the CPU/GPU temperature. This is done through the use of a PID loop +# that is targeting a specific temperature. # # Matt Kohls +# 2018 +# +# Licensed under GPL v3 -import subprocess from gpiozero import Motor from pid import PID from time import sleep @@ -22,14 +25,10 @@ MIN_FAN_SPEED = 80 / 100 # # @return temperature of GPU/CPU def grab_temp(): - try: - file = open("/sys/class/thermal/thermal_zone0/temp", "r") + val = 0 + with open("/sys/class/thermal/thermal_zone0/temp", "r") as file: val = int(file.readline()) / 1000 - file.close() - return val - except: - print("Error reading from thermal zone") - return 0 + return val # Initial loop setup ploop = PID(1, 1, .02, Integrator_max=100, Integrator_min=0, Set_Point=TEMP_TARGET) @@ -42,9 +41,8 @@ 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 + cycle_change = ploop.update(temp) + cycle = (100 - int(cycle_change)) / 100 # Since fan.forward() wants a number between 0 and 1 if cycle <= .2: cycle = 0 |