Das Schlaue Zimmer

Das Schlaue Zimmer Titelbild

Bevor wir uns an das Programm machen können, gibt es hier erstmal das System zum Anschließen der ganzen Sensoren. Es wird ein wenig voll an deinem Raspberry Pi und dem Breadboard werden, aber wenn du Sensor für Sensor anschließt, wird das alles nicht so schwierig.

Bevor du hier weitermachst, solltest du schon folgende Anleitungen gemacht haben

  • DS18B20
  • Ultraschallsensor
  • PIR/Bewegungsmelder
  • Keypad
  • 20 x 4 Zeichen Display
292.png
Anschlüsse am Pi Anschlüsse an den Sensoren
5V VCC Ultraschallsensor
GPIO 14 Trigger Ultraschallsensor
GPIO15 Echo Ultraschallsensor
GND GND Ultraschallsensor
3,3V 3,3V DS18B20
GPIO 4 Data + 4,7kΩ Ohm zu 3,3V DS18B20
GND GND DS18B20
5V VCC Bewegungssensor
GPIO 8 Data Bewegungssensor
GND GND Bewegungssensor
GPIO 6 1 Keypad
GPIO 13 2 Keypad
GPIO 19 3 Keypad
GPIO 26 4 Keypad
GPIO 16 5 Keypad
GPIO 20 6 Keypad
GPIO 21 7 Keypad

Für die Sprachausgabe brauchen wir noch das Programm

sudo apt-get install espeak

und müssen noch mit raspi-config die Audio Einstellungen ändern.

sudo raspi-config

Und dann: 8 Advanced Options -> A9 Audio -> 1 Force 3.5mm ('headphone') jack

nano smart_room.py
import RPi.GPIO as gpio
import time
import os
from ultraschall import tuer_messen
from pir import bewegung_messen
from keypad import keypad
from ds18b20 import grad_lesen

normale_maximale_entfernung_tuer = 10
pincode = "1234"

authentifiziert = False
logoutRaute = 0

def sprich(text):
 os.system("espeak -vde -a 200 -g 15 '"+text+"'")

try:
 while True:
  if authentifiziert == False:
   if tuer_messen() > normale_maximale_entfernung_tuer:
    print("Tür wurde geöffnet")
    if bewegung_messen() == True:
     print("Der Raum wurde betreten")
     sprich("Hallo Benutzer. Bitte authentifiziere dich")
     ende_countdown_zeit = time.time()+31
     count = 0
     while ende_countdown_zeit > time.time():
      if keypad(30) == pincode[count]:
        count = count +1
        time.sleep(0.1)
        if count == 4:
         sprich("Willkommen Benutzer!")
         sprich("Temperatur: "+str(grad_lesen())+"grad")
         sprich("Logout mit der dreifachen Raute")
         authentiziert = True
         ende_countdown_zeit = time.time() -1
      else:
       count = 0
       sprich("Das ist Falsch")
       time.sleep(0.1)
     if authentiziert == False:
      sprich("Es wurden Menschen verständigt")
    #Anti Einbrecher Sachen z.B.: Twitter
  else:

   if keypad(864000) == '#':
    logoutRaute += 1
   if logoutRaute == 3:
    sprich("Das System ist aktiviert")
    authentifiziert = False
    logoutRaute = 0

 time.sleep(1)
except KeyboardInterrupt:
 sprich("Schlaues Zimmer wird beendet")
 gpio.cleanup()

Da das Programm ein wenig größer ist, haben wir diesmal zum Einrücken nicht die Tab-Taste sondern nur Leerzeichen benutzt. Das macht in diesem Fall alles ein wenig einfacher.

Bei einem so langen Programm kann sich leicht der Fehlerteufel einschleichen und deswegen haben wir das gesamte Programm und die Programme für die Sensoren noch einmal online zum Download bereit gestellt.

wget  jpkit.eu/p/smart_room.zip

wget ist ein einfaches Terminalprogramm, mit dem Dateien heruntergeladen werden.

unzip smart_room.zip

Doch jetzt haben wir nur eine .zip Datei heruntergeladen. Mit dem Befehl unzip lässt sich diese ganz einfach entpacken und die einzelnen Dateien können benutzt werden.

sudo python3 smart_room.py

