Вам придется немного перестроить вещи, чтобы сделать это.
Идея в том, что у вас есть пара глобальных переменных, которые обновляются обработчиками событий 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()