Vor einiger Zeit hatte ich einen Beitrag über meinen Retropie geschrieben, welchen ich in einer Kiste verbaut hatte. Besagter Pi ist von der 4 Version. Hier soll die Wärmeentwicklung höher liegen als bei vorherigen Versionen. Die Kiste und die Spiele, die per Emulator gestartet werden, sorgen für eine höhere Wärmeentwicklung. Zuerst hatte ich einfache Kühlkörper auf den Chips kleben, die ich nun mit einem größeren Körper mit Lüfter ausgetauscht habe. Das Lüfter Kit* habe ich bei Amazon bestellt und kostet knappe 10€. Für die Spannungsversorgung wird ein 5V bzw 3.3V GPIO verwendet. Dabei läuft der Lüfter dauerhaft und trägt somit etwas zur Geräuschkulisse bei. Bei 5V selbstverständlich mehr als bei 3.3V, aber die Kühlleistung ist bei 5V dementsprechend auch höher. Allerdings wollte ich nicht, dass der Lüfter sich dauerhaft dreht und habe eine kleine Lüftersteuerung eingebaut. Für die Steuerung verwende ich einen Transistor, der den Stromkreis zum Lüfter schließt, sobald der Transistor über einen steuerbaren GPIO ein Signal bekommt.

Die Schaltung ist somit vollständig und wir können uns ans Programmieren wagen. Ich habe Python verwendet, es können allerdings auch andere Sprachen genommen werden. Den Quellcode habe ich in den Kommentaren erklärt. Da ich nicht wollte, dass der Lüfter in kurzen Intervallen seinen Status ändert (aus, an), habe ich eine Mindestlaufzeit des Lüfters von 10 Minuten integriert.
try:
#versuche benötigte Module zu laden
import gpiozero
from time import sleep
from datetime import datetime
from datetime import timedelta
except:
# springe raus, wenn erforderliche Module nicht vorhanden sind
print("failed to load module")
exit()
# Schwellenwert
THRESHOLD = 35 #70
# Schlafzeit
SLEEP = 10
# benutzter GPIO
GPIO = 26
# Helfervariable
STARTED = None
#Funktion zur Temperaturüberprüfung.
# gibt die Temperatur zurück
def check_temperature():
cpu = gpiozero.CPUTemperature()
# gib die aktuelle Temperatur zurück
return cpu.temperature
# main Funktion
if __name__ == "__main__":
# initialisiere den GPIO
led = gpiozero.LED(GPIO)
while True:
# hol die Temperatur und schreibe diese in temp
temp = check_temperature()
# gebe temp aus
print(temp)
# wenn temp größer gleich der Schwellenwert ist und STARTED den Status None hat
if int(temp) >= THRESHOLD and not STARTED:
# Setze den aktuellen Zeitstempel als STARTED
STARTED = datetime.now()
# schalte den GPIO an
led.on()
print("Fan not active and above Threshold, switch on")
# wenn STARTED ist nicht None
if STARTED:
''' Wenn der Zeit Stempel in STARTED + 10Min
kleiner als dem jetzigen Zeit Stempel ist
und die Temperatur kleiner gleich dem Schwellenwert ist
'''
if STARTED + timedelta(minutes=10) <= datetime.now() and int(temp) <= THRESHOLD:
# setze STARTED = None
STARTED = None
# schalte den GPIO aus
led.off()
print("Fan active and underneath Threshold, switch off")
# warte angegebene Zeit für die nächste Ausführung
sleep(SLEEP)
Falls nötig, installiert folgende Module mit:
sudo apt update sudo apt python3-pip sudo pip3 install RPi.GPIO sudo pip3 install gpiozero
Lüftersteuerung als Service
Bisher muss der Code selbstständig ausgeführt werden, damit die Lüftersteuerung aktiviert ist. Da ich mir das ganze ersparen wollte, habe ich die Lüftersteuerung in systemd als neuen Service integriert. Dafür legt eine neue Datei in /etc/system.d/system/ an. Ich habe meine fancontrol.service genannt.
[Unit] Description=fancontrol Python After=network.target [Service] ExecStart=/usr/bin/python3 -u fancontrol.py WorkingDirectory=/home/pi/scripts StandardOutput=inherit StandardError=inherit Restart=always User=pi [Install] WantedBy=multi-user.target
Der Print-Output vom Script wird dabei von systemd in die Syslog geschrieben. Nun könnt ihr den Service mit systemctl stoppen, starten und überprüfen.
Eigenhändig könnt ihr den Service nun wie folgt starten:
sudo systemctl start fancontrol.service
Das Stoppen sieht ähnlich aus:
sudo systemctl stop fancontrol.service
Beim Überprüfen des Status gibt es noch eine Ausgabe über den aktuellen Zustand und in diesem Fall auch die Python Print Ausgabe.
sudo systemctl status fancontrol.service
● fancontrol.service - fancontrol Python
Loaded: loaded (/etc/systemd/system/fancontrol.service; disabled; vendor preset: enabled)
Active: active (running) since Sat 2021-01-02 22:18:38 GMT; 1min 35s ago
Main PID: 2568 (python3)
Tasks: 1 (limit: 4915)
CGroup: /system.slice/fancontrol.service
└─2568 /usr/bin/python3 -u fancontrol.py
Jan 02 22:18:49 retropie python3[2568]: 34.563
Jan 02 22:18:59 retropie python3[2568]: 34.076
Jan 02 22:19:09 retropie python3[2568]: 36.511
Jan 02 22:19:09 retropie python3[2568]: Fan not active and above Threshold, switch on
Jan 02 22:19:19 retropie python3[2568]: 36.511
Jan 02 22:19:29 retropie python3[2568]: 34.563
Jan 02 22:19:39 retropie python3[2568]: 35.05
Jan 02 22:19:49 retropie python3[2568]: 35.537
Jan 02 22:19:59 retropie python3[2568]: 34.563
