Portal naj

Portal naj

logo

Temperatur Messen, Lüfter Steuern, in Datenbank speichern

In der Serverbox wird die Temperatur mit einem DS1820 Temperatursensor gemessen. Die Kühlung erfolgt mit einem 5 V PWM Lüfter von Noctua. Gespeichert werden die Daten auf Hermes in einer MySQL-Datenbank (MariaDB).

Top

Temperatur Messen mit dem DS1820

Link: Kompf.de - Pi one Wire
Temperatursensor DS1820 - Pinbelegung
Temperatursensor DS1820

Beim DS18S20 und den verwandten DS18B20 sowie DS1822 handelt es sich um integrierte Schaltkreise im TO-92 Gehäuse, die Temperatursensor, Analog-Digitalwandler und 1-wire Interface enthalten. Die genannten Typen sind Anschluss- und Softwarekompatibel, sie unterscheiden sich im Wesentlichen in der Messgenauigkeit und im Preis. Die drei Anschlüsse (siehe Bild ) sind Masse (GND, Pin 1), Daten (DQ, Pin 2) und Betriebsspannung (VDD, Pin3).

Aktive Speisung (dreiadriges Kabel)

Schaltplan für den Anschluss des DS1820 am Rapbian Pi
Schaltplan für den Anschluss des DS1820 am Rapbian Pi

Anschluss des Sensors am Hermes

Die Pin-Belegung am Hermes für den Temperatursensor wurde in ein eigens Kapitel ausgelagert.

Anschlüsse

One-Wire-Softwaretreiber

Die für die Ansteuerung des 1-wire Temperatursensors erforderlichen Kernelmodule sind Bestandteil der Linux-Distribution Raspberry Pi OS. Zunächst ist die Aktivierung des Device Tree Overlay für 1-wire notwendig. Dazu editiert man die Datei /boot/config.txt und fügt folgende Zeile hinzu: dtoverlay=w1-gpio;gpiopin=21

sudo nano /boot/config.txt
dtoverlay=w1-gpio;gpiopin=21

Anschließend neu starten und prüfen ob die Kernelmodule w1_gpio und w1_therm geladen sind:

lsmod | grep w1
Ergebins:
w1_therm 28672 0
w1_gpio 16384 0
wire 40960 2 w1_gpio,w1_therm

Ist das nicht der Fall müssen die Module nachgeladen werden mit:

sudo modprobe w1-gpio
sudo modprobe w1-therm

Damit die Module auch regelmäßig geladen werden müssen diese noch in die Datei modules eingetragen werden.

sudo nano /etc/modules
#edit by JPF
w1-gpio
w1-therm

Die Module legen im Verzeichnis /sys/bus/w1/devices jeweils ein Unterverzeichnis für jeden gefundenen Sensor an. Der Name des Verzeichnisses setzt sich aus dem Family-Code des Sensors und seiner eindeutigen Identifikationsnummer zusammen. Sensoren vom Typ DS1820 und DS18S20 haben den Family-Code 10, DS18B20 den Code 28 und DS1822 die 22. In jedem Unterverzeichnis gibt es die Datei w1_slave, die den Sensorstatus und die gemessenen Temperaturwert enthält:

cd /sys/bus/w1/devices
cd 28*
cat w1_slave
0f 00 4b 46 ff ff 06 10 0c : crc=0c YES
0f 00 4b 46 ff ff 06 10 0c t=7375

Die Datei besteht aus zwei Zeilen, die jeweils den hexadezimalen Registerdump des Sensor-ICs enthalten. Am Ende der ersten Zeile steht die Prüfsumme (CRC) und die Information, ob es sich um einen gültigen Messwert handelt (YES). Die zweite Zeile endet mit dem Temperaturmesswert in tausendstel Grad Celsius. Im Beispiel beträgt die Temperatur also 7,375 °C. Die Genauigkeit auf drei Stellen hinter dem Komma ist natürlich nur scheinbar; dem Datenblatt des DS18S20 entnimmt man zum Beispiel, dass die Messgenauigkeit ±0,5 °C beträgt. Die tatsächliche Temperatur liegt also irgendwo zwischen 6,8 und 7,9 °C.

Ein Pythonprogramm zum Auslesen der Temperatur erstellen

Auch als Downlaod

Ein Python Scritp erstellen im VZ: /media/hermes4/scripts Hinweis: Die fertigen, ausführbaren Scripts sollen nicht auf Samba liegen, sondern direkt auf Hermes im Verzeichnis: /media/harddisk/scripts. Beim erstellen des Programms habe ich mich an folgender Anleitung orientiert:

