Created
April 27, 2017 20:45
-
-
Save anonymous/5c25da72e1c24705d626c46a99a59b18 to your computer and use it in GitHub Desktop.
Python PIR Sensor demo for Raspberry/Banana Pi using RPi.GPIO
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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