Du kannst dich mit 1234 in dein schlaues Zimmer einloggen. Dann startet das schlaue Zimmer und du kannst es ausprobieren. Du kannst das Programm jederzeit mit Strg/Cmd+C beenden!

Und jetzt lehne dich einen Moment zurück und genieße das erste schlaue Zimmer, das du gebaut hast. Gratulation!

Schritt für Schritt

Jetzt aber ran an den Code. Damit das schlaue Zimmer auch wirklich so funktioniert, wie es funktionieren soll, müssen noch die anderen Dateien zum Auslesen der Sensoren verändert werden. Das ganze wird online erklärt. In der smart_room.zip sind alle Dateien richtig. In der Zeile 1-7 importieren wir erst einmal alle benötigten Bibliotheken.

In Zeile 9 und 10 definieren wir wichtige Variablen. Mit normale_maximale_entfernung_tuer legst du fest, wie weit entfernt sich die Tür normalerweise von dem Entfernungssensor befindet. Diese Entfernung musst du anpassen, wenn das bei dir anders ist. Der pincode wird benötigt, damit sich der Benutzer anmelden kann. Diesen kannst du natürlich auch ändern, solltest diesen aber besser nicht vergessen.

In Zeile 12 und 13 definieren wir noch die Variable authentifiziert und setzten sie auf False, denn am Anfang des Programms ist der Benutzer noch nicht angemeldet. Die Variable logoutRaute zählt, wie oft die Rautetaste gedrückt wurde.

In Zeile 15 wird noch eine eigene Funktion erstellt, die sprich() heißt. Diese benutzen wir, um mit dem installierten Programm espeak, Text in Sprache umzuwandeln und auszugeben. In unserem Pythonprogramm können wir auch mit der Bibliothek os auf die Funktionen des Betriebssystem zugreifen. Mit os.system("Befehl") können wir einen Befehl im Terminal ausführen. Wie du espeak genau handhaben kannst und was die verschiedenen Werte bedeuten, wird ausführlicher auf den nächsten Seiten erklärt. In Zeile 18 startet die try Schleife, in der sich eine dauernd ablaufende while Schleife befindet. In Zeile 20 gibt es die if Abfrage, ob der Benutzer angemeldet ist. Generell gibt es die folgenden beiden Zustände, die wir beachten müssen: Benutzer ist angemeldet und wir müssen das Zimmer nicht weiter "überwachen" oder der Benutzer ist nicht angemeldet. Die Variable authentifiziert hilft uns dabei. Wenn der Benutzer nicht angemeldet ist, wird durch eine if Abfrage gemessen, ob sich die Tür bewegt hat, denn in diesem Fall würde sich die Entfernung verändern. Dafür wird natürlich der Ultraschallsensor benötigt. Wenn festgestellt wurde, dass sich die Tür bewegt hat, bekundet das Programm das in Zeile 22 und fragt gleich in Zeile 23 nach, ob es dann auch noch Bewegungen im Raum gegeben hat.

Wenn dem so ist, wird in Zeile 25 auch zum ersten mal die Funktion sprich() benutzt und die Person wird aufgefordert, sich anzumelden. Da wir nicht unendlich lange warten wollen, in dieser Zeit könnte ja unser ganzes Zimmer ausgeräumt werden, wird mit ende_countdown_zeit ein Zeitlimit festgelegt, welches dann an die Funktion keypad() übergeben wird. Dieses Zeitlimit beträgt 31 Sekunden. In Zeile 27 erstellen wir dann noch die Variable count mit der gezählt wird, wie häufig der Benutzer schon einen richtigen Pincode eingeben hat. In Zeile 28 läuft eine while-Schleife und das solange, wie der vorherige Countdown gesetzt wurde. Innerhalb der Zeit muss der Pincode eingeben werden. In Zeile 29 wird kontrolliert, ob die Eingabe des Benutzers über das Keypad gleich dem pincode ist. Dazu können wir den pincode wie eine Liste benutzten und mit den eckigen Klammern einzelne Elemente aufrufen. print(pincode[1]) würde in diesem Fall 2 ausgeben. Durch die Variable count wissen wir, an welcher Stelle des Pincodes sich die Eingabe befindet. Wenn die Eingabe richtig war, wird in Zeile 30 count um eins erhöht, damit beim nächsten Mal auch die zweite Zahl kontrolliert wird. In Zeile 31 wird kontrolliert, ob der Benutzer auch den gesamten Pincode eingegeben hat. Bei dem momentanen pincode ist das Fall, wenn vier Zeichen eingegeben wurden. In Zeile 33-35 wird der neue Benutzer begrüßt und bekommt Informationen über die Raumtemperatur. In Zeile 36 kommt dann wieder die Variable authentifiziert ins Spiel, denn mit dieser legen wir fest, dass sich der Benutzer angemeldet hat. In Zeile 37 wird die while Schleife unterbrochen, indem die Variable ende_countdown_zeit in die Vergangenheit gesetzt wurde.