Rasperry Pi: Temperature Readings with DS18B20 Sensor (Python)

Benötigte Bibliotheken:

Die Kernelmodule werden benötigt um mit dem Senosr zu kommunizieren:

Den Pfad zu den Sensordaten angeben bzw. finden lassen:

base_dir = "/sys/bus/w1/devices/"
device_folder = glob.glob(base_dir + "28-e837*")[0]
device_file = device_folder + "/w1_slave"

Erklärungen:

Funktion um die Sensordatei in eine Variable einzulesen:

read_temp_raw():

f = open(device_file, "r")
lines = f.readlines()
f.close()
return lines

Erklärungen:

The function read_temp_raw() gets the temperature readings from the w1_slave file (that's the place where those are stored). This function opens the w1_slave file, reads its contents line by line, and then returns a list containing the lines.

Mein fertiges Script am Ende.

#!usr/bin/env python3
# -*- coding: utf-8 -*-

#benötigte Bibliotheken
import os
import glob
import time

#benötigte Kernelmodule
os.system("modprobe w1-gpio")
os.system("modprobe w1-therm")

#Variablen definieren
temperatur = 0

#Pfad zum Sensor angeben bzw. finden lassen
base_dir = "/sys/bus/w1/devices/"
device_folder = glob.glob(base_dir + "28-e837*")[0]
device_file = device_folder + "/w1_slave"

#Funktion um die Sensordatei in eine Variable einzulesen
def read_sensor():

with open(device_file, "r") as f:

sensor_data = f.readlines()

return sensor_data

#Funktion um die Temperatur aus der Datei auszulesen
#Ein return führt zum verlassen der Funktion!
def read_temperature():

while True:

sensor = read_sensor()
if sensor[0].strip()[-3:] == "YES":

equals_pos = sensor[1].find("t=")
if equals_pos != -1:

temp_string = sensor[1][equals_pos+2:]
temp_c = float(temp_string) / 1000.0
return temp_c

time.sleep(1)

#Hauptfunktion
def main():

while True:

temperature = round(read_temperature(), 2)
print(f"Temperatur: {temperature:.2f} °C")
print("")
time.sleep(3)

if __name__ == "__main__":

main()

Top

Lüftersteuerung und Kühlung mit dem 5 V PWM Lüfter von Noctua

Pin Belegung Noctua 5 V PWM-Lüfter:

Noctua 4 Pin 5V Fan - Pinbelegung
Pinbelegung des Lüfters

Ein PWM-Signal liegt an GPIO 13 (PIN(33) und GPIO 12 (Pin 32). Ich benutze GPIO 13
Anmerkung:
Mit gpiozero bin ich nicht weiter gekommen, daher wieder auf die klassische Weise.
Nun den GPIO 13 das PWM-Signal aktivieren.

Link: Enabling Hardware PWM on Raspberry Pi

sudo nano /boot/config.txt

Am Ende in der Section [all] einfügen:

#edit by jpf 02.03.24 für den Fan serverbox
dtoverlay=pwm,pin=13,func=4

Das Script zur Lüftersteuerung

Hier als Download

Top

Temperatur und Lüftergeschwindigkeit in Datenbank speichern

Maria DB Python Connecto installieren

Damit die Daten in die Datenbank eingelesen werden können müssen folgende Packet installiert werden/sein:

sudo pip3 install mariadb sudo pip3 install mysql-connector-python sudo apt install python3-libgpiod (prüfen ob das auch über pip3 möglich ist)

Wenn pip nicht funktioniert liegt der Grund bei zu vielen verschiedenen Packet Managern die bereits verwendet wurden. Es werden dann virtuelle Umgebungen empfohlen, ich habe mir jedoch mit „—break-system-packages“ geholfen. Siehe auch folgenden Link: pip.

sudo pip3 install --break-system-packages mariadb sudo pip3 install --break-system-packages mysql-connector-python sudo apt install python3-libgpiod

Script um Dummydaten in die Datenbank zu schreiben

Das script um eine Verbindung zur Datenbank herzustelln kann unter Download heruntergeladen werden. Es werden lediglich Testdaten in die Datenbank geschrieben.

Script zum Temperatur auslesen, Lüfter steuern und Werte in einer Datenbank speichern

Aus den in den vorherigen Kapiteln beschriebenen einzelnen Scripten wird nun ein gesamtscript erstellet um die Temperatur zu messen. Den Lüfter in Abhängigkeit der Temperatur zu steuern und die Lüftergeschwindigkeit und die Temperatur alle 15 Minuten in einer Datenbank zu speichern.

Download