Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste


C - Programmierung am Raspberry  Schaltpläne und Bauteilbeschreibungen  Adapterkabel  Mechanik  EDV-Literatur deutsch 



    FIAN Österreich     Marktplatz Natur    
    Bäckerei Freitag

fan_2

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.

FIXME
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

INARBEIT

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.

fan_2.txt · Zuletzt geändert: 2020/11/16 19:19 von administrator