Dein letzter Login ist schon eine Weile her.

Bitte überprüfe, ob alle Angaben in Deinem Profil noch aktuell sind.


Bildnachweis: 19/365 our first raspberry pi circuit, Bildausschnitt, by Chris Penny Lizenz: CC BY 2.0

17.06.2015
von Julien Jaacks
in Gastbeiträge von IT-Talenten

[Tutorial] Einführung in Haussteuerung mit dem Raspberry Pi

x
Für Unternehmen:
IT-Nachwuchs kennenlernen!
Jetzt starten

Eingang / Ausgang in einen Raum bemerken

Meiner Meinung nach sind Raspberry Pis der spannendste Weg, um sich mit kleinen Schaltkreisen auseinanderzusetzen. Dazu lernt man noch jede Menge Programmieren, was eigentlich nie schaden kann. Als mir aufgefallen ist, dass die meisten Haussteuerungen mit dem Raspberry Pi eigentlich immer nur über einen einzelnen Infrarot-Sensor laufen, fand ich das zu ungenau, also habe ich mir ein eigenes Prinzip ausgedacht.

Lesezeit: ca. 7 Min.

Bewerten

Themen auf dieser Seite:

Skizze

Zwei Ultraschall-Sensoren (A und B) werden 30 cm voneinander entfernt am Eingang zu dem Zimmer befestigt. Wird Sensor A zuerst "getriggert", also merkt, dass sich etwas vor sich befindet, fragt er Senor B, ob er auch etwas gemerkt hat. Anhand der Reihenfolge, in der die Ultraschallsensoren etwas bemerkt haben, können wir feststellen, ob jemand den Raum betreten oder verlassen hat.

Was man braucht – die Materialien

  • einen Raspberry Pi und Stromversorgung
  • 2 Ultraschallsensoren (z.B. die hier)
  • GPIO Verbindung
  • entweder einen Adafruit Cobbler und ein paar männliche Jumper Kabel (eher zu viele, als zu wenige – sind sehr günstig)
  • oder männliche und weibliche Jumper-Kabel
  • 6 x 1kOhm Widerstände
  • falls Ihr Steckdosen steuern wollt: 433 MhZ Sender und Funksteckdosen
http://fritzing.org

Die Verkabelung

Das Diagramm hilft Euch wahrscheinlich schon, aber ich erkläre das nochmal Schritt für Schritt. Zuerst verbindet Ihr VCC (den ersten Pin auf dem Ultraschallsensor) mit der roten "rail". Einer der beiden 5V-Pins des Raspberry Pi’s muss auch mit dieser Linie verbunden werden.

Den TRIG-Pin (zweiter Pin auf dem Sensor) verbindet Ihr mit GPIO #5 (Pin 29) des Raspberry Pi’s. Beim ECHO-Pin ist das ein bisschen kniffliger, aber auch machbar:

Zuerst sucht Ihr Euch eine Rail aus und verbindet den ECHO-Pin damit. Nun nehmt Ihr einen 1k Ohm Widerstand und verbindet diese mit einer weiteren Rail. Nun müsst Ihr von dort eine Verbindung zu GPIO #6 (Pin 31) des Raspberry Pi’s legen, und noch zwei weitere 1k Ohm Widerstände bevor es wieder auf die blaue Erdungs-Rail geht.

Der erste Ultraschall-Sensor ist geschafft!

Jetzt müssen wir noch genau das Gleiche für den zweiten Ultraschall-Sensor machen, aber natürlich andere Pins vom Raspberry Pi nehmen.

Das sieht dann so aus:

http://fritzing.org

In diesem Tutorial geht es vorwiegend um das Prinzip ... – was man damit anstellt, ist jedem selbst überlassen. Ich nutze diese Steuerung, um z.B. Funksteckdosen zu steuern. Wie genau man diese anschließt und nutzt, könnt Ihr z.B. hier herausfinden.

