Hi
Ich habe ein Programm geschrieben, bei dem ich Sensorwerte einlese und mittels AD Wandler Poti Werte als Vergleich einlese
Ziel ist es mittels Schalter und IF Anweisung am GPIO 5 das Programm zwischen Automatikmodus und Schlafmodus hin und her zu schalten-
Leider funktioniert das nicht so wie ich will
Das Program reagiert auf den Schalter nicht.
Wenn ich mittels print den Status des GPIO's auslese, dann sehe ich aber den wechsel von True auf False
Eine weiterführende Frage ist, ob es eine Möglichkeit gibt, dass die Sensorwerte und auch die Potiwerte nur eingelesen werden, wenn eine Änderung erkennbar ist.
Ich habe schon recherchiert bezüglich Interupt und Callback funktion aber ich werde daraus einfach nicht schlau.
Python
#Reifeschrank
#28.02.2022
#Bibliotheken laden
import time
from bme280 import readBME280All
from gpiozero import DigitalOutputDevice
from gpiozero import DigitalInputDevice
import ADS1x15
import lcdlib
#Konstanten definiern.
#Minimal und Maximalwerte für einlesen des Luftfeuchte Poti
HUMIDITY_MIN = 0
HUMIDITY_MAX = 100
#Minimal und Maximalwerte für einlesen des Temperature Poti
TEMPERATURE_MIN = 0
TEMPERATURE_MAX = 25
#Limitwerte für Ein und Ausschalten der Heizung + Umluftventilator und Kühlung
TEMPERATURE_UPPER_LIMIT = 3
TEMPERATURE_UNDER_LIMIT = 3
#Limitwerte für Ein und Ausschalten des Befeuchters und der Frischluftventilatoren
HUMIDITY_UPPER_LIMIT = 5
HUMIDITY_UNDER_LIMIT = 5
#Umrechnung der Eingangswerte von 0 -32767 auf die vorgegebenen Min Max Temperatur und Min Max Luftfeuchte.
def convert_value_Poti(value,type_of_value,TEMPERATURE_MAX,TEMPERATURE_MIN,HUMIDITY_MAX,HUMIDITY_MIN):
if type_of_value == ('humidity'):
return((((HUMIDITY_MAX-HUMIDITY_MIN)/32767)*value)+HUMIDITY_MIN)
elif type_of_value == ('temperature'):
return((((TEMPERATURE_MAX-TEMPERATURE_MIN)/32767)*value)+TEMPERATURE_MIN)
#Funktion für Kanalwahl
def read_adc(adc):
adc_values = []
for channel in range(2):
adc_values.append(adc.read_adc(channel, gain=2))
return adc_values[0], adc_values[1]
#Funktion zur Berechnung der zugelassenen Maximal und Minimalabweichung der Temperatur
#Auf eine Stelle gerundet
def temperature_max_min(temperature_poti,TEMPERATURE_MAX,TEMPERATURE_MIN):
temperature_max_poti = round(temperature_poti + TEMPERATURE_UPPER_LIMIT,1)
temperature_min_poti = round(temperature_poti - TEMPERATURE_UNDER_LIMIT,1)
return temperature_max_poti, temperature_min_poti
#Funktion zur Berechnung der zugelassenen Maximal und Minimalabweichung der Luftfeuchte
#Auf eine Stelle gerundet
def humidity_max_min(humidity_poti,HUMIDITY_MAX,HUMIDITY_MIN):
humidity_max_poti = round(humidity_poti + HUMIDITY_UPPER_LIMIT,1)
humidity_min_poti = round(humidity_poti - HUMIDITY_UNDER_LIMIT,1)
return humidity_max_poti, humidity_min_poti
#Stringerzeugung der Soll und Isttemperatur für die LCD Anzeige
def temperature_string(temperature_sensor,temperature_poti):
temperature_set = "Isttemp. " + str(temperature_sensor) + " C "
temperature_actual = "Solltemp. " + str(temperature_poti) + " C "
return temperature_set, temperature_actual
#Stringerzeugung der Soll und Istfeuchte für die LCD Anzeige. Wert wird in der Funktion auf 1 Stelle gerundet
def humidity_string(humidity_sensor,humidity_poti):
humidity_sensor = round(humidity_sensor,1)
humidity_poti = round(humidity_poti,1)
humidity_set = "Istfeuchte " + str(humidity_sensor) + " % "
humidity_actual = "Sollfeuchte " + str(humidity_poti) + " % "
return humidity_set, humidity_actual
#Hauptprogramm
def main():
#adc für Definition des 16BIT Wandlers (ADS1015 wäre 12BIT)
adc = ADS1x15.ADS1115()
#Initialisieren der GPIO Aus und Eingänge (Variablen vergeben)
cooling = DigitalOutputDevice(13) #Kühlung
moist = DigitalOutputDevice(6) #Befeuchter
circulation = DigitalOutputDevice(18) #Lüfter für Umluft
freshair = DigitalOutputDevice(22) # Lüfter für Frischluft
switch = DigitalInputDevice(5,pull_up=True,bounce_time = 100) #Schalter für Automatikbetrieb
heating = DigitalOutputDevice(12) #Heizmatten
#Display initialisierne
# LCD-Adresse
ADDRESS = 0x27
# Objekt erzeugen und Display initialisieren
# Angabe: Adresse, Anzahl Zeilen, Anzahl Spalten
lcd = lcdlib.lcd(ADDRESS,4,20)
# Bildschirm löschen
lcd.clear()
lcd.backlight_on()
#Cursor auf 0,0 setzen
lcd.home()
while True:
if switch == True:
print(switch)
#Einlesen Poti und Sensorwerte
#Funktionsaufruf für Potieinlesen
temperature_in_poti, humidity_in_poti = read_adc(adc)
temperature_poti = round(convert_value_Poti(temperature_in_poti, 'temperature', TEMPERATURE_MAX,TEMPERATURE_MIN,HUMIDITY_MAX,HUMIDITY_MIN),1)
humidity_poti = round(convert_value_Poti(humidity_in_poti, 'humidity',TEMPERATURE_MAX,TEMPERATURE_MIN,HUMIDITY_MAX,HUMIDITY_MIN),1)
#Funktionsaufruf BME280 um die Sensorwerte Luftfeuchte und Temperatur einzulesen
temperature_sensor,pressure_sensor,humidity_sensor = readBME280All()
#Berechnung der Grenzwerte/Hysterse für die Regelung
#Funktionsaufruf für Berechnung der Temperaturgrenzwerte und aufteilen der Liste in max und min Variable
temperature_max_poti, temperature_min_poti = temperature_max_min(temperature_poti,TEMPERATURE_MAX,TEMPERATURE_MIN)
#Funktionsaufruf für Berechnung der Luftfeuchegrenzwerte und aufteilen der Liste in max und min Variablen
humidity_max_poti, humidity_min_poti = humidity_max_min(humidity_poti,HUMIDITY_MAX,HUMIDITY_MIN)
#Anzeige am Display
#Funktionsaufruf für die Stringerzeugung Temperatur
temperature_sensor_string, temperature_poti_string = temperature_string(temperature_sensor,temperature_poti)
#Funktionsaufruf für die Stringerzeugung Luftfeuchte
humidity_sensor_string, humidity_poti_string = humidity_string(humidity_sensor,humidity_poti)
#Funktionsaufruf für LCD Anzeige Temperatur Istwert inder 1 Reihe ganz links
lcd.display_string(temperature_sensor_string, 0, 0)
#Funktionsaufruf für LCD Anzeige Temperatur Sollwert in der 2 Reihe ganz links
lcd.display_string(temperature_poti_string,1,0)
#Funktionsaufruf für LCD Anzeige Luffeuchte Istwert in der 3 Reihe ganz links
lcd.display_string(humidity_sensor_string, 2, 0)
#Funktionsaufruf für LCD Anzeige Luffeuchte Sollwert in der 3 Reihe ganz links
lcd.display_string(humidity_poti_string,3,0)
#Auswerten der Ist und Sollwerte für die GPIO Regelung
#Ein und Ausschalten der Heizung mit Umluft mittels GPIO. Wenn die Temperatur den Grenzwert unterschritten hat wird der GPIO auf on gesetzt ansonsten off
if temperature_sensor < temperature_min_poti:
heating.on()
circulation.on()
lcd.display_string(" ",1,0)
lcd.display_string("Temp. zu niedrig!! ",1,0)
time.sleep(0.5)
else:
heating.off()
circulation.off()
lcd.display_string(temperature_poti_string,1,0)
#Ein und Ausschalten der Kühlung mittels GPIO. Wenn die Temperatur den Grenzwert überschritten hat wird der GPIO auf on gesetzt ansonsten off
if temperature_sensor > temperature_max_poti:
cooling.on()
lcd.display_string(" ",1,0)
lcd.display_string("Temp. zu hoch!! ",1,0)
time.sleep(0.5)
else:
cooling.off()
lcd.display_string(temperature_poti_string,1,0)
#Ein und Ausschalten der Befeuchtung GPIO. Wenn die Luftfeuchte den Grenzwert unterschritten hat wird der GPIO auf on gesetzt ansonsten off
if humidity_sensor < humidity_min_poti:
moist.on()
lcd.display_string(" ",3,0)
lcd.display_string("Feuchte zu niedrig!! ",3,0)
time.sleep(0.5)
else:
moist.off()
lcd.display_string(humidity_poti_string,3,0)
#Ein und Ausschalten der Frischluft GPIO. Wenn die Luftfeuchte den Grenzwert überschritten hat wird der GPIO auf on gesetzt ansonsten off
if humidity_sensor > humidity_max_poti:
freshair.on()
lcd.display_string(" ",3,0)
lcd.display_string("Feuchte zu hoch!! ",3,0)
time.sleep(0.5)
else:
freshair.off()
lcd.display_string(humidity_poti_string,3,0)
time.sleep(0.5)
else:
print(switch)
time.sleep(1)
if __name__ == '__main__':
main()
Alles anzeigen
Code
<gpiozero.DigitalInputDevice object on pin GPIO5, pull_up=True, is_active=True>
<gpiozero.DigitalInputDevice object on pin GPIO5, pull_up=True, is_active=True>
<gpiozero.DigitalInputDevice object on pin GPIO5, pull_up=True, is_active=True>
<gpiozero.DigitalInputDevice object on pin GPIO5, pull_up=True, is_active=True>
<gpiozero.DigitalInputDevice object on pin GPIO5, pull_up=True, is_active=True>
<gpiozero.DigitalInputDevice object on pin GPIO5, pull_up=True, is_active=True>
<gpiozero.DigitalInputDevice object on pin GPIO5, pull_up=True, is_active=False>
<gpiozero.DigitalInputDevice object on pin GPIO5, pull_up=True, is_active=False>
<gpiozero.DigitalInputDevice object on pin GPIO5, pull_up=True, is_active=False>
<gpiozero.DigitalInputDevice object on pin GPIO5, pull_up=True, is_active=False>