Rpi.GPIO, GPIO.OUT code fuer Flanke FALLING

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,

    wie kann ich GPIO. setup(27, GPIO.OUT)

    als FALLING Flanke von GPIO. input(27)== GPIO.LOW abfragen?

    MIt GPIO.IN weiss ich wie das geht aber mit GPIO.OUT?

    Dieses script funktioniert so weit, aber das Licht ist immer aus da es immer wieder von GPIO.input(27) == GPIO.LOW auf aus gesteuert wird.

    Brauche desshalb eine Erkennung mittels FALLING Flanke.

    Koennt ihr mir da bitte auf die Spruenge helfen?

    Gruss

    Thomas

    Einmal editiert, zuletzt von gwaag (29. Juli 2020 um 13:38)

  • Aus Python wieder Python per subprocess aufzurufen sieht nach einem würgaround aus. Warum lässt du den Code nicht direkt laufen?

    Und wenn du den Wert von high auf low setzt, dann weißt du doch, wann du dS machst, und kannst entsprechend drauf reagieren.

  • keepfear

    normalerweise arbeite ich mit gpiozero, leider schlecht dokumentiert.

    hast Du ein beispiel wie man die neg. Flanke von einem Ausgang abfraegt?

    @deets

    Ja ist wuerg, aber fuer mich uebersichlicher und einfacher zum programmieren.

    Wie soll ich darauf reagieren wenn er auf low geht aber das signal low immer ansteht? Mit einer Flanke schaltet es den subrocess und kann dann low bleiben, dann passiet nichts mehr bis zur naechsten Flanke.

    gruss

    gwaag

    • Offizieller Beitrag

    leider schlecht dokumentiert

    =O Ganz im Gegenteil!

    Du kannst z.B. von OutputDevice den value-Wert abfragen. Zum Verständnis: https://gpiozero.readthedocs.io/en/stable/source_values.html

  • Keine Ahnung ob die Doku von Gpiozero schlecht ist.

  • Du sprichst in rätseln. Wenn low immer anliegt, dann hast du keine negative Flanke. Weil ohne Wechsel von High nach Low kann es dir nicht geben.

    Irgendwo in deinem Code steht doch etwas der Art

    Code
    if Bedingung: 
        mein_toller_pin.output(False)
        # hier machen, was auch immer du willst 

    und da wo der Kommentar steht, musst du halt was tun.

    • Offizieller Beitrag

    keepfear Er will einen Output detektieren, nicht einen Input. ;)

    @__deets__ Ich vermute ein anderes Skript schaltet die Lampe, aber so ganz schlau werde ich da auch nicht draus, denn das was aufgerufen wir kanns ja nicht sein. :conf:

  • Keine Ahnung ob die Doku von Gpiozero schlecht ist.

    Das ist der Fall für Eingaben. Er will aber bei Änderung der Ausgaben was machen.

    Ich vermute mal das ganze Problem kommt zustande, weil er das andere Skript so umständlich aufruft. Und DAS steuert den pin an, und darauf würde er gerne reagieren.

    gwaag kommt die vermutung hin? Generell könntest du mal deutlich mehr ausholen.

  • Danke fuer die Kommentare soweit.

    Hier meine Steuerung.

    Die Zeiten wo die Bewaeserung arbeiten soll.

    Script Bewasserungszeiten.py

    Hier macht das Ventil auf/zu

    Script Zone2vonHand.py


    Hier schatet es das licht ein /aus ( licht_aus.py nicht dargestell, ist aber fast identisch)

    Script licht_aus.py

    Wenn das Ventil geschlossen ist, ist der GPIO.OUT auf 0 und bleib auf 0, bis zum naechsten mal einschalten.

    Da die Wifi Lame auch ueber eine Fernsteuerung angesteuert werden kann, geht das Licht immer sofort wieder aus (wenn von der Fernsteuerung eingeschaltet) da:

    Code
    GPIO.output(27, GPIO.LOW)  #   ruft mit  suprocess.call licht_aus.py, da wird der Befehl Zone3 = OFF immer gesendet wird

    Desshalb muss mit einer Flanke geschaltet werden. Das Script mit gpiozero kenne ich, ist aber fuer einen Input.

    Ich brauche aber eine Loesung wie deets richtig erkannt hat fuer einen GPIO.OUT.

    gruss

    gwaag

  • Wie schon vermutet ist dein subprocess rumgewürge hier die Ursache. Du rufst die ganze Zeit Prozesse auf, die danach wieder verschwinden - und dadurch kein Gedächtnis dafür haben, was sie vorher mal gemacht haben. Und das fliegt dir jetzt eben um die Ohren. Wenn das ein vernünftiges, dauerhaft laufendes Programm wäre, dann behält das den Überblick darüber, was wann warum geschaltet wurde. Statt bei jedem Start erstmal alles wieder auf Anfang zu setzen. Was du auch nicht wirst ändern können! So sind die Bibliotheken - zu recht - geschrieben.

    Wobei ich das Problem hier gar nicht bei dem GPIO verorte. Du beeinflusst per Netzwerk die Lampe, und das geht ja offensichtlich auch per Fernbedienung. Und das das passiert ist, muss dem Programm beigebracht werden. Man wird da den Zustand garantiert auch auslesen können. Und wenn das Programm erkennt, das wer anders da explizit etwas eingeschaltet hat, muss es entsprechend reagieren.

  • Mich irritiert das "mit einer Flanke schalten".

    Dabei muss ich immer an einen event handler denken.

    gwaag nur für mich zum Verständnis. Du möchtest wenn der Regner an ist gleichzeitig auch irgendeine Lampe schalten.

    Wenn Regner an dann auch Lampe an und umgekehrt?

  • Mal eine andere Frage.

    Im ersten Poste von gwaag.

    steht:

    Python
    while True:
    sleep(0.1)
        if GPIO.input(27)== GPIO.LOW:
        subprocess.call(„/home/pi/th/licht_aus.py“)
        print(„Lampe aus“)
    GPIO.cleanup()

    wenn das Script immer rennt müsste doch die Lampe auch ständig das Signal für aus bekommen oder?

    Demnach müsste das while True raus.

    Das licht_aus Script ist das letzte Script was du aufrufst und dadurch das es in einer Schleife läuft bekommt die Lampe ständig das Kommando aus.

    Du rufst das Script ja eh nur auf wenn du es brauchst.

    Das gleiche dann für das einschalten der Lampe. Sonst geht sie nicht mehr aus.

    2 Mal editiert, zuletzt von keepfear (30. Juli 2020 um 09:41)

  • Hallo keepfear,

    Ja Du hast recht, im ersten Post war es noch mit Schleife, im Post 11 aber nicht mehr, Post 11 ist aktuell, sorry fuer die Verwirrung.

    @ keepfear,

    nur für mich zum Verständnis. Du möchtest wenn der Regner an ist gleichzeitig auch irgendeine Lampe schalten.

    Wenn Regner an dann auch Lampe an und umgekehrt? Ja, ganz genau


    Das einfachst fuer micht ist glaube einen Draht vom Ausgang an einen Eingang zu haengen und die Flanke dann vom Eingang abfragen.

    Versuch ich mal.

    Gruss

    gwaag

  • Er will damit Licht Ein- und Ausschalten.

    Eigentlich könnte Scheduler und die Ansteuerung alles in einem Programm laufen.

    Das hab ich soweit mit bekommen.

    Ich stell mir gerade die Frage warum die Lampe den "Status" Aus hält.

    Nach meinem Verständnis schicke ich einen Befehl zur Lampe an oder aus und diese schaltet dann.

    Er hat sich umständlich eine Art Zeitschaltuhr gebastelt welche ein script aufruft, welches ein script aufruft, welches.....

    Danach ist alles abgearbeitet. Kein weiteres script läuft.

    Die Lampe bleibt aber aus.

    Könnte eventuell die Lampe das Problem sein?

    Es wäre sicherlich von Vorteil wenn gwaag seine scripte noch mal etwas überarbeitet.

  • Nach meinem Verständnis schicke ich einen Befehl zur Lampe an oder aus und diese schaltet dann.

    Den Durchblick um welches Steuergerät es sich handelt, habe ich nicht.

    Im Netz habe ich gelesen, dass die MidLight-Dinger keine Rückmeldung geben.

    D.h. man schickt blind ein UDP-Paket an das Gateway über LAN und hofft dann, dass etwas ankommt.
    Es wird sich um eine Toggle-Funktion handeln. D.h. wenn man einmal das Gerät einschaltet, bleibt es an und wenn man es ausschaltet, sollte es aus bleiben.

    Falls das doch anders ist, dann bitte genau erklären.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!