Lüftersteuerung Raspberry Pi

Hello everyone,

today we would like to present you the first contribution of one of our new authors - Wilfried Klaas.

Wilfried Klaas will accompany us with interesting projects from now on!

Have fun reading!

With my Raspberry Pi NAS solution with OpenMediaVault I came across the problem that the fan built into the case is running day and night. The fan is a small 30mm 5V DC fan, but it is quite loud and it whistles quite high frequency. So a temperature control is needed. The temperature of the CPU in the Raspberry Pi can be read out directly. A separate temperature sensor is therefore superfluous. One would have to...


The plan

You would have to switch the fan directly via a GPIO pin with the help of a small piece of software. The program reads the CPU temperature and switches the fan on and off. The operating system should then periodically start the program.

Required hardware

Hardware list (next to the Raspberry Pi and the housing with fan):

Number Component Annotation
1 Transistor type BC547 B
1 Resistance 4K7 Ohm
1 Small piece of circuit board
5 Pinheader
A couple of Breadboard cables


The structure

The GPIO pins of the Raspberry Pi have 3V3 logic and cannot switch the power of even such a small fan directly. Therefore a switching amplifier is needed. Fortunately, this is quite easy to realize with a NPN transistor of type BC547 B.



For testing you can also build the whole thing on the breadboard first. Red goes to +5V (pin 4) on the GPIO. Black (GND or ground) goes to pin 6 and orange, which is the control line, goes to pin 8 (GPIO14). On the fan side, the red wire from the fan goes directly to the +5V and the black goes to pin 1 from the transistor.



To test if the setup works, connect the orange wire directly to +5V instead of pin 8 (GPIO 14). Now the fan should start. If you connect the same wire to ground, the fan should stop for sure. What happens if the line stays open is not defined. The small circuit can then be quickly built on breadboard and plugged into the Raspberry Pi.




So much for the hardware.

The software

Since Python is already installed on the current Raspbian operating system image for the Raspberry Pi and also on the OMV image, it makes sense to write the program in Python. There are plenty of resources and instructions on the internet. The program originates from here: alexbloggt/lueftersteuerung/. I just updated to Python3, added some comments and adjusted the times to my needs.

#!/usr/bin/python
import os
import time
import RPi.GPIO as GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(14, GPIO.OUT)

#funktion: Temperatur mit Hilfe von vcgencmd auslesen und als Text zurückliefern
def getCPUtemperature():
    res = os.popen('vcgencmd measure_temp').readline()
    return(res.replace("temp=","").replace("'C\n",""))

# Temperatur lesen und in einen Float wandeln
temp_float = float(getCPUtemperature())

try:
    # temperatur > 47, dann Lüfter an
    if (temp_float > 47):
        print(temp_float)
        print("power on fan...")
        # ein
        GPIO.output(14, True)
        # und jetzt 58 Sekunden laufen lassen. (Das passt dann gut mit dem Minuten Timer)
        time.sleep(58)
        print("power off fan...")
        # aus
        GPIO.output(14, False)
        print(float(getCPUtemperature()))
    else:
        print(temp_float)
        print("temp low")

# Wird das Programm abgebrochen, dann den Lüfter wieder ausschalten
except KeyboardInterrupt:
    print(float(getCPUtemperature()))
    print("power off fan...")
    GPIO.output(14, False)
    print("cancelling...")
 

In the current version of Raspbian the module RPi.GPIO is part of the image. If you get an error message, e.g. with the Lite version, you can install RPi.GPIO in the terminal as follows:

sudo apt-get update
sudo apt-get install python3-rpi.gpio

Test

As mentioned in the beginning, my Raspberry Pi runs a NAS solution with OpenMediaVault (OMV). Therefore I describe here how to run the fan controller in this environment.

To be able to connect to the Raspberry Pi with a terminal, you first have to enable ssh (secure shell). This can be done via the OMV interface under Services/SSH.


Then the user must pi (if not already done) is to be added to the group ssh.


Now you can log in to the Raspberry via SSH. I use Putty for this under Windows If the login does not work, now would be a good time to reboot the Raspberry. From here on the steps will also work on a normal Raspbian image.

To log in to the Putty, use the user pi with the password you have set in the OMV interface. (Of course you can also use another user, but then you have to set the appropriate permissions in the different places for the whole thing to work).

Now first try out whether the prerequisites for the program work. So first try to read out the temperature. To do this, please enter the following:

vcgencmd measure_temp

