首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GPIOZero Pi报警系统:需要时间延迟的替代

GPIOZero Pi报警系统:需要时间延迟的替代
EN

Stack Overflow用户
提问于 2019-03-11 14:00:27
回答 1查看 187关注 0票数 0

我需要帮助我的警报系统代码,我正在构建的GPIOZero库(我的老板非常喜欢这个库)。该系统是为笔记本电脑推车,所以人们不会忘记关闭门,因为有一个蜂鸣器响,如果人们把它打开太长时间。因此,我希望它所做的事情非常简单,但它总是等待函数完成,然后再转到下一个:

如果门打开:日志时间,时间延迟,蜂鸣器打开

如果门关闭/关闭:蜂鸣器关闭,记录时间

是否有一种方法不等待函数在GPIOZero库中完成。请让我知道!

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-11 16:35:28

你得稍微调整一下结构才能完成这件事。

这里的想法是,您有一对由GPIOZero事件处理程序更新的全局变量:

  • door_is_open -当门打开时是正确的
  • door_open_counter -计算门被打开的秒数(这实际上只被事件处理程序重置为零)。

还有一个无限的主循环,每秒运行一次,它读取door_is_open变量并增加打开的计数器.最后,如果打开的计数器达到了所需的阈值(5秒,因为我们是不耐烦的人),它就会打开buzzer

door_closed处理程序负责重置buzzer,但这也可以在主循环中完成。

我还冒昧地将日志重构为自己的函数,并且轻松地将相同的内容打印到控制台。(顺便提一下,我建议使用ISO 8601日期格式,但我不想在这里强制使用。)

进一步的重构可能会将所有这些都封装在一个整洁的类中,以避免全局变量。

(所有这些都是干编码的,所以你的里程可能会不同,但这个想法应该可行。*)

代码语言:javascript
复制
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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55103554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档