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