pi@omv:~ $ vcgencmd measure_temp
temp=45.1'C
pi@omv:~ $

It looks good. Now the python connection. First you start Python.

sudo python


And now they try to start the fan with:

import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(14, GPIO.OUT)
GPIO.output(14, True)

The fan should run now.

With GPIO.output(14, False) Turn it off again.


You leave the Python interpreter in the terminal with exit()or CTRL-D. If everything worked, you can install the program and let it start automatically.

Installation

First you create a new directory. To do this, go back to the /home directory, create a fan directory there, and then change into it.

cd /home mkdir fan cd fan

The program is then created there. With

sudo nano fancontrol.py

The editor starts. Now copy the program from above, save (CTRL + S) and leave the editor (CTRL + X). With

sudo chmod +x fancontrol.py

the program is made executable.

sudo python fancontrol.py The program starts. Optionally, must also be directly /home/fan/fancontrol.py function.

So far so well, now the program has to be started automatically and once per minute. To do this, the crontab must be edited:

sudo crontab -e

Please write the following lines in the file

# starting the fan every minute
*/1 * * * * /home/fan/fancontrol.py
 

Do not forget to save and then reboot.

sudo reboot

And you are ready to go. Now every minute the Python script is started. This looks for the temperature and if it is too high, the fan is started for 58 seconds.

Lastly

The Raspberry now does its job almost without any noise. Only rarely the fan starts, mostly only when a backup of my server is running. Goal achieved. With a few adjustments, this Python program in the background is also suitable for the Raspberry Pi 4, which gets warmer due to its higher clock frequency and is therefore often equipped with a case fan.

Have fun with the rebuild.
I hope you enjoyed this little blog.

See you next time!

Wilfried Klaas



Projekte für anfängerRaspberry pi

25 comments

Hans

Hans

Okay ich komme leider nicht weiter.
Ich habe nun statt des BC547B nun einen 2N2222 genommen und einen 1/4W 10kOhm 1% (so steht es auf dem Päckchen) verwendet. Gleiche Schaltung. Jetzt sprint aber der Lüfter nicht mehr an. Vorher ist er zumindest angesprungen, lief aber vollkommen zu langsam und hatte spulenfiepen. Kann mir hier nochmal einer helfen? Wilfried hatte bereits vermutet, dass der Lüfter 120-150mA führt.

Danke im voraus

Hans

Hans

Moin moin Wilfried,
das Script war in soweit kein Problem. Bin selbst Softwareentwickler und habe schon öfter zu Python gegriffen. Daher hierzu nullos problemos ;-)

kannst du einen spezifischen mosfet empfehlen? brauche ich dann weiterhin nur nen widerstand davor oder ist dann auch eine diode notwendig ?

Wilfried Klaas

Wilfried Klaas

Halo Hans,
Moin moin,
Naja, die Schaltung ist für solche Lüfter nicht vorgesehen, die Lüfter sind für den kleinen Transistor viel zu Stromhungrig. 5V 120mm Lüfter haben eine Stromaufnahme im Durchschnitt von 120mA pro Stück. Der kleine BC schafft aber nur 100mA. Mich wundert, das er nicht direkt durchgebrannt ist.
Da müsste dann ein größerer Transistor als Endstufe her. Problem ist dann aber, das der mit den 3V3 der Pins ( und den sehr hohen Ausgangswiderstand, kleiner Strom) ausgesteuert werden müsste. Ergo müsste da eher ein Darlington oder besser ein MOSFET her. Eingängige Schaltungen gibt es im Internet. Oder man nimmt einfach eine kleine Relaisplatine.
Wegen dr Probleme beim Script kopieren. Das Peoblem sind die deutschen Umlaute. Die werden auf manchen Systemen nicht sauber kopiert. Einfach die entsprechenden Kommentare löschen. Dann läuft auch das Script.
Wilfried Klaas

Hans

Hans

Hallo zusammen,

ich habe diese Schaltung nachgebaut und wirklich auf jede Bezeichnung der Bauteile geachtet.
Selbst die Pins am Raspi sind komplett identisch.

Der eingesetzte Transistor ist: BC547B Transistor npn 45V 0,1A 0,5W TO92

Leider tritt in meinem Fall ein Spulenfiepen nun auf und die Lüfter drehen deutlich langsamer als ohne die Schaltung. Ich habe foglendes Gehäuse, was 2 5V Lüfter ja mit an bord hat: https://www.amazon.de/gp/product/B085ZZV66P/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&psc=1 . Die LEDs davon nutze ich nicht, sondern rein die Lüfter.

