GuyCarver-MicroPython/Lib/PIR.py

73 wiersze
2.1 KiB
Python

#Passive infrared motipower sensor.
import pyb
class PIR(object):
"""Passive Infrared Motion Sensor driver. Supports on/off through an output pin
trigger reading as well as an interrupt callback on trigger high/low changes."""
def __init__(self, power, trigger, callback = None):
"""Power and trigger pins, optional interrupt callback in the format
of fun( bOnOff ). This will be called whenever the trigger state
changes."""
if power != None:
self._power = pyb.Pin(power, pyb.Pin.OUT_PP)
self._power.low()
else:
self._power = None
self._trigger = pyb.Pin(trigger, pyb.Pin.IN, pyb.Pin.PULL_DOWN)
self.interrupt = callback
def _onoff( self, aTF ) :
"""Turn device on/off"""
if (self._power != None):
if (aTF):
oldon = self.inton
self.inton = False #Make sure interrupt is off while turning on power to avoid false callbacks.
self._power.high()
if (oldon):
pyb.delay(200) #Need to wait a bit after turning on to make sure we don't get false values.
self.inton = oldon
else:
self._power.low()
@property
def power(self): return True if (self._power == None) else self._power.value()
@power.setter
def power(self, value): self._onoff(value)
def on( self ) : self.power = True
def off( self ) : self.power = False
@property
def trigger(self): return self._trigger.value()
@property
def interrupt(self): return self._interrupt
@interrupt.setter
def interrupt(self, func):
self._interrupt = None;
self._func = func
if (func != None):
self._interrupt = pyb.ExtInt(self._trigger, pyb.ExtInt.IRQ_RISING_FALLING, pyb.Pin.PULL_DOWN, self._inthandler)
self._inton = True
def _inthandler(self, line):
'''Function to handle interrupts and pass on to callback with on/off trigger state.'''
if (self._func != None):
self._func(self.trigger)
@property
def inton(self): return self._inton
@inton.setter
def inton(self, value):
self._inton = value
if self._interrupt != None:
if value :
self._interrupt.enable()
else:
self._interrupt.disable()