Damit wäre die Verkabelung auch schon geschafft. Jetzt müssen wir die beiden Sensoren noch richtig positionieren. Ich empfehle, sie ca. 30 cm voneinander entfernt z.B. mit Tesa-Film zu befestigen. Bei mir sieht das Ganze dann so aus:

Julien Jaacks

Damit wäre auch schon die Befestigung und Verkabelung geschafft. Jetzt geht’s an den Code!

Das Programm

Der Code wird ausschließlich in Python geschrieben. Erstellt einen neuen Order mit dem Namen "ultrasonic". In diesem Ordner erstellen wir eine Datei mit dem Namen ultrasonic.py, eine Python Datei. Wichtig ist, dass der Dateiname auf .py endet, um das Programm später ausführen zu können. Diese Datei könnt Ihr im Terminal per SSH oder mit einem Texteditor Eurer Wahl (Notepad, Sublime, …) öffnen und bearbeiten.

Diese Datei öffnen wir nun und importieren in den ersten Zeilen einige libraries, die wir später brauchen werden.

import RPi.GPIO as GPIO
import time
import subprocess
import os
from sys import argv

Falls Ihr keine Funksteckdose benutzt, könnt Ihr import subprocess und import os rauslassen.

Nun benutzen wir den Befehl

GPIO.setmode(GPIO.BCM)

, um das Layout des Boards an unseren Code anzupassen.

Damit wir nicht immer wieder die Nummer unserer Pins aufschreiben zu müssen, und dabei noch vermeidbare Fehler machen, setzen wir einige Variablen:

TRIG_a = 23
ECHO_a = 24
TRIG_b = 5
ECHO_b = 6

Falls Ihr nicht genau die gleichen Pins wie ich benutzt habt, müsst Ihr die Nummern natürlich anpassen.

Es kommen noch drei Variablen hinzu:

path = „/home/pi/raspberry-remote/"
led = 4

Wieder könnt Ihr die Variable path rauslassen, falls Ihr keine Funksteckdosen nutzt. Stattdessen könnt Ihr z.B. noch eine LED anschließen, und erstmal nur diese ansteuern. Bei mir ist das GPIO #4.

Jetzt müssen wir noch sagen, welche Pins INPUTs und welche Pins OUTPUTs sind.

GPIO.setup(TRIG_a, GPIO.OUT)
GPIO.setup(ECHO_a, GPIO.IN)
GPIO.setup(TRIG_b, GPIO.OUT)
GPIO.setup(ECHO_b, GPIO.IN)
GPIO.setup(led, GPIO.OUT)   

Vielleicht wundert Ihr Euch, warum es überhaupt neben Strom und Erdung noch zwei weitere Pins gibt. Das hängt mit der Funktionsweise des Sensors zusammen: Es wird durch TRIG ein sehr kurzer Impuls gesendet, der 10 Nanosekunden (0,0001 Sekunde) lang ist. Diesen sendet der Sensor hinaus und misst, wie lange es dauert, bis der Impuls "zurückkommt". Aus diesem Wert können wir die Entfernung in Zentimeter berechnen.

Wir schreiben also zwei Funktionen, eine für den Sensor A und eine für Sensor B.

def detectDistance_a():
    GPIO.output(TRIG_a, False)
    time.sleep(0.1)

    GPIO.output(TRIG_a, True)
    time.sleep(0.00001)
    GPIO.output(TRIG_a, False)

    while GPIO.input(ECHO_a) == 0:
            pulse_start = time.time()

    while GPIO.input(ECHO_a) == 1:
            pulse_end = time.time()

    pulse_duration = pulse_end - pulse_start
    distance_a = pulse_duration * 17150
    distance_a = round(distance_a,2)

    return distance_a

def detectDistance_b():
    GPIO.output(TRIG_b, False)
    time.sleep(0.1)

    GPIO.output(TRIG_b, True)
    time.sleep(0.00001)
    GPIO.output(TRIG_b, False)

    while GPIO.input(ECHO_b) == 0:
            pulse_start = time.time()

    while GPIO.input(ECHO_b) == 1:
            pulse_end = time.time()

    pulse_duration = pulse_end - pulse_start
    distance_b = pulse_duration * 17150
    distance_b = round(distance_b,2)

    return distance_b

