Hallo,
brauche kurz euren Rat, ich erhalte folgende Fehlermeldung:
Code
Traceback (most recent call last):
File "./lufterwasser.py", line 215, in <module>
GPIO.add_event_detect(tasterM, GPIO.FALLING)
RuntimeError: You must setup() the GPIO channel as an input first
Was ich jedoch nicht nachvollziehen kann, denn meiner Meinung nach wird doch genau dies in Zeile 27 gemacht?!
Python
#!/usr/bin/python3
#Script zur Ansteuerung der Lüfter in Abhängigkeit der Umgebungsluft
#Import
from w1thermsensor import W1ThermSensor
import time
import RPi.GPIO as GPIO
from RPLCD import CharLCD, BacklightMode, cleared, cursor
import sys
#Display Initialisierung
lcd = CharLCD(pin_rs=26, pin_e=24, pins_data=[22, 18, 16, 12],
numbering_mode=GPIO.BOARD,
cols=16, rows=2, dotsize=8,
auto_linebreaks=True,
pin_backlight=None, backlight_enabled=True,
backlight_mode=BacklightMode.active_low)
lcd.close(clear=True)
#INIT
GPIO.setmode(GPIO.BOARD)
taster1 = 3 #Input
taster2 = 5
tasterM = 7
GPIO.setup(taster1, GPIO.IN)
GPIO.setup(taster2, GPIO.IN)
GPIO.setup(tasterM, GPIO.IN)
lufterhpower = 5 #Output
lufterlpower = 7
o_kritisch = 13
GPIO.setup(lufterhpower, GPIO.OUT)
GPIO.setup(lufterlpower, GPIO.OUT)
GPIO.setup(o_kritisch, GPIO.OUT)
#sensorluft = W1ThermSensor(W1ThermSensor.THERM_SENSOR_DS18B20, "000") #1Wire
#sensorwasser = W1ThermSensor(W1ThermSensor.THERM_SENSOR_DS18B20, "001")
lufterstatus = 0 #0=AUS, 1=lpwower, 2=hpower
lufterstatus_anzeige = ("Aus", "LPower", "HPower")
alarm_status = 0
alarm_anzeige = ("OK", "ALARM")
#gespeicherte Werte aus Textdatei auslesen
data = []
with open('config.txt') as f:
for line in f:
line.rstrip()
data.append(float(line))
if len(data) == 5:
on_5VModus = data[0]
off_5VModus = data[1]
on_12VModus = data[2]
off_12VModus = data[3]
tempkritisch = data[4]
else:
print("config.txt Datei fehlerhaft.")
sys.exit()
#Debugmodus 0=normal, 1=ausgabe, 2=1wireauslesen
modus = 1
#1Wire auslesen
if modus == 2:
for sensor in W1ThermSensor.get_available_sensrs():
print("Sensorliste:\nSensor %s hat die Temperatur %.2f" % (sensor.id, sensor.get_temperature()))
#Funktionen
#Funktion zum Überprüfen der Plausibilität der Messwerte
def plausibel(gesamt, messung, i):
durchschnitt = gesamt / i
delta = durchschnitt - messung
print(i)
print("Delta", delta)
return delta
#Funktion zum ausschalten des Lüfters
def lufteraus():
global lufterstatus
if lufterstatus == 1: GPIO.output(lufterlpower, 0)
elif lufterstatus == 2: GPIO.output(lufterhpower, 0)
lufterstatus = 0
return
#Funktion zum einschalten des Lüfters im 5V Betrieb
def lufterlpower_ein():
global lufterstatus
if lufterstatus == 0:
GPIO.output(lufterhpower, 1)
time.sleep(1)
GPIO.output(lufterhpower, 0)
time.sleep(0.2)
GPIO.output(lufterlpower, 1)
elif lufterstatus == 2:
GPIO.output(lufterhpower, 0)
time.sleep(0.2)
GPIO.output(lufterlpower, 1)
lufterstatus = 1
return
#Funktion zum einschalten des Lüfters im 12V Betrieb
def lufterhpower_ein():
global lufterstatus
if lufterstatus == 0:
GPIO.output(lufterhpower, 1)
elif lufterstatus == 1:
GPIO.output(lufterlpower, 0)
time.sleep(0.2)
GPIO.output(lufterhpower, 1)
lufterstatus = 2
return
#Alarm Funktion
def alarm():
global alarm_status
GPIO.output(o_kritisch, 1)
alarm_status = 1
return
def alarm_aus():
global alarm_status
GPIO.output(o_kritisch, 0)
alarm_status = 0
return
#Display aktualisieren
def display_aktualisieren(wert1, wert2, wert3, wert4):
cleared(lcd)
lcd.corsor_pos = (0, 0)
lcd.write_string(wert1, wert2)
lcd.corsor_pos = (1, 0)
lcd.writer_string(wert3, wert4)
return
#Menüsteuerung
def menuesteuerung():
time.sleep(0.3)
counter = 0
menue = f_menue()
global data
GPIO.add_event_detect(taster1, GPIO.FALLING)
GPIO.add_event_detect(taster2, GPIO.FALLING)
display = False
i=0
while i < 10:
# Display-Anzeige
if display == False:
if modus == 1: print("Display: " + menue[counter][0] + " ", data[counter])
elif modus == 0: display_aktualisieren(menue[counter][0], "", data[counter], "")
display = True
if GPIO.event_detected(tasterM):
if len(menue) - 1 == counter:
counter = 0
else:
counter += 1
display = False
i=0
if GPIO.event_detected(taster1):
if menue[counter][1] == "plus":
data[counter] += menue[counter][3]
elif menue[counter][1] == "shutdown":
lufteraus()
GPIO.cleanup()
display = False
i=0
if GPIO.event_detected(taster2):
if menue[counter][2] == "minus":
data[counter] -= menue[counter][3]
display = False
i=0
print(i)
i += 1
time.sleep(1)
#Exit
GPIO.remove_event_detect(taster1)
GPIO.remove_event_detect(taster2)
writeData(data)
print("Ende")
return
def writeData(data):
# speichern
with opfen("config.txt", "w") as out:
for i in data:
out.write("{:.1f\n}".format(i))
global on_5VModus
global off_5VModus
global on_12VModus
global off_12VModus
global tempkritisch
[on_5VModus, on_12VModus, off_12VModus, tempkritisch] = data
return
#Menüführung
def f_menue():
menue = [["5V Modus", "plus", "minus", 0.5],
["5V Modus AUS", "plus", "minus", 0.5],
["12V Modus", "plus", "minus", 0.5],
["12V Modus AUS", "plus", "minus", 0.5],
["Kritische Temp.", "plus", "minus", 0.5],
["System OFF", "shutdown",""]]
return menue
#Programm
try:
GPIO.add_event_detect(tasterM, GPIO.FALLING)
#GPIO.remove_event_detect(taster1)
while True:
print("Taster drücken")
time.sleep(4)
if GPIO.event_detected(tasterM):
print("Taste gedrückt:")
menuesteuerung()
templufttmp = 0
tempwassertmp = 0
#Messung für Lufttemp durchführen
for i in range(1, 4):
templuft = input("Messung Luft:") # sensorluft.get_temperature()
templuft = float(templuft)
templufttmp = templufttmp + templuft
delta = plausibel(templufttmp, templuft, i)
if delta > 1 or delta < -1 : continue
#Messung für Wassertemp durchführen
for i in range(1, 4):
tempwasser = input("Messung Wasser:") # sensorwasser.get_temperature()
tempwasser = float(tempwasser)
tempwassertmp = tempwassertmp + tempwasser
delta = plausibel(templufttmp, templuft, i)
if delta > 1 or delta < -1 : continue
#Lüfter passend schalten
if tempwasser <= templuft + off_5VModus:
if lufterstatus != 0: lufteraus()
elif tempwasser >= templuft + on_5VModus and tempwasser < on_12VModus:
if lufterstatus != 1: lufterlpower_ein()
elif tempwasser >= on_12VModus:
if lufterstatus != 2: lufterhpower_ein()
#Hat das Wasser kritische Temperatur
if tempwasser >= tempkritisch and alarm_status == 0: alarm()
elif tempwasser <= tempkritisch and o_kritisch == 1: alarm_aus()
#Anzeige
if modus == 0:
#Displaysteuerung
display_aktualisieren(tempwasser, lufterstatus_anzeige[lufterstatus], templuft, alarm_anzeige[alarm_status])
elif modus == 1:
print('WT', tempwasser, lufterstatus_anzeige[lufterstatus])
print('LT', templuft, alarm_anzeige[alarm_status])
print(alarm_status)
except KeyboardInterrupt:
GPIO.cleanup()
sys.exit()
Display More
Sicherlich finden sich in dem Skript noch viele weitere Fehler, da es das erste "Projekt" ist und dies sich auch erst in der "Suche die Fehler" Phase befindet. Deshalb auch noch vieles auskommentiert oder print Befehle. Genauso wird man auch vieles anders lösen können, aber das soll hier mal noch gar nicht das Thema sein ![]()