Lacsap93 hat geschrieben: Dienstag 7. Januar 2020, 16:45
Ach so da habe ich dich falsch verstanden. Es kann sein, dass sich die Fehler nur kurzzeitig anstehen und sich selber quittieren. Diese möchte ich aber trotzdem angezeigt haben. Ich werde mir dein Programm morgen noch genauer anschauen.
Ok, in dem Fall solltest du mit Callbacks arbeiten.
Je nach verwendeter Bibliothek für die GPIOs kann man einen Eingang eine Ereigniserkennung zuweisen.
D.h. Klasse Alarms müsste dann die Callbacks registrieren.
Mit der steigenden Flanke Fehler setzen und mit der fallenden Flanke um Fehler wieder löschen.
Code: Alles auswählen
import time
import datetime
import RPi.GPIO as gpio
class Alarms:
def __init__(self, alarm_mapping):
self.active_alarms = {}
self.alarm_mapping = alarm_mapping
def setup(self):
for pin in self.alarm_mapping:
gpio.setup(pin, gpio.IN, gpio.PUD_DOWN)
gpio.add_event_detect(pin, gpio.BOTH, self.callback, bouncetime=200)
def callback(self, pin):
state = gpio.input(pin)
if state:
self.set_alarm(pin)
elif pin in self.active_alarms:
del self.active_alarms[pin]
# Fehlermeldungen ausgeben
self.log_alarm_messages()
# Kann auch später eine andere Funktion abrufen, um irgendwas auszulösen
def set_alarm(self, pin):
self.active_alarms[pin] = {
"ts": datetime.datetime.utcnow(),
"msg": self.alarm_mapping[pin],
}
@property
def alarm_messages(self):
return [alarm["msg"] for alarm in self.active_alarms.values()]
def log_alarm_messages(self):
now = datetime.datetime.utcnow().isoformat()
print(f'{now}: {self.alarm_messages}')
gpio.setmode(gpio.BCM)
alarm_mapping = {17: "Fehler 0", 27: "Fehler 1", 22: "Fehler 2", 22: "Fehler 3"}
a = Alarms(alarm_mapping)
a.setup()
# später im programm
# last_alarms = a.alarm_messages
# while True:
# time.sleep(1)
# current_alarms = a.alarm_messages
# if last_alarms != current_alarms:
# last_alarms = current_alarms
# print(current_alarms)
Ich habe das mal mit den 3 Eingängen auf einem Raspberry Pi 4 getestet. Bei einer Bouncetime von 200ms, kann man die Eingänge auch mit einer Drahtbrücke testen.
(Auf den GND aufpassen und nur die 3.3V, PIN 1verwenden.)
Wählt man die Bouncetime zu kurz, kann fallende Flanke oder steigende Flanke mehrmals ausgelöst werden (prellen).
Wählt man die Bouncetime zu lang und ein Signal liegt kürzer an, als die Bouncetimne, kommt es zu keinem Ereignis.
Wenn du das Programm ausführst, beendet es sich gleich wieder.
Zum Testen kannst du das ja im interaktiven Modus starten:
Das lädt dann das Programm und öffnet die REPL.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server