Wir wollen ja wissen, wieviele Personen in einem Raum sind, um ggf. das Licht ein-/ bzw. abzuschalten. Also fragen wir erstmal, wieviele das im Moment sind:

a = raw_input("How many people are in the room?")
persons = float(a)
persons = int(float(a))

Nun haben wir die Variable "persons", die die Anzahl der Personen im Raum enthält. Diese benutzen wir auch direkt, um das Licht ein- oder auszuschalten:

if persons > 0:
    os.chdir(path)
    subprocess.Popen("./send 001100 2 1", stdout=subprocess.PIPE, shell=True)
    GPIO.output(led, 1)
    print "Light was shut on."
else:
    os.chdir(path)
    subprocess.Popen("./send 001100 2 0", stdout=subprocess.PIPE, shell=True)
    GPIO.output(led, 0)
    print "Light was shut off.“

Jetzt folgen die Schleifen, in denen der Vergleich der beiden Werten stattfindet.

    while True:
        distance_a = detectDistance_a()
        distance_b = detectDistance_b()

Im Weiteren werden wir nicht mehr die Funktion detectDistance_a() aufrufen, indem wir sie ausschreiben, sondern ändern es zu distance_a und distance_b.

Wie ich oben schon erklärt habe, wird der Vergleich beider Werte initiiert, sobald einer der beiden Sensoren merkt, dass sich etwas nah (hier weniger als 50 cm) an ihm befindet.

if distance_a < 50:
    i = 0
    liste = []

Dazu deklarieren wir noch zwei weitere Variablen, nämlich i und dazu noch eine Liste. Die Variable "i" brauchen wir, um uns die Liste später genauer anschauen zu können.

Nun fügen wir 5 Werte in die oben erwähnte Liste ein, welche die Distanz von 5 Messungen sind.

addDistance = detectDistance_a()
addDistance = round(addDistance)
liste.append(addDistance)

Damit wir diese Liste in unserer Konsole sehen:

print liste

Jetzt müssen wir diese Liste noch auswerten.

for number in liste:

    if liste[i] < 50:
            print "Someone entered the room."
            persons = persons + 1
            if persons < 0:
                persons = 0
            if persons > 0:
                GPIO.output(led, 1)
                os.chdir(path) // Directory ändern für Licht
                subprocess.Popen("./send 001100 2 1", stdout=subprocess.PIPE, shell=True) // Licht anschalten
                print persons
                break
            elif liste[i] > 50:
                if i <= len(liste):
                    i = i + 1
                elif i > len(liste):
                    break

"for number in liste" bedeutet, dass alles, was sich in diesem for-loop befindet, so oft gemacht wird, wie "liste" Einträge hat. Damit stellen wir sicher, dass auch jeder Wert überprüft wird. Wenn der jeweilige Wert aus liste eine Distanz von weniger als 50 cm aufweist, können wir daraus schließen, dass jemand den Raum verlassen, bzw. betreten hat. Wir können nun 1 von unserer Variable "persons" abziehen bzw. addieren. Direkt im Anschluss wird das Licht aus- oder angeschaltet.

All das brauchen wir natürlich auch für die andere Reihenfolge. Dabei müssen nur einige "a"s zu "b"s verändert werden.

Den fertigen Code könnt Ihr Euch aus der Download-Box (siehe oben) herunterladen.

Das Programm könnt ihr jetzt mit dem Befehl
sudo python ultrasonic.py
ausführen.

Kommentar vom Autoren Julien

Ich hoffe das Tutorial hat Euch geholfen. Bei weiteren Fragen könnt Ihr mir gerne eine Mail an julien.jaacks@gmail.com schreiben, ich werde versuchen, so gut wie möglich zu helfen. :)

