GPIOZero Pi Сигнализация: нужна альтернатива для задержки - PullRequest
0 голосов
/ 11 марта 2019

Мне нужна помощь с кодом системы сигнализации, которую я создаю с помощью библиотеки 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()

1 Ответ

1 голос
/ 11 марта 2019

Вам придется немного перестроить вещи, чтобы сделать это.

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