CPU - Lüfter temperaturgesteuert ein- und ausschalten

und die Werte in eine LOG-Datei schreiben, um daraus eine Grafik zu erstellen.

Letztes Update 2020/11/16 00:27

Am Raspberry ist am Pin33, GPIO13, WiringPi23 ein CPU-Lüfter über eine Darlington-Stufe angeschlossen.

Um diesen Lüfter mit dem Raspberry zu steuern, wird ein C-Programm abgearbeitet, welches von cron alle Minuten ausgeführt wird. Zur Steuerung des Lüfters wird die WiringPi Bibliothek verwendet. Dazu muss WiringPi installiert sein. Siehe WiringPi installieren.
Falls kein Lüfter gesteuert werden soll, sondern nur die CPU Temperatur kontrolliert und in einer Grafik angezeigt werden soll, dann sind aus dem Programm alle dahingehende Teile vor dem Kompilieren zu entfernen.

Eventuell eine Konfigurationsdatei im Home-Verzeichnis vom User pi anlegen, um die Ein- / Ausschalttemperatur leichter anpassen zu können.

/*############################################### # Name: ccfan.c # Version: 1.00 # Datum: 04.11.2020 # Zweck: Lüfter einschalten, wenn # CPU-Temperatur zu hoch # (CC) BY-SA #################################################*/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <wiringPi.h> #define ZEILENLAENGE 256 int main(void) { char* device_id = "/sys/class/thermal/thermal_zone0/temp"; // Pfad zur CPU temperatur char* line = malloc(sizeof(char)*ZEILENLAENGE); FILE *fp; float temperatur; float fan_on = 50.00; //einschalttemperatur float fan_off = 45.00; //ausschalttemperatu #define FAN 23 //wiringpi port des lüfters #define HIGH 1 #define LOW 0 struct tm *zeit; time_t sekunde; char string[80]; time(&sekunde); wiringPiSetup (); pinMode (24, OUTPUT); fp = fopen( device_id, "r"); //Temporäre Temperatur-Logdatei zum lesen öffnen if(fp == NULL) { printf("Datei kann nicht geöffnet werden.\n"); return EXIT_FAILURE; } else { fgets(line, ZEILENLAENGE, fp); } // printf("Temp in m°C: %s", line); temperatur = atof(line)/1000; // printf("CPU-Temperatur = %.2f°C\n", temperatur); // printf(" FAN On = %.2f°C\n", fan_on); fclose(fp); if (temperatur > fan_on) { digitalWrite (FAN, HIGH); // printf("FAN HIGH \n"); } else if (temperatur < fan_off) { digitalWrite (FAN, LOW); // printf("FAN LOW \n"); } zeit = localtime(&sekunde); strftime(string, 80, "%d.%m.%y %H:%M",zeit); printf("%s %.1f\n", string, temperatur); return EXIT_SUCCESS; }

Nach dem Speichern wird das Programm mit dem Schalter -lwiringPi kompiliert:

gcc -o ccfan ccfan.c -lwiringPi

Die eingetragenen Temperaturwerte sind vor allem für das Testen von Programm und Hardware verwendet worden. Die tatsächlichen Werte hängen sehr stark von Gehäuse und Umweltbedingungen ab.

Für die nächsten Schritte dem Verzeichnis /mnt/ssd/www/html das Schreibrecht geben:

sudo chmod 0757 /mnt/ssd/www/html/

crontab editieren

An der Konsole crontab mit dem Schalter -e eingeben:

crontab -e

und folgenden Eintrag vornehmen, um das Programm cfan zu starten und die Temperaturdaten in ein Logfile zu schreiben. Da eine Festplatte im Verzeichnis /mnt/ssd eingehängt ist wird die LOG Datei auf diese gespeichert. Der printf-Befehl aus dem Programm ccfan wird durch den cron-Job in die Datei umgeleitet. Diese LOG-Datei wird zum Erstellen einer Verlaufsgrafik herangezogen.

*/1 * * * * /home/pi/ccfan >> /mnt/ssd/www/html/cpu_temperatur.log

Es wird nun alle Minuten die Temperatur der CPU in die Datei /mnt/ssd/www/html/cpu_temperatur.log geschrieben und kontrolliert, ob die Gehäusetemperatur unter/über der jeweiligen Schaltschwelle für das Ein- und Ausschalten liegt.

gnuplot installieren und einrichten

Vor der Verwendung von gnuplot muss dieses natürlich vorher installiert werden:

sudo apt install gnuplot

Im Verzeichnis /home/pi die Konfigurationsdatei cpu-temperatur.conf anlegen.

# cpu-temperatur.conf
#
set title "CPU-Temperatur"
set xlabel "Minuten"
set ylabel "Temperatur (°C)"
set terminal png size 640,480
set output "/mnt/ssd/www/html/cpu_temperatur.png"
set xdata time
set timefmt "%d.%m.%y %H:%M"
set format x "%d.%m\n%H:%M"
set xtics rotate by 90 offset 0,-2 out nomirror
set grid
set key left box
plot "/mnt/ssd/www/html/cpu_temperatur.log" using 1:3 title "CPU" with lines

Die Bedeutung der einzelnen set-Kommandos:

set title „CPU-Temperatur“ - Überschrift

set xlabel „Minuten“ - Bezeichnung X-Achse

set ylabel „Temperatur (°C)„ - Bezeichnung Y-Achse

set terminal png size 640,480 - Ausgabegröße der Grafik in Pixel

set output „/mnt/ssd/www/html/cpu_temperatur.png“ - Name und Pfad der Grafikdatei

set xdata time - Setzt das Format der tic-Labels

set timefmt “%d.%m.%y %H:%M“ - Format der Daten

set format x „%d.%m n%H:%M“ - Beschriftung der X-Achse, n = Zeilenumbruch

set xtics rotate by 90 offset 0,-2 out nomirror - Beschriftung der X-Achse um 90° drehen und nach unten versetzen, da Beschriftung ansonsten im Bild

set grid - Raster zeichnen

set key left box - Bezeichnung der Kurve

plot „/mnt/ssd/www/html/cpu_temperatur.log“ using 1:3 title „CPU“ with lines

Nochmals die crontab aufrufen (crontab -e)und eine Zeile zufügen:

*/1 * * * * /home/pi/ccfan >> /mnt/ssd/www/html/cpu_temperatur.log
*/1 * * * * sleep 3; cat '/home/pi/cpu-temperatur.conf' | /usr/bin/gnuplot

Nun wird zusätzlich 3 Sekunden nachdem die LOG-Datei geschrieben wird, die Grafik cpu_temperatur.png im Verzeichnis /mnt/ssd/www/html/ erstellt.

Diese kann im Browser direkt angezeigt werden:

/IP-Adresse/cpu_temperatur.png

LOG-Datei packen und speichern

Einen Cronjob einrichten, der wöchentlich die Datei komprimiert und als .pkzip samt dazugehöriger Wochengrafik mit dem Namen cputemp_Jahr_Wochennummer.pkzip speichert und anschließend die ungzipte Datei löscht. Im Cronjob mit 10 Sekunden Delay (sleep 10;) starten, um Kollisionen mit anderen Verarbeitungen zu verhindern.