Wodurch kann das gefiepe ausgelöst werden und was ist hier mit der Drehzahl passiert ?

Christian

Christian

Hallo,
echt gute Anleitung! Schaltung funktioniert einwandfrei nur beim Programm habe ich leider auch eine Fehlermeldung bekommen:
" File “/home/fan/fancontrol.py”, line 9 SyntaxError: Non-ASCII character ‘\xc3’ in file /home/fan/fancontrol.py on line 9, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details"
Hab es direkt aus der Anleutung kopiert. Wo könnte der Fehler liegen?

Grüße aus Österreich

HJR

HJR

Hallo,
vielen Dank für die Anleitung. Da mein Raspi 4 schon im Normalbetrieb mit 67°C lief, habe ich sie nachgebaut. Funktioniert an sich problemlos. Der Lüfter lässt sich im Python-Interpreter schalten. Beim Programmaufruf: /home/fan/fancontrol.py erhalte ich allerdings eine Fehlermeldung
" File “/home/fan/fancontrol.py”, line 9 SyntaxError: Non-ASCII character ‘\xc3’ in file /home/fan/fancontrol.py on line 9, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details" -das Programm wurde unverändert kopiert. Wo liegt der Fehler??
Grüsse
HJR

Jürgen Kupreit

Jürgen Kupreit

Hallo, kann man recht einfach Testen ob der Pin 8 (Gpio 14) schaltet bzw. nicht defekt ist???
Habe die Schaltung nach gebaut, zum testen habe ich wie beschrieben den Orangen kabel statt an den Pin 8 (GPIO 14) direkt an +5V gesetzt und der Ventilator lief problemlos an….
mmmmh…..

Guido

Guido

Den Anschluss werde ich genau so machen, aber ich habe noch eine andere Lösung mit Overlays und der /boot/config.txt gefunden. Hier ein Ausschnitt aus der Doku:

Name: gpio-fan
Info: Configure a GPIO pin to control a cooling fan.
Load: dtoverlay=gpio-fan,=
Params: gpiopin GPIO used to control the fan (default 12)
temp Temperature at which the fan switches on, in
millicelcius (default 55000)

Quelle: https://github.com/raspberrypi/firmware/blob/master/boot/overlays/README

Frank

Frank

@Dirk Willner
Zur Frage :
> Warum das Rad neu erfinden?
Möchte ich sagen, dass wir hier doch viele Bastelanfänger sind. Hier geht es ums Lernen, nicht um fertige Lösungen zu kaufen. So sehr ich den Spruch manchmal Hasse, aber in diesem Fall ist der Weg das Ziel ;-)
Ich für meinen Teil werde die Lösung nachbauen, und gespannt sein, wie sie funktioniert. Meine Voraussetzung ist: RP4 incl Gehäuse und Lüfter gekauft, und dann erst festgestellt, dass die beiden Lüfter etwas nervig sind. Mit 20 Cent an Bauteilaufwand, bekomme ich so eine Auffrischung im Arbeiten mit Lötkolben, Programmierung und Transistor Arbeitsweisen.

Kleiner technischer Vorteil: Die gemessene Temperatur vom Python Script ist die relevante Core Temperatur, nicht die Temperatur der Umgebungsluft. Die kann schon seht stark variieren.

Uwe

Uwe

Hallo Martin,
an welcher Stelle genau muss die Code-Ergänzung eingetragen werden?

Martin

Martin

Am Code habe ich noch folgende Anpassungen gemacht damit der Lüfter nicht unnötig geschaltet wird:

Temperaturgrenzen
temp_max = 55
temp_min = 50 Aktiviere / Deaktiviere Lüfter
try:
if (temp_float > temp_max and not GPIO.input(14)):
GPIO.output(14, True)
elif(temp_float <= temp_min and GPIO.input(14)):
GPIO.output(14, False)
Uwe

Uwe

Hallo,
erst mal vielen Dank für die Anleitung.
Bevor ich anfange das nachzubauen, wollte ich fragen, ob ich für die Steuerleitung anstatt Pin 8 (GPIO14) auch jeden anderen Pin z. B. Pin 18 (GPIO24) nehmen könnte, da bei mir GPIO 14 schon anderweitig genutzt wird?

Reiner

Reiner

