Raspberry Pi Projekt Lichtschranke

Raspberry Pi Projekt Lichtschranke

Da die Motion Detection unserer etwas älteren IP Kamera gerade bei Nebel, Scheinwerferlicht und Vögeln häufig zu Fehlauslösungen führte, haben wir die Alarmfunktion mit einer Lichtschranke erheblich verbessern können!

Versuchsaufbau Lichtschranke
Versuchsaufbau Lichtschranke

Dies ist ganz einfach und auch relativ günstig möglich. Benötigt wird ein Raspberry Pi mit Spannungsversorgung und Zugang zum lokalen Netzwerk.

Raspberry Pi Projekt Lichtschranke

Dazu habe ich diese tolle Lichtschranke für etwa 35 EUR mit folgenden Funktionen gefunden:

  • Doppelstrahl Infrarot Lichtschranke
  • 100m Outdoor Reichweite, Indoor sogar 300m
  • mit Digital Fuzzy als künstliche Intelligenz
  • funktioniert perfekt bei Tag & Nacht, auch bei Schneesturm usw.
  • bis zu 180°+/-90° Horizontale Ausrichtbarkeit und +/-10° Vertikale
  • Betriebstemperaturen von -25°C…95°C
Lichtschranke
Lichtschranke

Pyhton-Code der Lichtschranke

Mit folgendem Python-Code, habe ich die Lichtschranke in unserem Netzwerk so integriert, dass bei Unterbrechung

  • eine Mitteilung in ein lokales Logfile geschrieben wird
  • die angeschlossene LED rot aufleuchtet
  • ich eine Email erhalte
  • zudem eine Nachricht im lokalen Netzwerk erhalte, die über das MQTT Protokoll versandt wird (funktioniert auch ohne Internet!)
  • bei einer längeren Unterbrechnung (Zeit ist einstellbar) erhalte ich einmalig die Info, dass die Lichtschranke nun dauerhaft unterbrochen ist
#!/usr/bin/env python
# coding: utf8
from __future__ import absolute_import, division, print_function
import RPi.GPIO as GPIO
import smtplib
import time
import paho.mqtt.client as mqtt

BtnPin = 13
Gpin   = 12
Rpin   = 11

TimeOut_Alert_sec = 90
TimeOut_Disconnected_sec = 600

lastdetect = 0
Counter = 0


fromaddr = 'Raspberry Pi Alarmsystem'
toaddrs  = 'xxx@googlemail.com'
username = 'xxx@googlemail.com'
password = 'xxx'

msg1_part1 = """From: Raspberry Pi Alarmsystem
To: xxx@googlemail.com
Subject: """
msg1_part2 = """Zone17: Lichtschranke1

"""

msg2_part1 = """From: Raspberry Pi Alarmsystem
To: xxx@googlemail.com
Subject: """
msg2_part2 = """Zone17: Lichtschranke1 (dauerhaft)

"""
def on_connect(client,userdata,flags,rc):
        print("Connected with result code "+str(rc))

client = mqtt.Client()
client.on_connect = on_connect

client.connect("localhost",1883,60)
client.loop_start()

def setup():
        GPIO.setmode(GPIO.BOARD)       # Numbers GPIOs by physical location
        GPIO.setup(Gpin, GPIO.OUT)     # Set Green Led Pin mode to output
        GPIO.setup(Rpin, GPIO.OUT)     # Set Red Led Pin mode to output
        GPIO.setup(BtnPin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)    # Set BtnPin's mode is input, and pull down to low
        GPIO.add_event_detect(BtnPin, GPIO.BOTH, callback=detect, bouncetime=1000)
        
def Led(x):
        if x == 1:
                GPIO.output(Rpin, 1)
                GPIO.output(Gpin, 0)
        if x == 0:
                GPIO.output(Rpin, 0)
                GPIO.output(Gpin, 1)

def SendMail(reason):  # reason=detected / reason=disconnected       		
        date = time.strftime("%Y%m%d")
        zeit = time.strftime("%H:%M")
        WriteFile(reason)
        server = smtplib.SMTP('smtp.gmail.com:587')
        server.starttls()
        server.login(username,password)
        if reason == "detected":
                server.sendmail(fromaddr, toaddrs, msg1_part1+" "+date+" "+zeit+" "+msg1_part2+""+date+" "+zeit+" "+msg1_part2+"("+str(TimeOut_Alert_sec)+" Seconds blocked)")
                client.publish("alarm/lichtschranke",date+" "+zeit+" Zone17: Lichtschranke1")
        if reason ==  "disconnected":
                server.sendmail(fromaddr, toaddrs, msg2_part1+" "+date+" "+zeit+" "+msg2_part2+""+date+" "+zeit+" "+msg2_part2+"("+str(TimeOut_Disconnected_sec/60)+" Minutes disconnected)")
                client.publish("alarm/lichtschranke",date+" "+zeit+" Zone17: Lichtschranke1 (dauerhaft)")
        server.quit()
		