Downloads

Aktuelle Aktionen:

IT-Stipendium November 2020

1200€ Förderung für IT-Talente!


Sei dabei und sichere Dir beim IT-Stipendium November 2020 bis zu 1200€ Förderung.
Jetzt bewerben!

IT-Stipendium November 2020 NRW

Stipendium für Informatiker aus NRW


Sei dabei und sichere Dir beim IT-Stipendium November 2020 bis zu 1200€ Förderung.
Jetzt bewerben!

IT-Talents ist ein Netzwerk nur für IT'ler. Auf unserer Plattform kannst Du Dich als registriertes Mitglied mit wenigen Klicks auf die Jobs unserer Partnerunternehmen oder auf IT-Projekte für Studierende bewerben. Darüberhinaus führen wir Wettbewerbe durch und vergeben IT-Stipendien.

Jetzt Mitglied werden.

Verwandte Artikel

Was ist Virtualisierung? - Virtualisierungstechnologien im…

30. Sep 2020 in IT-Talents

Virtualisierung verspricht effizienten Ressourceneinsatz, einen schnellen Wechsel zwischen verschiedenen…

weiter

Die 5 coolsten Raspberry PI Projekte

15. Jun 2020 in IT-Talents

Dank seiner erstklassigen Vielseitigkeit hat sich der Raspberry Pi im Laufe der Jahre als der beliebteste…

weiter

Welche Smart-Home-Systeme gibt es?

02. May 2019 in IT-Talents

Du willst dir ein Smart-Home-System anschaffen, weist aber nicht welches? In diesem Beitrag erfährst du welche …

weiter

Was ist ein embedded system bzw. eingebettetes System?

12. Jun 2018 in IT-Talents

Ein embedded System ist Teil eines viel größeren Systems, das in der Regel eine wesentliche Funktion für den Betrieb de…

weiter

Klein, effizient und komfortabel: Der Raspberry als HTPC

25. Jan 2018 in IT-Talents

Dank seiner integrierten Hardwarebeschleunigung ermöglicht der Raspberry Pi die Grafikausgabe mit 1080p Full HD und die …

weiter

Raspberry Pi als Cloud Speicher und NAS

19. Dec 2017 in IT-Talents

NAS - sogenannte Network Attached Storage verbreiten sich rasant. Verbessern sie doch das Management von Daten…

weiter

Alles über Prozesse, Threads und Hyperthreading

12. Feb 2016 in IT-Talents

Die Begriffe Threads, Prozesse, Hyperthreading hat wohl jeder schon einmal gehört. Aber so richtig trennscharf werden …

weiter

Let’s Play: Aktuellen Gaming-PC zusammenstellen

09. Oct 2015 in Gastbeiträge von IT-Talenten

"Viel Leistung für wenig Geld": So lautet die Devise für den Gamer von heute und das zurecht, schließlich kann man mit ei…

weiter

Schnell-Login für unsere Mitglieder

Tipp: Halte Dein Profil aktuell.

Lass' uns wissen, falls sich etwas Neues bei Dir ergibt.

Tipp: Vervollständige Dein Profil für noch bessere Karrierechancen.

Bist Du Schüler, Student oder bereits berufstätig? Teile uns Deinen aktuellen Status mit, damit wir Dir sinnvolle Aufgaben anbieten können.

Jetzt Status angeben

Wann stehst Du der IT-Branche zur Verfügung?

Bitte Monat und Jahr angeben.

{{ perspectiveForm.availableFrom.$error.dynamic }}

Neuer Versuch

Wo möchtest Du durchstarten?

{{ location.geolocation.name }}×
Bitte mindestens ein Ort angeben.

Als {{currentUser.status.title}} bist Du bereit für:


Lade Beschäftigungsarten

Bitte wähle den Zeitpunkt, Ort und min. eine Beschäftigungsart aus.

You have voted!
Schliessen
Vote for:
stars
Vote
You have not rated!