我需要有关使用GPIOZero库构建的警报系统代码的帮助(老板非常喜欢该库)。该系统用于笔记本电脑推车,因此人们不会忘记关闭门,因为如果人们将其长时间打开,则会响起蜂鸣器。因此,我要执行的操作非常简单,但是它总是等待函数完成后再转到下一个:
如果门打开:记录时间,时间延迟,蜂鸣器打开
如果门关闭/关闭:蜂鸣器关闭,记录时间
是否有一种方法可以不等待GPIOZero库中的函数完成。请让我知道!
from gpiozero import Button
from signal import pause
from gpiozero import Buzzer
from gpiozero import LED
from time import sleep
##### VARIABLES DEF #######
button = Button(21, pull_up=True)
buzzer = Buzzer(4)
def door_opened():
f = open("log" + '.txt', 'a')
f.write("Opened " + time.strftime("%m-%d-%Y %X"))
f.close()
print("Door Open")
sleep(100)
print("door held, alarm on")
buzzer.on
def door_closed():
f = open("log" + '.txt', 'a')
f.write(" " + time.strftime("%X"))
f.write('\n')
f.close()
print("Door Closed")
buzzer.off()
print("Buzzer off")
button.when_pressed = door_closed
button.when_released = door_opened
pause()
答案 0 :(得分:1)
您将需要重新组织一下才能完成此工作。
这里的想法是,您有一对由GPIOZero事件处理程序更新的全局变量:
door_is_open
–门打开时为真door_open_counter
–计算打开门的秒数(实际上,事件处理程序仅将其重置为零)。还有一个无限的主循环,每秒滴答一次,它读取door_is_open
变量并递增打开计数器...最后,如果打开计数器达到所需的阈值(此处为5秒,因为不耐烦的人),它会打开buzzer
。
door_closed
处理程序负责重置buzzer
,但这也可以在主循环中完成。
我还自由地将日志重构为它自己的功能,该功能也方便地在控制台上打印相同的内容。 (顺便说一句,我建议使用ISO 8601日期格式,但我不想在此强加它。)
进一步的重构可能会将所有这些包装在一个整洁的类中,以避免全局变量。
(所有代码都是干式编码的,因此您的里程可能会有所不同,但是这个想法应该可行。:))
import time
from gpiozero import Button, Buzzer
button = Button(21, pull_up=True)
buzzer = Buzzer(4)
door_is_open = False
door_open_counter = 0
def log_event(text):
print(log_line)
with open("log.txt", "a") as log_file:
log_line = "%s | %s" % (time.strftime("%m-%d-%Y %X"), text)
log_file.write(log_line + "\n")
def door_opened():
global door_is_open
global door_open_counter
log_event("Opened")
door_is_open = True
door_open_counter = 0
def door_closed():
global door_is_open
global door_open_counter
log_event("Closed")
buzzer.off()
door_is_open = False
door_open_counter = 0
button.when_pressed = door_closed
button.when_released = door_opened
while True:
time.sleep(1)
if door_is_open:
door_open_counter += 1
if door_open_counter >= 5:
buzzer.on()