Skip to content

Instantly share code, notes, and snippets.

@thomo
Last active January 3, 2016 17:21
Show Gist options
  • Save thomo/9ac4c994d881bb685012 to your computer and use it in GitHub Desktop.
Save thomo/9ac4c994d881bb685012 to your computer and use it in GitHub Desktop.
Raspberry PI - read a PIR sensor
#-------------------------------------------------------------------------------
# Copyright (c) 2015, Thomas Mohaupt <[email protected]>
# All rights reserved.
#
# This is a BSD 2-Clause license,
# see http://opensource.org/licenses/bsd-license.php
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# - Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# - Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#-------------------------------------------------------------------------------
import time,math,os
import syslog
import subprocess
try:
import RPi.GPIO as GPIO
except RuntimeError:
print ("Unable to import GPIO library.")
PIN_LED_1 = 24
PIN_LED_2 = 25
PIN_PIR_1 = 18
PIN_PIR_2 = 23
# additional timeout after pir switch output off (in sec)
TIMEOUT = 300
current_timestamp = lambda: int(round(time.time()))
monitor_is_off = True
timeout_mode = False
last_pir_event_timestamp = current_timestamp()
def pir_event_rising(ch):
global timeout_mode
syslog.syslog("Detect rising edge")
monitor_on()
timeout_mode = False
def pir_event_falling(ch):
global last_pir_event_timestamp
global timeout_mode
syslog.syslog("Detect falling edge")
last_pir_event_timestamp = current_timestamp()
timeout_mode = True
GPIO.output(PIN_LED_1, 0)
GPIO.output(PIN_LED_2, 1)
def is_timeout():
global last_pir_event_timestamp
global TIMEOUT
return math.fabs(current_timestamp() - last_pir_event_timestamp) > TIMEOUT
def monitor_on():
global monitor_is_off
if monitor_is_off:
syslog.syslog("Monitor on")
subprocess.call("sh /usr/local/bin/monitor_on.sh", shell=True)
GPIO.output(PIN_LED_1, 1)
GPIO.output(PIN_LED_2, 0)
monitor_is_off = False
def monitor_off():
global monitor_is_off
syslog.syslog("Monitor off")
subprocess.call("sh /usr/local/bin/monitor_off.sh", shell=True)
GPIO.output(PIN_LED_1, 0)
GPIO.output(PIN_LED_2, 0)
monitor_is_off = True
# ++++++++ MAIN +++++++++++++++++++++++++++++++++++++++++++++
syslog.syslog("Start pi-pir.py")
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(PIN_LED_1, GPIO.OUT)
GPIO.setup(PIN_LED_2, GPIO.OUT)
GPIO.setup(PIN_PIR_1, GPIO.IN)
GPIO.setup(PIN_PIR_2, GPIO.IN)
try:
GPIO.add_event_detect(PIN_PIR_1, GPIO.RISING)
GPIO.add_event_callback(PIN_PIR_1, pir_event_rising)
GPIO.add_event_detect(PIN_PIR_2, GPIO.FALLING)
GPIO.add_event_callback(PIN_PIR_2, pir_event_falling)
while (1):
if timeout_mode:
if is_timeout():
timeout_mode = False
monitor_off()
time.sleep(0.5)
except KeyboardInterrupt:
#Restore GPIO to default state
GPIO.remove_event_detect(PIN_PIR_1)
GPIO.remove_event_detect(PIN_PIR_2)
GPIO.cleanup()
syslog.syslog("Stop pi-pir.py")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment