python - 如何在 Python 中创建动态回调函数? (RPi 3 GPIO)

标签 python python-3.x interrupt raspberry-pi3 gpio

我正在用 python3-6 为我的项目从头开始编写一个报警系统,使用树莓派 3 和一些报警组件(PIR、REED 等) 为了从组件接收警报,我使用 RPi.GPIO 库,该库已经具有内置中断功能。 这是我到目前为止编写的代码:更新于 2017 年 10 月 31 日 15:44

#Library Imports
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)
time_stamp = time.time()

def PIRcallback(channel):
    print ('Alarm detected: ' + PIR.Name + '\nMotion!')
def REEDcallback(channel):
    print ('Alarm detected: ' + REED.Name + '\nDoor!')
def VIBRcallback(channel):
    print ('Alarm detected: ' + VIBR.Name + '\nWindow!')

class Alarm:
    def __init__(self, IO, pin, Name, cb_var):
        self.IO = IO
        self.pin = pin
        self.Name = Name
        self.callback_func = cb_var
        if (IO == 'input'):
            GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
        elif (IO == 'output'):
            GPIO.setup(pin, GPIO.OUT)
        else:
            print ('Error: No input/output declared')
        self.addEvent('Up', 500)
    def addEvent(self, UpDown, btime):
        if (UpDown == 'Up'):
            UpDown = GPIO.RISING
        elif (UpDown == 'Down'):
            UpDown = GPIO.FALLING
        GPIO.add_event_detect(self.pin, UpDown, callback=self.cb, bouncetime=btime)
    def getPin(self):
        return self.pin
    def cb(self):
        global time_stamp
        time_now = time.time()
        print (time_now)
        if (time_now - time_stamp) >= 0.4:
            print (time_stamp)
            time_stamp = time_now
            self.callback_func()

#Testing Class Init     
REED = Alarm('input', 37, "REED", REEDcallback)
PIR = Alarm('input', 36, "PIR", PIRcallback)
VIBR = Alarm('input', 38, "VIBR", VIBRcallback)

try:
    while True:
        time.sleep(0.5)
except KeyboardInterrupt:
    print ("Terminating program...")
    time.sleep(1)
finally:
    GPIO.cleanup()
    print ("Cleaned GPIO!")

感谢您的帮助!

最佳答案

在Python中,函数本身就是一等变量,并且可以像任何其他变量一样传递。在这种情况下,您应该简单地将回调函数直接传递给您的 Alarm 构造函数,而不是名称:

class Alarm:
    def __init__(self, IO, pin, callback):
        self.IO = IO
        self.pin = pin
        self.callback_func = callback
        if (IO == 'input'):
            GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
        elif (IO == 'output'):
            GPIO.setup(pin, GPIO.OUT)
        else:
            print ('Error: No input/output declared')
        self.addEvent('Up', self.callback, 500)

    [...]

    def callback(self):
        global time_stamp
        time_now = time.time()
        if (time_now - time_stamp) >= 0.3:
            time_stamp = time_now
            return self.callback_func()  # <- Don't forget the parentheses here


#Testing Class Init    
REED = Alarm('input', 37, REEDcallback)
PIR = Alarm('input', 36, PIRcallback)
VIBR = Alarm('input', 38, VIBRcallback)
# This bit is now done in the constructor:
# VIBR.addEvent('Up', VIBR.callback, 500)
# PIR.addEvent('Up', PIR.callback, 500)
# REED.addEvent('Up', REED.callback, 500)

关于python - 如何在 Python 中创建动态回调函数? (RPi 3 GPIO),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47014425/

相关文章:

python-3.x - Matplotlib:每个刻度都有不同的颜色

c++ - STM32 NVIC ADC 中断未触发

c - 软件中断

python - ARP 中毒 scapy : Failure to get target MAC

python - tensorflow 变量分配广播

python - numpy ndarray 到 Pandas 数据框

python-3.x - 我们如何限制 Python 中 tkCalendar 日期输入选择器的 future 日期选择?

linux-kernel - 当内核代码被中断时会发生什么?

python - 如何在 tensorflow 中查找类型或打印变量详细信息\内容

python - 我如何为每个线程创建自己的日志记录实例?