Lüftersteuerung Raspberry Pi

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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert