GPIOZero Pi 警报系统:需要替代时间延迟
GPIOZero Pi Alarm system: Need alternative for time delay
我需要有关我使用 GPIOZero 库构建的警报系统代码的帮助(我的老板真的很喜欢这个库)。该系统适用于笔记本电脑推车,因此人们不会忘记关门,因为如果人们将门打开时间过长,蜂鸣器就会响起。所以我想让它做的事情非常简单,但它总是等待函数完成后再进行下一步:
如果门打开:记录时间、延时、蜂鸣器打开
如果门是closed/closes:蜂鸣器关闭,记录时间
有没有办法不等待 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()
您需要稍微调整一下结构才能完成此操作。
这里的想法是你有一对由 GPIOZero 事件处理程序更新的全局变量:
door_is_open
– 门打开时为真
door_open_counter
– 计算门打开的秒数(这实际上只是由事件处理程序重置为零)。
还有一个每秒滴答一次的无限主循环,它读取 door_is_open
变量并增加打开计数器...最后,如果打开计数器达到所需的阈值(这里是 5 秒,因为我们是不耐烦的人),它会打开 buzzer
。
door_closed
处理程序负责重置 buzzer
,但这也可以在主循环中完成。
我还冒昧地将日志记录重构为它自己的一个函数,该函数还可以轻松地将相同的内容打印到控制台。 (顺便说一句,我建议使用 ISO 8601 日期格式,但我不想在这里强加。)
进一步的重构可能会将这一切包装在一个整洁的 class 中以避免全局变量。
(这一切都是干编码的,所以你的里程可能会有所不同,但这个想法应该可行。:))
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()
我需要有关我使用 GPIOZero 库构建的警报系统代码的帮助(我的老板真的很喜欢这个库)。该系统适用于笔记本电脑推车,因此人们不会忘记关门,因为如果人们将门打开时间过长,蜂鸣器就会响起。所以我想让它做的事情非常简单,但它总是等待函数完成后再进行下一步:
如果门打开:记录时间、延时、蜂鸣器打开
如果门是closed/closes:蜂鸣器关闭,记录时间
有没有办法不等待 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()
您需要稍微调整一下结构才能完成此操作。
这里的想法是你有一对由 GPIOZero 事件处理程序更新的全局变量:
door_is_open
– 门打开时为真door_open_counter
– 计算门打开的秒数(这实际上只是由事件处理程序重置为零)。
还有一个每秒滴答一次的无限主循环,它读取 door_is_open
变量并增加打开计数器...最后,如果打开计数器达到所需的阈值(这里是 5 秒,因为我们是不耐烦的人),它会打开 buzzer
。
door_closed
处理程序负责重置 buzzer
,但这也可以在主循环中完成。
我还冒昧地将日志记录重构为它自己的一个函数,该函数还可以轻松地将相同的内容打印到控制台。 (顺便说一句,我建议使用 ISO 8601 日期格式,但我不想在这里强加。)
进一步的重构可能会将这一切包装在一个整洁的 class 中以避免全局变量。
(这一切都是干编码的,所以你的里程可能会有所不同,但这个想法应该可行。:))
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()