Bei mir wollte der Fan ebenfalls nicht anlaufen. Mit der angegebenen Schaltung schaltete der Transistor nicht durch. Ich habe dann den 4,7k Widerstand durch einen 5k Poti ersetzt und den Widerstand langsam heruntergedreht. Bei ca. 2k schaltete der Transistor durch. Jetzt läuft die Sache. Wie das anscheinend auch mit 4,7k funktioniert, ist mir ein Rätsel…
Ich habe allerdings zum Testen einen Raspi Zero benutzt, weil ich gerade keinen anderen Raspi frei hatte. Das sollte aber nach meiner Ansicht keinen Unterschied machen.

Bernd

Bernd

Ich mag ja solche Spielereien. Aber…

Das Teil soll ja neben dem Spaß einfach nur produktiv und leise sein. Warum überhaupt einen Lüfter?
Es gibt inzwischen wirklich tolle Gehäuse aus Metall, die die Wärme direkt an der CPU über das Gehäuse nach außen leiten. Ein Kandidat wäre z.B. das “Flirc Case” (Suchmaschine nutzen!).
Auch gibt es eine Firma, die Aluminiumgehäuse fräst (CNC) und diese Teile über die Website und ebay verkauft. In allen Fällen kostet ein solches Gehäuse 20 Euro.

Bei mir laufen 3 Raspberrys (2, 3 und ein 4er). Alle in einem solchen Metallgehäuse. Den Pi3 und Pi4 habe ich mal testweise über eine Stunde auf Volldampf gequält. Mehr als 62 Grad hat er nicht erreicht. Die 80 bzw. 85 Grad, wo er runtertaktet, erreicht er nicht mal ansatzweise.

Und was soll ich sagen. Alles ohne Lüfter.

Aber wie schon eingangs erwähnt, die Lüftersteuerung ist schon cool.

Wilfried Klaas

Wilfried Klaas

Hallo Jörg,

Schau mal auf den Transistor ob da wirklich BC547 B drauf steht. C wäre auch ok, beim A könnte es Probleme geben. Wenn du noch einen 10K hast, schalte die beiden Widerstände doch parallel. Der Wert ist relativ unkritisch, da wir den Transistor als Schalter betreiben, aber 10k könnten echt schon zuviel sein.

Jörg

Jörg

Hallo,
habe wohl irgendeinen Fehler in meiner Schaltung … jedenfalls funktioniert das Starten des Lüfters nicht.
Habe allerdings statt des 4,7k Ohm einen 10k Ohm Widerstand genommen, weil ich den hier liegen hatte. Kann es daran liegen?
Ansonsten finde ich die Blogs für Anfänger sehr interessant…

Gruß
Jörg

Jürgen

Jürgen

Ja, es gibt auch fertige Geräte z.B. Laptop oder Handy, da muss man nicht löten und keinen Lüfter einbauen ;-)
Da ich Phyton nicht kenne, habe ich nicht erkannt, dass “nur” ein/aus geschaltet wird.
Also, ganz laut/leise. PWM könnte Zwischenstufen machen, da Lüfter bei ca. 75% noch fast leise sind.

An meinem AnetA8 (China-3-Drucker) habe ich zwei Lüfter geopfert, weil ich nur 10% Lüftung eingestellt hatte. Die Lüfter sind nicht richtig rund gelaufen und abgeraucht.
Dann habe ich am ESP32, mit PWM den kleinen China-Lüfter getestet.
Nun glaube ich zu verstehen, langsam drehen und geringe Frequenzen sind bei Lüfter-PWM-Schaltung nicht gut (mit LED geht es). Die PWM-Einschaltflanke am Lüfter ist steil (=viel Strom.. induktiv). Die abfallende Flanke sinkt “langsamer” (bei meinen China-Lüftern… ). Das Testen mit den langsamen PWM-Signalen, um es auf dem Osi zu sehen, hat noch einen Lüfter abgeraucht.
Darum meine Anmerkungen: Einschalten mit ca. 100% Lüfterleistung (= laut also “Hörtest”), z.B. 5-10 Sek, dann reduzieren bis leise genug. Damit ist die Wärme schon mal aus dem Gehäuse raus und der Lüfter bewegt sich.
Ich habe nur 12V Lüfter (China und alte PC-Lüfter), die teilweise bei 5V am Labornetzteil nicht anlaufen, aber schon Strom ziehen, sich aber dann … nicht sicher selber kühlen würden ;-)

Ja, ich würde es auch begrüssen wenn AZ-Delivery Bauteile führen würde.
Bauteile die CE-, VDE-Norm usw. entsprechen wären mein Wunsch.
Gruß
Jürgen

Dirk Willner

Dirk Willner

