Raspberry Pi: Mit Sensoren und GPIO arbeiten
Den Raspberry Pi kann man um die Hardwarefamilie der Sensoren mittels GPIO erweitern. Diese liefern Daten, die man auswerten kann und daraus resultierend Aktionen verschiedenster Art ausführen lassen kann. Nahezu alle verfügbaren Sensoren mit Pin-Anschlüssen sind theoretisch am Raspberry Pi verwendbar. Jedoch bedarf es dazu häufig zusätzlichen Treibern, um die einzelnen Sensoren ansprechen zu können. Im Folgenden erkläre ich anhand von zwei Sensoren wie man diese prinzipiell ansprechen kann.
Verwendete Sensoren
Bei einem Versuchsaufbau verwendete ich den PIR Bewegungssensor und den DHT11 Temperatur- und Luftfeuchtigkeitssensor. Diese beiden Sensoren sind recht günstig und dennoch hochwertig. Der technische Hauptunterschied liegt (neben der anderen Funktion) darin, dass der DHT11, im Gegensatz zum PIR, zusätzliche Treiber benötigt.
PIR Bewegungssensor
Der PIR (Passiv Infrared Sensor) ist einer der gängigsten Bewegungsmelder Sensoren. Meist besitzt er eine milchfarbene wabenartige Kuppel. Der Sensor reagiert auf Temperaturveränderungen in seinem Sichtfeld, kann jedoch nur Veränderungen aufnehmen und keine konkreten Werte. Bleibt ein Objekt an einer Stelle, so reagiert er nicht, sofern sich dessen Temperatur nicht signifikant verändert.
Der Sensor besitzt in der Regel drei Pins, die man mit der GPIO-Schnittstelle des Raspberry Pis verbindet:
- VCC: Versorgungsspannung 5V
- OUT: Digitaler Ausgang
- GND: Masse (0V)
Das Ausgangssignal des Sensors (OUT) gibt lediglich einen logischen Wert (0 oder 1) auf einem 3,3V-Pegel aus (entspricht GPIO-Pin). Die Versorgungsspannung des Sensors muss bei diesem Sensor zwischen 4,5V und 20V liegen, weshalb wir den VCC Pin mit einem der 5V Pins des Raspberry Pis verbinden.
Auf dem Sensormodul befinden sich an der Unterseite in der Regel zwei Potis (Schraubregler). Meist kann man mit dem S beschrifteten Poti die Empfindlichkeit des Sensors (min. 3m Reichweite, max. 7m Reichweite) einstellen. Der mit T beschriftete Poti bestimmt die Verzögerungszeit des Outputs. Das bedeutet, dass die Zeit geregelt wird wie lange der Sensor den gesetzten Wert beibehält, wenn er eine Bewegung erkannt hat (min. 5s, max. 300s).
Der PIR Bewegungssensor lässt sich in Python recht einfach ansprechen. Es werden unter Raspbian keine weitere Treiber benötigt. Im Folgenden ein Script, dass auf Pin 25 (änderbar in Zeile 6) den OUT des PIR hat und die Bewegung erkennt. In der Funktion motion() bzw. motionGone() lassen sich Aktionen definieren, wenn deine Bewegung erkannt wurde bzw. nicht mehr passiert.
nano ~/pir.py
#!/usr/bin/python import time, sys import RPi.GPIO as GPIO # Pin of PIR OUT PIR = 25 # Init PIR for input def initPIR(PIR): print "Waiting for PIR..." while GPIO.input(PIR) == 1: print "PIR Ready" return 0 # Action if motion detected def motion(): print "Motion detected!" return # Action if motion is gone def motionGone(): print "Ready for new motion detection!" return GPIO.setmode(GPIO.BCM) GPIO.setup(PIR, GPIO.IN) PirPreviousState = 0 PirCurrentState = initPIR(PIR) try: while True: PirCurrentState = GPIO.input(PIR) if PirCurrentState == 1 and PirPreviousState == 0: # PIR is triggered motion() PirPreviousState=1 elif PirCurrentState == 0 and PirPreviousState == 1: # PIR has returned to ready state motionGone() PirPreviousState=0 time.sleep(0.1) except KeyboardInterrupt: GPIO.cleanup() exit()
DHT11 Temperatur- und Luftfeuchtigkeitssensor
Der DHT11 Temperatur- und Luftfeuchtigkeitssensor ist ein recht kleiner Sensor, der sein eigenes Gehäuse mitbringt. Der Messbereich liegt zwischen 20% und 90% Luftfeuchtigkeit (Toleranz +-5%) wie auch Temperatur 0°C bis 50°C (Toleranz +-2°C). Die Auflösung des Sensors liegt bei 1% Luftfeuchtigkeit bzw. 1°C Temperatur.
Der Sensor besitzt vier Pins, die man mit der GPIO-Schnittstelle des Raspberry Pis verbindet:
- VCC: Versorgungsspannung 5V
- Data: Digitaler Ausgang bzw. frei programmierbarer GPIO Pin
- NC: Nicht verbunden (irrelevant)
- GND: Masse (0V)
Zur Nutzung des Sensors benötigen wir eine Python-Library von Adafruit. Da das dafür nötige Kernelmodul nicht im Betriebssystem (Raspbian) integriert ist, müssen wir dieses herunterladen, kompilieren und installieren. Zum Zeitpunkt als dieser Artikel verfasst wurde, war auf Airspayce.com Version 1.38 der Treiber aktuell.
wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.38.tar.gz
tar zxvf bcm2835-1.38.tar.gz
cd bcm2835-1.38
./configure
make
sudo make check
sudo make install
cd ..
sudo rm -r bcm2835-1.38
Wir müssen nun mittels des Paketmanager APT Pakete installieren, die von der Adafruit Python-Library benötigt werden bzw. wir benötigen um sie herunterzuladen.
sudo apt-get install git python-dev
Jetzt können wir die Python-Library von Adafruit aus deren Git Repository herunterladen und das Setup Script ausführen.
git clone https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code.git
cd Adafruit-Raspberry-Pi-Python-Code/Adafruit_DHT_Driver_Python
python setup.py build
In dem Verzeichnis build/lib.linux-armv6l-2.7 befindet sich nun die dhtreader.so Datei, die in dasselbe Verzeichnis muss, in der später das Python Script geschrieben wird. Im Beispiel legen wir sie in das Home-Verzeichnis des Benutzers.
cp build/lib.linux-armv6l-2.7/dhtreader.so ~
Den DHT11 Temperatur- und Luftfeuchtigkeitssensor können wir nun auch mittels eines Python Scripts ansprechen. Im folgenden Script ist der Sensor mit seinem Data Ausgang auf Pin 4 (änderbar in Zeile 6) angeschlossen. Das Script beinhaltet eine Schleife, da der Sensor gelegentlich keine richtigen Daten sendet. In diesem Fall versucht das Script die Daten zehnmal anzufordern und wenn auch dies nicht funktioniert, gibt es sowohl eine Temperatur als auch eine Luftfeuchtigkeit von 0 aus.
nano ~/dht.py
#!/usr/bin/python import dhtreader import time # Pin of DHT data and type of sensor DHT = 4 type = 11 # Get values from sensor def getDhtData(): global temperature global humidity dhtreader.init() value = dhtreader.read(type, DHT) i = 0 while True: if (value != None): temperature = "%.0f" % value[0] humidity = "%.0f" % value[1] break else: i += 1 if (i == 10): temperature = 0 humidity = 0 break time.sleep(0.5) getDhtData() print "temperature: " + str(temperature) + "C" print "humidity: " + str(humidity) + "%"
Allgemeiner Hinweis zu weiteren Sensoren
Wie man an den beiden Beispielen sehen kann, ist es gar nicht so schwer mit Sensoren auf dem Raspberry Pi zu arbeiten. Insbesondere wenn man in Python schreiben kann ist dies um ein vielfaches einsteigerfreundlicher als C und C++ Code.
Bevor man sich einen Sensor kauft sollte man sich also am besten informieren ob man zusätzliche Treiber benötigt und woher man deren Code zum Kompilieren bekommt. Außerdem ist es empfehlenswert zu sehen ob es eine Möglichkeit gibt, den Sensor in Python anzusprechen und ggf. nach einem anderen Sensor mit derselben Funktion Ausschau halten.
Beim Kauf selbst sollte man vergleichen wo man diesen kauft, da es häufig mehrere Versionen gibt, die im Kern jedoch auf derselben Elektronik basieren und man an dieser Stelle nicht selten deutlich sparen kann.
13 Kommentare. Hinterlasse eine Antwort
Danke für deine Anleitung gerade für den Temperatur Sensor!
Jetzt aber noch meine Frage (bin noch anfänger) wie kann man das schön auslesen das man zum Beispiel per Browser auf den PI geht und alles schön Grafisch angezeigt bekommt .
Grüße
Stephan
Dazu müsstest du dir ein Webinterface bauen, dass dir die ermittelten Werte entsprechen aufbereitet. Das ist auch ein Thema, dass ich gerne in den kommenden Monaten im Blog Stück für Stück angehen möchte.
Darüber würde ich mich sehr freuen danke schon im Vorraus
Vielen Dank für die Anleitung. Ich habe diese und auch andere bereits getestet. Leider passiert bei mir beim Aufruf des Python Scriptes nichts. Der Raspi scheint in einer Endlosschleife hängen zu bleiben. Konkret geschieht dies, nach Aufruf des Kommandos dhtreader.read(TYPE,PIN)
Vielleicht hast Du einen Tipp?
Vielen Dank!
Ich habe den Fehler gefunden. Es hat sich wieder eine Wahrheit bewiesen: Wer lesen kann, ist klar im Vorteil. Ich habe falsch verkabelt. Jetzt funktionier alles. Heißt aber auch: Bei Aufruf des Skriptes OHNE angeschlossenen DHT22 hilft zum Beenden nur noch das KILL-Kommando.
Wenn ich das richtig sehe, benötigt man für den DHT11 noch ein Widerstand, richtig?
Sollte man verwenden, aber mit der beschriebenen Software Schleife funktioniert er auch ohne Wiederstand.
Perfekte Anleitung, hat auf Anhieb auch für den DHT22 funktioniert!
Der DHT22 gibt auch eine Dezimalstelle aus. Das erhöht zwar nicht Messgenauigkeit, ist aber für die Trenderkennung sehr nützlich. Hierzu nur folgende Anpassungen:
type=22
…
temperature = „%3.1f“ % value[0]
humidity = „%3.1f“ % value[1]
Ergänzung:
der o.g. dhtreader hängt sich im Dauerbetrieb immer auf.
Mit folgender Installation läuft das kontinuierliche Auslesen seit Tagen unter Python3 problemlos:
git clone https://github.com/JoBergs/Adafruit_Python_DHT
sudo apt-get install build-essential python3-dev
cd Adafruit_Python_DHT
sudo python3 setup.py install
Hallo,
ich hätte eine Frage …. ich benutze den DHT22 Sensor und wenn ich den PIn4 mit
sudo ./Adafruit_DHT 22 4 auslese bekomme ich nur die folgende Meldung:
Die komplette Installation der Treiber etc. lief problemlos durch …
Adafruit_DHT 22 4
Using pin #4
Data (0) : 0x0 0x0 0x0 0x0 0x0
in diversen Beispiel sollte hier eigentlich auch Temperatur und Feuchtigkeit angezeigt werden.
Frage: Ist das Teil defekt?
Wenn ich das Programm oben laufen lassen, dann bricht es mit einem Fehler Syntax Error ab und zwar zweitletzte Zeile markiert ist das Hochkommata temperature?
Danke schon mal Voraus
Gruss
Peter
Hallo
ich versuche grade mich an deinen Scripten .
Speziell PIR Bewegungssensor
ich komme da nicht weiter.
Zeile 15 – zeile 18
ich möchte das dort ein sh script aufgeführt wird.
Hast du da eine Idee?
Nils
Der Downloadlink von Adafruit funktioniert nicht mehr. Es wird nur eine README.md Datei runtergeladen. Gibt es noch eine weitere Möglichkeit?
Quad 4