Как вы можете вырваться из вложенного в то время как l oop в python с помощью 2 обратных вызовов gpio - PullRequest
0 голосов
/ 07 января 2020

Цель этого сценария python - использовать две кнопки gpio для приведения в действие клапана, который будет открываться в течение 30 секунд каждые 1800 секунд после проверки локальной температуры и обеспечения того, что она ниже нуля.

Проблема, с которой я столкнулся, заключается в том, что я хочу использовать вторую кнопку для вызова функции, которая в основном действует, чтобы остановить программу приведения в действие клапана и оставить клапан открытым, как только он будет нажат, не дожидаясь первой функции (заморозка), чтобы fini sh.

Я хочу иметь возможность запускать и останавливать эти функции без перезапуска скрипта. Любая помощь будет высоко ценится.

import RPi.GPIO as GPIO
from signal import pause
import time
import json, requests


GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)

GPIO.setup(20, GPIO.OUT) #valve pin 1
GPIO.setup(21, GPIO.OUT) #valve pin 2
GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) #On push button
GPIO.setup(27, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) #Off push button

GPIO.output(16, 1)
GPIO.output(12, 0)
breaker=0

def weather(): #get temperature
    url = requests.get('http://api.openweathermap.org/data/2.5/weather?id=######&units=imperial&APPID=#############')
    weather = json.loads(url.text)
    return weather['main']['temp']
def valve_open(): #open valve
    GPIO.output(20, 1)
    GPIO.output(21, 0)
    time.sleep(7)
def valve_close(): #close valve
    GPIO.output(20, 0)
    GPIO.output(21, 1)
    time.sleep(7)
def freeze(channel):
    global breaker
    breaker=0
    while True:
        global breaker
        if breaker == 1:
            break
        else:
            temp = weather()
            if temp <=32:
                valve_open()
                open_timer=0
                while open_timer <=30:
                    if breaker == 1:
                        break
                    time.sleep(1)
                    open_timer=open_timer+1
                valve_close()
                closed_timer=0
                while closed_timer<=1800:
                    if breaker == 1:
                        break
                    time.sleep(1)
                    closed_timer=closed_timer+1
            elif temp >32:
                time.sleep(60)
def unfreeze(channel):
    global breaker
    breaker=1
    valve_open()

valve_open()

GPIO.add_event_detect(17, GPIO.RISING, callback=freeze, bouncetime=800)
GPIO.add_event_detect(27, GPIO.RISING, callback=unfreeze, bouncetime=800)

pause()
GPIO.cleanup


...