def WriteFile(reason):
        date = time.strftime("%Y%m%d")
        zeit = time.strftime("%H:%M")		
        fileout = open("/home/pi/Desktop/Lichtschranke.txt","a")
        time.sleep(0.1)
        if reason == "detected":
                fileout.write(date+";"+zeit+"; Die Lichtschranke wurde unterbrochen \n")
        if reason == "disconnected":
                fileout.write(date+";"+zeit+"; Die Lichtschranke wurde dauerhaft unterbrochen \n")		
        time.sleep(0.1)
        fileout.close()
        print("Log-File geschrieben")

def detect(channel):
        global lastdetect
        now = time.time()
        if now - lastdetect < TimeOut_Alert_sec:
                return
        SendMail("detected")
        lastdetect = now

def loop():
        global Counter
        while True:
                time.sleep(1)                
                if GPIO.input(BtnPin) == GPIO.HIGH:     			
                        # print("Lichtschranke frei");
                        Led(0)
                        Counter = 0
                if GPIO.input(BtnPin) == GPIO.LOW:     
                        # print("Lichtschranke unterbrochen");
                        Led(1)
                        Counter += 1
                if Counter == TimeOut_Disconnected_sec:
                        SendMail("disconnected")                

def destroy():
        GPIO.output(Gpin, GPIO.HIGH)       # Green led off
        GPIO.output(Rpin, GPIO.HIGH)       # Red led off
        GPIO.cleanup()                     # Release resource

def main():     # Program start from here
        setup()
        try:
                loop()
        except KeyboardInterrupt:  # When 'Ctrl+C' is pressed, the child program destroy() will be  executed.
                pass
        finally:
                destroy()

if __name__ == '__main__':     # Program start from here
        main()

Entsprechend kann man nun einen Ausgang bei Unterbrechung schalten, der als Alarmeingang in die IP-Kamera geht und ein Alarmbild auslöst.

Ich kann nur sagen, dass ich von der Funktionalität und der Zuverlässigkeit dieser günstigen Lösung wirklich begeistert bin!! Wir überwachen so eine Strecke von über 80m, ohne dass ich hunderte Alarmbilder bei schlechten Wetter in einer Nacht erhalte! Das Ganze ist zudem schon aufgrund der großen Abstände sehr unauffällig und die Lichtschranke kann problemlos versteckt werden. Zudem kann man sie in einer Höhe anbringen, in der keine Hunde oder Katzen stören.

Bei Unterbrechung erhalte ich außerdem eine Email und eine Nachricht über MQTT, die im lokalen Netzwerk auch bei Ausfall des Internets funktioniert. Aber mehr dazu gibt es in einem weiteren Artikel.

Auf meinem Tablet nutze ich die Anroid App FireAlert 2, mit dieser tollen App kann ich individuelle Benachricchtigungsoptionen je nach Mail einstellen. So erhalte ich die Info bei Unterbrechung der Lichtschranke, auch wenn ich mein Handy/Tablet eigentlich auf lautlos gestellt habe.

Android App FireAlert 2
Android App FireAlert 2

 

Erstellt von Lena

Hi, ich bin Lena und Blogge hier seit 2010 neben meinem Job über Themen, die gerade so anstehen, wie z.B. Versicherungen, Fotobücher, Wordpress, Lernspiele für Kinder, Musik uvm.! Dieser Blog ist entstanden, da wir sowohl privat als auch beruflich mit den unterschiedlichsten Themen konfrontiert sind und wir ohnehin dazu Recherchen machen. Da lag es nah, unsere Ergebnisse auch euch zur Verfügung zu stellen. Außerdem dient der Blog dazu, Fehler und Probleme, die bei uns im Zusammenhang mit Software und Technik aufgetreten sind, zu besprechen und euch eine passende Lösung dieser Probleme an die Hand zu geben.

Schreibe einen Kommentar

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