Ab Zeile 38 kümmert sich das Programm darum, was passiert, wenn die Eingaben über das Keypad nicht korrekt waren. Zuerst wird in Zeile 39 die Variable count wieder auf 0 gesetzt, damit bei der nächsten Eingabe auch wirklich nach der ersten Zahl im pincode gefragt wird. In Zeile 40 wird noch der Benutzer über seinen Fehler informiert und in Zeile 41 wartet das Programm anschließend wenige Sekunden.

In Zeile 42 kümmern wir uns um den Fall, dass es keine korrekte Eingabe des pincodes gab. Das heißt die while Schleife wurde beendet und die Variable authentifiziert ist immer noch False. Unter diesem Umständen wird nur in Zeile 43 ausgegeben, dass jemand unerlaubt den Raum betreten hat. Aber dieser Teil kann natürlich noch beliebig ergänzt werden. Ideen dafür findest du auf den anderen Karten oder online.

Da wir das jetzt auch abgeschlossen haben, müssen wir uns noch um die "Logout Funktion" kümmern. Ab Zeile 46 wird alles Eingerückte aufgerufen, wenn der Benutzer schon angemeldet ist. Natürlich muss es dann auch eine Funktion geben, um das System wieder scharf zu stellen, zum Beispiel wenn du den Raum verlassen möchtest. Für diesen Fall zählen wir in Zeile 48, ob der Benutzer auf dem Keypad eine Raute eingegeben hat. Denn wenn dreimal die Raute eingegeben wurde, wird die Variable authentifiziert wieder auf False gesetzt und bevor der Raum betreten wird, muss wieder der Pincode eingegeben werden. Kontrolliert wird die dreifache Eingabe in Zeile 49. Wie dir vielleicht aufgefallen ist, wird der Funktion keypad() ein Wert übergeben, dieser Wert ist eine Zeitangabe, nach der sich die Funktion zurückmeldet, falls es keine Angaben von dem Benutzer gegeben hat.

Da wir das jetzt geklärt haben, wie wäre es wenn du dir Inspiration suchst, um dein schlaues Zimmer so zu erweitern, dass es dich informiert, wenn der Raum betreten wurde.

eSpeak Basics

Welche Möglichkeiten bietet eSpeak sonst noch? Nachdem du das Programm installiert hast, kannst du es einfach im Terminal benutzen.

espeak "Hallo Welt"

Das ist die Standardaussprache, deswegen hört sie sich Englisch an. Mit -vde weiß das Programm, dass wir eine Deutsche Aussprache haben wollen.

espeak -vde "Hallo Welt

Mit dem Parameter -a 100 wird die Lautstärke festgelegt. 100 ist dabei die normale Lautstärke und 200 das Maximum. Die Lautstärke hängt natürlich auch von dem Lautsprecher ab.

espeak -vde -a 200 "Hallo Welt"

Mit -g 10 kannst du die Pausen zwischen den einzelnen Wörtern verlängern und so alles schneller oder langsamer wiedergeben. Der Wert liegt normalerweise bei 10, die Einheit sind Millisekunden.

espeak -vde -a 200 -g 20 "Hallo Welt"

Mit -p 50 wird die Höhe der Stimme verändert. Der normale Wert liegt bei 50 und bis 99 wird die Stimme immer höher. Das gleiche geht natürlich auch andersherum.

espeak -vde -a 200 -p 99 "Hallo Welt"

Noch Fragen oder Feedback?

Bevor du eine Frage stellen kannst musst du dich zuerst Anmelden oder Regestrieren!