GPIO-Schalter

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

    ich möchte mittels GPIO 22, den ich mit einem Optokoppler auf 3,3V ziehe, ein Programm je nach Zustand an oder aus schalten.

    nun funktioniert das Script nicht so wie ich mir das vorstellte.

    Code
    Kodi:~ # Traceback (most recent call last):
      File "test.py", line 22, in <module>
        GPIO.add_event_detect(22, GPIO.FALLING, callback=aus, bouncetime=100)
    RuntimeError: Conflicting edge detection already enabled for this GPIO channel

    Könnt ihr mir Helfen diesen "Schalter" zu programmieren.
    Danke schonmal

  • Hallo.
    Bin zwar kein Pythonier aber das wird nicht funktionieren.
    Du definierst den Gpio als "Rising", gleich danach als "Falling".
    Das sagt auch diese Fehlermeldung:

    Zitat

    RuntimeError: Conflicting edge detection already enabled for this GPIO channel

    Da gibt es was anderes:

    Zitat

    Now we can also detect edges in either changing direction, using BOTH…
    GPIO.add_event_detect(25, GPIO.BOTH, callback=my_callback) for either rising or falling edges.


    Damit erwischt er beides.

    gruß root

    Einmal editiert, zuletzt von root (16. Januar 2016 um 17:44)

  • Du kannst einem GPIO nur einmal mit der Funktion add_event_detect() belegen. Dabei gibt es dann die Parameter GPIO.RISING, GPIO.FALLING oder GPIO.BOTH. Willst du also beides erkennen nimmst Du GPIO.BOTH und wertest in der Funktion aus, ob das Event ein Rising oder Falling war.

    EDIT: root war schneller!

  • Hallo.
    Nö... wieso ?
    Hab doch geschrieben:

    Zitat

    Da gibt es was anderes:

    Zitat:
    Now we can also detect edges in either changing direction, using BOTH…
    GPIO.add_event_detect(25, GPIO.BOTH, callback=my_callback) for either rising or falling edges.

    Damit erwischt er beides.

    oder wie raspiprojekt schrieb:

    Zitat

    Willst du also beides erkennen nimmst Du GPIO.BOTH und wertest in der Funktion aus, ob das Event ein Rising oder Falling war.

    Einmal editiert, zuletzt von root (16. Januar 2016 um 18:03)

  • Haqllo.


    gut dass ich kein Lehrer bin, es werden nur weniger bestehen. :fies:


    ???


    Wie wird es mit NUR! etwas eigeninitiative.


    ?????? Den Satz versteh einer.
    Ich interpretiere mal so:
    "Etwas Eigeninitiative wäre angebracht". Ist iwie schon richtig, aber wenn der TE Anfänger ist, und den Befehl GPIO.BOTH nicht kennt, ist es doch ok.
    Selbst beim suchen passiert jedem mal, dass er den Wald vor lauter Bäume nicht sieht.

    Einmal editiert, zuletzt von root (16. Januar 2016 um 18:40)

  • Der angepasste Code

    "an" triggert er wie gewollt aber bei "aus" kommt nix
    jemand ne idee?

  • Hallo.


    Der angepasste Code

    "an" triggert er wie gewollt aber bei "aus" kommt nix
    jemand ne idee?


    Bin mir nicht sicher, aber das sollte wohl so aussehen.

    Code
    def aus(channel):
      if GPIO.input(22)==False:
          print("aus")
      else:
          print("an")


    Aber da wird sich sicher ein Pythoner melden.

    Aber mal ein allgemeiner Tipp für Interrupt-Routinen.
    Diese hält man so kurz wie möglich. Ein print oder sleep hat da nichts zu suchen (was in diesem Fall wohl nicht stört).
    Man setzt ein Flag, und arbeitet das in der main() ab.
    Grund:
    Je länger die Interrupt-Routine, desto größer die Wahrscheinlichkeit, dass Ereignisse verpasst werden.

    Einmal editiert, zuletzt von root (16. Januar 2016 um 20:05)

  • ENTSCHULDIGUNG .... my Deutsch == English == Polski == All == very ... awfully bad :blush::blush:

    Sollte ich "Müll- reden" :blush: - bitte mich (?) "auf die Nuss" hauen. :huh:

  • Obwohl mein DE - nix - ist, .... möchte trotzdem etwas weiterhelfen, bzw.:
    was (? "gut machen") beitragen.

    Erdna1281

    Boolesche Vergleichungen werden bei Neulingen oft falsch interpretiert.

    Mein Link hast Du Dir - vermute ich auch nicht! durchgelesen.

    if GPIO.input(25) -> Bedeutet:
    wenn am GPIO- 25 eine Logische 1 (eins) -> Spannung vorliegt.
    Ist dass der Fall (am GPIO25 liegt Spannung ...) wird die Abfrage richtig -> und liefert einen true Wert.
    ...

    if GPIO.input(25) == False
    wird NIE! erfühlt, und daher IMMER das else Teil wird ausgeführt.

    .... befasse sich mit den Grundlagen.


    Lasse bitte das False weg.

    [code=php]def aus(channel):
    if GPIO.input(22)
    print("1")
    else:
    print("0")[/php]

    Sollte ich "Müll- reden" :blush: - bitte mich (?) "auf die Nuss" hauen. :huh:

  • ...grins

    Zitat

    if GPIO.input(25) == False
    wird NIE! erfühlt, und daher IMMER das else Teil wird ausgeführt.


    ...da geb ich dir mit 100%iger Sicherheit recht, da der GPIO nichts "erfühlt", höchstens was "erfüllt". :)
    aber ok, ich verspreche, ich werde mich zum Thema Python nicht mehr äußern, Python hab ich vor 2 Jahren at Akta gelegt.
    btw. Das war kein Vorwurf , Schreibfehler passierem jedem, aber sieht lustig aus :thumbs1:

  • Ich suche in dem Script die Zeile wo Du "channel" definiert hast. Entweder Du definierst die Variable channel und nutzt diese durchgängig oder Du muss da wo Du channel nutzt ne 22 eintragen.

  • Hallo zusammen,

    ich würde mal die Zeile

    Code
    def aus(channel):


    durch

    Code
    def aus():


    ersetzen. Die Variable [font="Courier New"]channel[/font] ist vorher mal global definiert worden. Wenn [font="Courier New"]channel[/font] jetzt auch als Funktionsparameter genutzt wird, dann wird der Wert aus der Parameterübergabe genutzt. Und da ist nichts definiert, da ein simpler Pseudo-Interupt definiert ist. Mit anderen Worten: [font="Courier New"]channel[/font] ist in der Pseudo-Interrupt-Funktion nicht definiert. Was immer über [font="Courier New"]GPIO.input(channel)[/font] ausgewertet wird, mit physikalischen Vorgängen am GPIO hat das wenig bis gar nichts zu tun.
    (Bei anderen Programiersprachen hätte ein Laufzeitfehler darauf hingewiesen.)

    Ohne [font="Courier New"]channel[/font] als Funktionsparameter wird [font="Courier New"]channel[/font] innerhalb des Fuinktionskörpers wieder aus der globalen Definition gespeist... und der Pseudo-Interrupt könnte eine Chance bekommen, etwas Sinnvolles anzustellen.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (17. Januar 2016 um 10:21)

  • georg-Lu_1963-1
    Ich habe deinen Link abgearbeitet, wenn ich wie vorgeschlagen als Progammlinie abarbeite funktioniert es, aber setze ich es als Schleife bekomme ich einen Runtime-error.

    Code
    RuntimeError: Conflicting edge detection already enabled for this GPIO channel


    woran liegts?

  • Der Code ist falsch und kann nicht funktionieren. Du darfst die Eventfunktion nicht in eine Schleife setzten! Du musst Dir das ungefähr so vorstellen, dass die Funktion von ausserhalb (vom Betriebssystem, also vom Kernel) aus gestartet wird. Die darf es nur einmal geben. Logischerweise wird beim 2. Durchlauf der Schleife ein Fehler ausgegeben. Evtl. solltest Du Dich etwas mit dem Eventhandling befassen. Falls Du mit englisch klarkommst hier ist das kurz und knapp erläutert: http://sourceforge.net/p/raspberry-gpio-python/wiki/Inputs/

  • Hallo Erdna1281,[quote='Erdna1281','http://test.forum-raspberrypi.de/forum/index.ph…8124#post198124']

    wie oft willst Du denn einen Pseudo-Interrupt definieren? Eigentlich sollte einmal genügen...

    EDIT: Jörg war schneller!

    Siehe auch meinen Beitrag #15.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (17. Januar 2016 um 10:44)

  • So jetzt hats geschnackelt.


  • Du darfst die Eventfunktion nicht in eine Schleife setzten! Du musst Dir das ungefähr so vorstellen, dass die Funktion von ausserhalb (vom Betriebssystem, also vom Kernel) aus gestartet wird. Die darf es nur einmal geben.

    Mit den Begriffen kann er als Anfänger vermutlich wenig anfangen. Das einzige was er zuordnen könnte wäre das Wort "Schleife". Aber was ist eine Eventfunktion? Und wieso darf es die nur ein mal geben? Oder wieso Pseudo-Interrupt?

    ich glaube ich hab hier irgendwo im FAQ mehrere ausführliche Beschreibung zu diesem Thema.. :s

Jetzt mitmachen!

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