Как мне определить нажатие кнопки gpiozero во время выполнения функции, вызываемой другой кнопкой?

#python #raspberry-pi3 #gpiozero

#python #raspberry-pi3 #gpiozero

Вопрос:

Мне нужно запустить реле нажатием кнопки и дождаться сигнала, а затем отпустить реле. В приведенном ниже примере кода этот сигнал равен b2. Я новичок в Python и Pi, но получаю удовольствие! 🙂

 import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
from gpiozero import Button
from signal import pause
import time

def first_button():
    print("First Pressed")
    while True: #do stuff...
        time.sleep(1)
        print("waiting...")

def second_button():
    print("Second Pressed")

b1 = Button(23)
b1.when_pressed = first_button
b2 = Button(24)
b2.when_pressed = second_button

pause()
  

Как мне определить нажатие кнопки, когда существующая функция, вызываемая кнопкой, все еще запущена?

Ответ №1:

В этом решении вы только включаете и выключаете вывод

 from gpiozero import Button
from signal import pause
import time

pin = #Set a pin
r = LED(pin)
b1 = Button(23)
b1.when_pressed = r.on
b2 = Button(24)
b2.when_pressed = r.off

pause()
  

Здесь запускается поток для выполнения чего-либо:

 from gpiozero import Button
from signal import pause
import time
import _thread

run = False
def do_stuff():
    while run: #do stuff...
        time.sleep(1)
        print("waiting...")

def first_button():
    global run
    print("First Pressed")
    run = True
    _thread.start_new_thread(do_stuff)
    

def second_button():
    global run
    print("Second Pressed")
    run = False

b1 = Button(23)
b1.when_pressed = first_button
b2 = Button(24)
b2.when_pressed = second_button

pause()
  

Комментарии:

1. Это имеет смысл, хотя кажется, что _thread был заменен модулем потоков, поэтому мне нужно будет изменить код для его запуска. «Ошибка импорта: нет модуля с именем _thread»

2. Какую версию вы используете? До версии 3.7 это был необязательный модуль docs.python.org/3/library/_thread.html