Temperatur und Luftfeuchtigkeit messen

Ich möchte meinen Raspberry-Pi zum Messen der Temperatur und Luftfeuchtigkeit verwenden.

Als Sensor viel dabei die Wahl auf den DHT22 mit einer kleinen Platine, auf der bereits der benötigte Pull-Up Widerstand installiert ist. Ich habe mir gleich zwei davon zugelegt, schließlich möchte ich innen und außen messen.DHT22

Die Hardware

Dem Sensor liegt auch ein kleines Anschlußkabel bei, da mir dies nicht lang genug ist, habe ich jedoch ein anderes Kabel mit entsprechenden Steckern versehen.

Der Anschluss gestaltet sich relativ einfach: 3.3V und Masse vom Raspberry-Pi mit den jeweiligen Pins der Sensoren verbinden und den Datenanschluss jedes Sensors mit einem eigenen GPIO-Pin verbinden. Hier findet ihr eine aktuelle Beschreibung der GPIO-Pins (Englisch). Wie man auf dem Bild unten sieht, ist mein Raspberry ein wenig älter. Die Pinbelegung ist jedoch die gleiche soweit die Pins vorhanden sind (die ersten 26).

Raspberry Pi mit angeschlossenem Kabel DHT22 mit angeschlossenem Kabel

Ansteuerung der Hardware

Die einfachste Möglichkeit den Sensor auszulesen ist Adafruit. Dies ist z.B. über GitHub verfügbar. Um dies zu benutzen, muß zuerst ein wenig Software installiert werden:

1
2
sudo apt-get update
sudo apt-get install build-essential python3-dev python3-openssl git

Nun kann Adafruit von GitHub geholt und installiert werden:

1
2
3
git clone https://github.com/adafruit/Adafruit_Python_DHT.git
cd Adafruit_Python_DHT
sudo python3 setup.py install

Adafruit übernimmt die Ansteuerung und das Auslesen des Sensors in C. Python ist hierfür nicht schnell genug. Im Datenblatt des DHT22 kann man lesen, wie der Sensor angesteuert und ausgelesen wird.

Nun können wir relativ einfach über das Modul Adafruit_DHT den Sensor auslesen. Leider ist der Zugriff auf GPIO beschränkt auf root. Damit die eigentliche Datenerfassung nicht als root laufen muß, das Auslesen des Sensors jedoch automatisch ohne Passworteingabe ablaufen kann, benötigen wir ein kleines Script, welches die Daten ausliest und über sudo ohne Passworteingabe ablaufen darf.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import os
import sys
import Adafruit_DHT

if __name__ == "__main__":
    if not os.path.exists ("/run/wetter"):
        os.mkdir ("/run/wetter")
        os.chown ("/run/wetter", 1000, 1000)
       
    ports_allowed = [4, 17]
    port = ports_allowed[0]
    if len (sys.argv) >= 2:
        port = int (sys.argv[1])
        if not port in ports_allowed:
            print ("(None, None)")
            exit (0)

    print (repr (Adafruit_DHT.read (Adafruit_DHT.DHT22, port)))

Ich habe noch ein paar Zeilen ergänzt (Zeile 6-8), die thematisch nicht in das Script gehören, aber es ist hier sehr einfach einzubauen. Am Verzeichnis /run ist eine Ram-Disk (tmpfs) eingehängt. Hier möchte ich meine Daten zwischenzeitlich ablegen. Das Verzeichnis ist jedoch nur von root beschreibbar, die Daten werden jedoch vom Script im unter meinem normalen User abgelegt. Da nach dem Booten des Systems das Verzeichnis /run leer ist, muß jedoch irgendwann ein Unterverzeichnis angelegt werden, in welches der normale Benutzer schreiben kann. Dies geschieht unter /run/wetter mit Benutzer-ID und Gruppen-ID 1000.

Dieses kleine Programm speichere ich nun z.B. unter /root/read_DHT.py und ergänze dann die Datei „/etc/sudoers“ durch Aufruf von sudo visudo mit folgenden Zeilen. Dabei ist „user“ natürlich der Benutzername des Benutzers, welcher das Script ausführen können soll.

1
2
user ALL=(ALL) NOPASSWD: /usr/bin/python3 /root/read_DHT.py 4
user ALL=(ALL) NOPASSWD: /usr/bin/python3 /root/read_DHT.py 17

Im Python-Skript sind in Zeile 10 die erlaubten Ports eingetragen. In der Sudoers-Datei müssen alle erlaubten Portnummern eingetragen werden. Dies kann man, wie hier gezeigt, einfach über mehrere Zeilen machen. Alternativ kann man z.B. in eckigen Klammern mehrere Ziffern angeben, welche an der Stelle erlaubt sein sollen. Die Angabe der Portnummer benötige ich, da ich mehr als einen Sensor anschließen möchte.

Nun kann, ich als „user“ eingeloggt, den Sensor auslesen. Das kleine Script gibt mir dabei die ausgelesenen Werte in Form eines Strings zurück, der der Python-Notation eines Tupels entspricht.

Im nächsten Beitrag geht es darum einen Luftdrucksensor anzuschließen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.