Цель этого сценария 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