Also für 10€ bekomme ich einen Temperaturgesteuerten Lüfter.
Wozu das Rad neu erfinden?

teena

teena

Hallo AZ-Delivery… mal eine andere Frage: Es gibt ja so manches, da bin ich eigentlich zu faul.
Das hier ist sowas:
Bitte bietet doch zu den Blogartikeln einfach gleich was fertiges an. Zumindest die Bauteile. Muss ja nicht auf Lager sein. So muss ich jetzt bei Conrad bestellen ?! und ggf noch löten.
Schade.

Wilfried Klaas

Wilfried Klaas

Freilaufdiode, Ja, Nein, vielleicht. In den Lüftern sind üblicherweise brüstenlose Motor mit entsprechenden Controllern verbaut. Damit kann die Freilaufdiode eigentlich entfallen. Denn die Induktivität des Motors liegt ja nicht direkt am Transistor an, sondern erst einmal an dem internen Controller und wird dort kurzgeschlossen. Schaden tut Sie natürlich auch nicht. Wer möchte kann eine Freilaufdiode hinzufügen. Für den hier benutzen Lüfter reicht eine 1N4148. Katode an die +5V, Anode an den Transistor, wo auch der Lüfter angeschlossen wird. Sollen größere Lüfter verwendet werden, muss die Diode natürlich angepasst werden. Schottky ist nicht von Nöten, da hier ja kein PWM verwendet wird. Hier wird der Lüfter nur simpel ein/aus geschaltet.

Peter

Peter

Je nach Standort und Last genügt auch der merklich geräuschärmere Betrieb des Lüfters an 3,3V

Jürgen

Jürgen

Hallo Wilfied,
Gute Idee. Ich habe es noch nie mit Phyton am Raspi ausprobiert.
Eine Leerlaufdiode am Lüfter wäre noch sinnvoll. Die sollte dann die induktiven Spitzen die an der absteigenden Flanke entstehen “kurzschliessen”.
Der Lüfter sollte auch nicht “sehr langsam” drehen, dann stirbt die Elektronik im Lüfter schon mal. Unter ca. 20% sind mir schon Lüfter gestorben. Die steile Einschaltflanke zieht “viel” Strom, wenn der Lüfter zu langsam dreht (oder der Takt zu kurz ist), das macht warm, brummt oder pfeift.
Evtl. eine Lösung: ca. 5- 15 Sek mit höher Drehzahl beginnen, dann ist schon mal etwas Wärmestau weg und dann runterregeln. So kann der Lüfter kurzfristig auf Drehzahl kommen (das Lager dreht sich frei ;-). Dann langsamer werden, bis deutlich über Stillstand (je nach Lüfter min. 20%).
Das sind meine Erfahrungen mit PWM-ESP-Lüfter-Steuerung.

Gruß
Jürgen

Torsten Damerow

Torsten Damerow

Hallo Zusammen,

leider fehlt in der Schaltung eine Freilaufdiode zu Schutz des Transistors vor der umgekehrt gepolten Induktionsspannung des Lüfters.

Viele Grüße
Torsten Damerow

Gerd

Gerd

Hallo Wilfried,
Klasse Blog, besonders für Anfänger. Weiter so. Ich würde noch eine Diode (z.B. 1N4148) in Sperrrichtung vom Kollektor des Transistors nach 5 Volt + schalten, der die Rückschlagspannung, hervorgerufen durch die Induktivität des klassischen Motors, kurzschließt, wie dies bei Relais üblich ist.
Damit kann jeder Motor verwendet werden.
Beste Grüße
Gerd

Andreas

Andreas

Ich hatte das Problem auch. Mir war der Lüfter auch einfach zu laut.
Ich bin die Sache aber pragmatischer angegangen.
Ein 10K NTC Widerstand von +5V auf die Basis eines 2n2222. Den Colector habe ich auch direkt auf +5V gelegt und den kleinen Ventilator habe ich zwischen Emitter(rot) und 0V(schwarz) geschaltet. Fertig!
Der Kopf vom diesem NTC war nicht größer als ein Stecknadelkopf. Da konnte ich ein Zahn vom Kühlkörper rausbrechen und den NTC dort montieren (Heißklebepistole). Die Anschlüsse habe ich mit dünnen Schrumpfschlauch isoliert.
Es funktioniert sehr gut. Ich brauche nur 10 Sekunden die Lüftungsschlitze abdecken und man merkt direckt wie die Drehzahl in die Höhe geht.

Leave a comment

All comments are moderated before being published