Instantly share code, notes, and snippets.

anonymous /pir.py
Created Apr 27, 2017

Embed
What would you like to do?
Python PIR Sensor demo for Raspberry/Banana Pi using RPi.GPIO
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# PIR demo script
#
# Sendet der PIR einen IRQ wird eine aktion ausgeführt,
# solange die aktione das letzte mal vor PIR_DELAY sekunden ausgeführt wurde.
# Danach werden alle PIR IRQs für PIR_IGNORE_TIME sekunden ignoriert.
# Und dann beginnt das ganze wieder von vorn.
import sys, time
import RPi.GPIO as gpio
gpio.setmode(gpio.BOARD)
gpio.setup(23, gpio.IN)
# Wie oft die PIR ausgeloest Meldung hintereinander ausgegeben werden soll
MAX_COUNT = 3
# Wartezeit zwischen jeder PRI ausgeloest meldung
PIR_DELAY = 10
# Wie lange die Wartezeit nach den MAX_COUNT ausgaben ist
PIR_IGNORE_TIME = 60
# aktuell ausgelöste PIR IRQs
current_count = 0
# PIR IRQs seit der letzten ausgabe
last_count = 0
# letzter Zeitpunkt der Ausgabe
last_time = 0
# auf True setzten für debug-ausgaben, sonst False
DEBUG = True
def mein_callback(pin):
global current_count
current_count += 1
if DEBUG:
print('DEBUG: PIR IRQ um %s zum %sten mal' % (time.strftime('%d.%m.%Y %H:%M:%S'), current_count))
# end main_callback
gpio.add_event_detect(23, gpio.RISING, callback = mein_callback)
if DEBUG:
print('DEBUG: PIR Testprogram wait for PIR IQR...')
try:
# main-loop - endlosschleife bis zum "harten" programmabbruch
while True:
# current_count > last_count -> PIR wurde seit der letzten ausgabe ausgelöst
# last_count < MAX_COUNT -> die obergrenze wurde noch nicht erreicht
# time.time() > (last_time + PRI_DELAY) -> Wartezeit zwischen den Nachrichten überschritten
if current_count > last_count and last_count < MAX_COUNT and time.time() > (last_time + PIR_DELAY):
# hier kommt der code für weitere aktionen (z.B. funktionen für foto, mail, etc. aufrufen)
print("PIR wurde %s mal ausgelöst" % current_count)
# last_count auf current_count setzten, damit nur neue IRQs nach der Ausgabe zählen
last_count = current_count
# Wenn die PIR IRQs MAX_COUNT überschreiten
if last_count >= MAX_COUNT:
if DEBUG:
print("DEBUG: Beginne tiefschlaf für %s sekunden" % PIR_IGNORE_TIME)
# Script für PIR_IGNORE_TIME schlafen legen, PIR IRQs zählen current_count weiter hoch!
time.sleep(PIR_IGNORE_TIME)
if DEBUG:
print("DEBUG: Beende tiefschlaf, es wurden %s PIR IRQs verschlafen" % (current_count - last_count))
# last_count und current_count zurücksetzen damit IRQs während der sleep-zeit nicht nachträglich feuern
last_count = 0
current_count = 0
# Main-Thread ein paar sekunde schlafen legen (lässt anderen Programmen mehr CPU)
time.sleep(5)
# end main-loop
except KeyboardInterrupt:
gpio.cleanup()
print('porgramm beendet')
# EOF
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment