• Blog
  • Raspberry Pi
  • Über mich
  • Projekte
  • devowl.io

Raspberry Pi: Mit Sensoren und GPIO arbeiten

28. Februar 2015
Raspberry Pi
13 Kommentare

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 Sensor
  • DHT11 Sensor

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)
Step 1

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

Step 2

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

Step 3

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

Step 4
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.

Quellen: Raspberry Pi: Das Umfassende Handbuch von Galileo Computing Seite 493-496 und Seite 501-506, ELV journal

13 Kommentare. Hinterlasse eine Antwort

  • Stephan
    Februar 28, 2015 7:02 pm

    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

    Antworten
    • Jan Karres
      Februar 28, 2015 10:10 pm

      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.

      Antworten
      • Stephan
        März 3, 2015 8:41 am

        Darüber würde ich mich sehr freuen danke schon im Vorraus

        Antworten
  • Stephan
    März 24, 2015 10:07 pm

    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!

    Antworten
    • Stephan
      März 27, 2015 9:57 pm

      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.

      Antworten
  • Maik
    März 27, 2015 9:53 pm

    Wenn ich das richtig sehe, benötigt man für den DHT11 noch ein Widerstand, richtig?

    Antworten
    • Jan Karres
      März 31, 2015 7:31 pm

      Sollte man verwenden, aber mit der beschriebenen Software Schleife funktioniert er auch ohne Wiederstand.

      Antworten
  • Kleinhirn
    August 28, 2015 3:27 pm

    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]

    Antworten
    • Kleinhirn
      September 10, 2015 1:46 pm

      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

      Antworten
  • Peter
    September 8, 2015 6:47 pm

    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

    Antworten
  • niwu
    März 8, 2016 7:55 am

    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

    Antworten
  • Patti4832
    Juni 22, 2016 4:29 pm

    Der Downloadlink von Adafruit funktioniert nicht mehr. Es wird nur eine README.md Datei runtergeladen. Gibt es noch eine weitere Möglichkeit?

    Antworten
  • Thank you for registering. Contact us again http://jankarres.de Okeygorandom fsd7121707
    August 16, 2024 4:35 pm

    Quad 4

    Antworten

Schreibe einen Kommentar Antworten abbrechen

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

Bitte füllen Sie dieses Feld aus.
Bitte füllen Sie dieses Feld aus.
Bitte gib eine gültige E-Mail-Adresse ein.
Sie müssen den Bedingungen zustimmen, um fortzufahren.

Jan Karres
Jan Karres
Wirtschaftsinformatiker
Facebook
Twitter
YouTube
LinkedIn
Xing
GitHub

Themen

  • Blogging
  • Debian (Linux)
  • Eine Geschichte aus dem Leben des Jan
  • Fotos
  • Gaming
  • Gedanken
  • Linksammlungen
  • Privates
  • Projekte
  • Raspberry Pi
    • Einplatinencomputer (außer Raspberry Pi)
  • Schule und Studium
  • Tipps und Tricks
  • Videos
  • Vorgestellt
  • WordPress

Projekte

Dieser Blog ist meine kleine Base im Internet, in der ich über Themen schreibe, die mich persönlich beschäftigen. Abseits davon habe ich weitere Projekte im Netz, die teils aus Spaß entstanden, jedoch zum Teil auch meinen Kühlschrank füllen.

Alle Projekte

JanKarres.de © 2007-2022

Neueste Beiträge

  • Raspberry Pi: WLAN Access Point mit NordVPN (VPN Router) einrichten Dezember 5, 2020
  • Real Cookie Banner: Wie das Opt-in Cookie Banner für WordPress entstand November 18, 2020
  • Blog Setup erneut: Aufräumen einer kleinen Historie Oktober 13, 2020
  • devowl.io: Auf geht’s in das WordPress Business! März 10, 2020
  • Kuschelpartys: Nähe und Geborgenheit einfach erleben September 30, 2018

devowl.io

Meine Brötchen verdiene ich im Internet. Dazu habe ich gemeinsam mit meinem Kollegen Matze die devowl.io GmbH gegründet. Gemeinsam entwickeln und vertreiben wir in unser Plugins und Entwickler-Tools im WordPress Umfeld.

Mehr erfahren
  • Datenschutzerklärung
  • Impressum