kopia lustrzana https://github.com/GuyCarver/MicroPython
73 wiersze
2.2 KiB
Python
73 wiersze
2.2 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()
|