Der Schlaue Schalter

Der Schlaue Schalter Titelbild

Der Schlaue Schalter

Nach den Grundlagen im Arbeiten mit IR Empfänger und IR Fernbedienung, dem Servo Motor und dem Bewegungsmelder wollen wir uns jetzt an ein praktisches Projekt machen. Eine Sache, die immer noch ziemlich mühselig ist und dabei physische Arbeit braucht, ist das Benutzen eines Lichtschalters. Denn wenn wir mit diesem das Licht ein und wieder aus schalten wollen, müssen wir uns immer noch bewegen. Ansonsten brennt das Licht einfach weiter, obwohl wir das Zimmer schon verlassen haben und das kann ja auch nicht wirklich die Lösung sein.

Bei diesem Projekt ist es das Ziel, diese Probleme möglichst zu minimieren. Heißt, wir wollen mit einem Knopfdruck der IR Fernbedienung das Lich an und wieder aus machen. Um den Schalter physisch zu bewegen, benutzen wir den Servo Motor und befestigen diesen direkt an einem Lichtschalter. Du musst dabei vermutlich ein wenig experimentieren, denn der Servo kann nicht alle Lichtschalter bewegen. Doch damit wird der Lichtschalter ja nicht gleich schlau. Mit dem Bewegungssensor werden wir auch noch Bewegung messen und wenn sich zulange in einem Raum nichts bewegt hat, das Lich wieder abschalten. Natürlich kannst du das Programm auch noch auf andere Möglichkeiten zuschneiden und verändern.

Der Schlaue Schalter am Raspberry Pi angeschlosse

Anschlüsse Pi Anschlüsse Sensoren
GND GND oder auch - IR Empfänger
VCC VCC IR Empfänger
GPIO 17 Signal oder auch S IR Empfänger
GND Graues Kabel/GND Servo
VCC Rotes Kabel/VCC Servo
GPIO 12 Orangefarbenes Kabel/Signa Servol
5V VCC Bewegungssensor
GPIO 21 Data Bewegungssensor
GND GND Bewegungssensor
GPIO24 Taster 1
GND + 10KOhm Taster 1

schlauerschalter.py

import RPi.GPIO as gpio
import lirc
import time
gpio.setmode(gpio.BCM)
servo = 18
pirSensor = 21
taster = 24
lichtStatus = False
warteZeit = 60*15
letzteBewegung = time.time()
#Servo setup
gpio.setup(servo, gpio.OUT)
p = gpio.PWM(servo, 50)
p.start(6.5)
def schalter(channel=None):
 global lichtStatus, p
 print("Lichtschalter")
 if lichtStatus == False:
  # Licht Anschalten
  p.ChangeDutyCycle(7.7)
  lichtStatus = True
 else:
  #Lich Ausschalten
  p.ChangeDutyCycle(6.5)
  lichtStatus = False
 time.sleep(1)
# taster
gpio.setup(taster,gpio.IN,pull_up_down=gpio.PUD_UP)
gpio.add_event_detect(taster, gpio.RISING,
 callback=schalter)
# Bewegung
gpio.setup(pirSensor,gpio.IN,pull_up_down=gpio.PUD_UP)
def bewegung(channel):
 global letzteBewegung
 letzteBewegung = time.time()
gpio.add_event_detect(pirSensor, gpio.RISING,
callback=bewegung)
# IR
sockid = lirc.init("slidepuzzle", blocking=False)
while True:
 print("Lichtstatus: "+str(lichtSatatus))
 codeIR = lirc.nextcode()
 if "up" in codeIR:
  schalter()
  print("UP")
 if lichtStatus == True:
  if time.time() - letzteBewegung > warteZeit:
   print("Zeit ist vergangen")
   schalter()

Bevor ihr das Programm jetzt ausführt und einem richtigen Lichtschalter testet, solltet ihr vor allem die Bewegung des Servos richtig festlegen. Diese findet ihr in Zeile 24 und 29. Wenn der Servo alleine nicht stark genug ist, könnt ihr auch ein kleines Holzbrett benutzen.

Was haben wir gemacht

Die Schritt für Schritt Erklärung sparen wir uns in diesem Moment denn das aller meiste sollte euch schon bekannt vor kommen. Wir werden deswegen die Verschiedene Bereiche durchgehen, welche mit Kommentaren gekennzeichnet sind. In Zeile 7 bis 12 definieren wir alle wichtigen Variablen. Am interessanten ist dabei die Variable warteZeit in Zeile 11, den mit dieser Variable wird festgelegt wann das Licht automatisch wieder ausgehen soll, wenn es keine Bewegung gibt. Da diese Zeit in Sekunden gemessen wird, entspricht 601615 Minuten. Eine Weitere Besonderheit ist, das wir mittime.time()` die Aktuelle Zeit als Timestamp bekommen können. Ein Timestamp ist die Zeitmessung in Sekunden von einem bestimmten Punkt. Im nächsten Schritt geht es den daran alles für den Servo richtig einzurichten. Dieses besteht einmal aus dem normalen Setup, aber auch aus der Funktion schalter(). Diese Funktion regelt es, wie der Servo geschaltet werden muss damit das Lich an und wieder aus geht. Dabei ist die Funktion so gebaut das, wenn das Lich aus ist es ist An Schaltet und genau das Gegenteil. Ob das licht gerade an sein soll, wird in der Variable lichtStatus definiert. Heißt wenn die Variable lichStatus False ist, wird das Lich angeschaltet und die Variable wird auf True geändert.

Im nächsten Block geht es dann um den Taster. Immer wenn der Taster gedrückt wird, wollen wir das das Licht ausgeht wenn es vorher geleuchtet hat und umgekehrt. Achte darauf das wir ausgründen des Druckes in Zeile 34 einen Absatz eingefügt haben. In Zeile 34/35 wird deswegen mit der Funktion add_event_detect() eine Funktion hinzugefügt mit der sobald der Taster gedrückt (also sich am GPIO Pin die Spannung verändert) die Funktion schalter aufgerufen wird. Das ist auch schon der Taster.

Im nächsten Block geht es dann um den Bewegungssensor. Immer wenn es Bewegung gibt, müssen wir auch speichern wann es Bewegung gegeben hat. Dafür benutzen wir einen ähnlichen Aufbau wie beim Taster doch, bei wenn Bewegung gemessen wird, wird die Funktion Bewegung aufgerufen. Diese Speichert dann einfach nur den Aktuellen Timestamp in die Variable letzteBewegung. Auch in Zeile 43/44 gibt es einen Zeilenumbruch

Im nächsten Block geht es dann Infrarot Funktionalität und damit an das Herzstücks des Projekts. Das System und Aufbau ist wie bei den vorherigen Einheiten. In der While Schleife gibt ist in Zeile 52 eine Funktion die Testet ob die Taste für Oben gedrückt wurde, wenn das der Fall ist wird die Funktion schalter aufgerufen. Natürlich gibt es da auch noch Möglichkeit verschiedene Tasten für Lich An und Aus zu definieren. Im nächsten Schritt wird dann in Zeile 56 nur noch Kontrolliert wie viel Zeit vergangen ist, wenn das mehr ist, als unsere Definierte Wartezeit und das Licht an ist, wird wieder die Funktion schalter aufgerufen und das Licht wird aus gemacht.

Und so einfach ist auch dein Schlauer Schalter. Natürlich kannst du diesen auch beliebig erweitern und das Lich Twittern, Nur noch auf Bewegung reagieren oder dein Lichtschalter nur noch mit Terminal steuern. Aber das ist ganz dir und deiner Kreativität überlassen.

Noch Fragen oder Feedback?

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