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
Für die nächsten Schritte dem Verzeichnis /mnt/ssd/www/html
das Schreibrecht geben:
sudo chmod 0757 /mnt/ssd/www/html/
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.
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:
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
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.