Probleme beim programmieren mit Python3

  • Hallo in die Runde,

    ich habe, für jemanden der öfter mit Python programmiert (wahrscheinlich), ein kleines Problem.

    Ich möchte gerne Daten von Sensoren abfragen und damit Relais schalten.

    Im ersten Teil soll pro Sensor ein Relais geschaltet werden (was auch soweit funktioniert).

    Danach würde ich gerne die Daten von mehreren Sensoren zusammen nehmen, um damit wiederum ein Relais zu schalten (mit or und and).

    Und da fangen die Probleme an.

    Egal was ich versuche, entweder kommt eine Fehlermeldung oder das Programm ignoriert die Zeilen einfach.

    Wenn mir jemand weiter helfen könnte, was ich zwischen Zeile 80 und 86 ändern muss währe ich sehr dankbar.


    Ich habe mir für den Anfang wohl leider etwas viel vorgenommen.


    Vielen Dank schon mal für eure Hilfe

    Stepo

    Edited once, last by Stepo ().

  • Hallo,

    danke für den Hinweis.

    Fehlermeldungen kann ich "Leider" im Moment nicht posten.

    So wie der im Moment programmiert ist ignoriert der die Zeilen einfach.

  • Hallo,


    also so, wie das Programm im Moment aufgebaut ist, kommt es sowie so nie weiter als Zeile 78.

    Bei Zeile 80 sind die eckigen Klammern falsch gesetzt.

    Welchen Sinn hat Zeile 78? Du erzeugst zwei Sets, die jeweils nur ein Element enthalten und vereinigst die Sets dann. Macht relativ wenig Sinn...


    if und elif und else sind Statement, keine Funktionen -> der Ausdruck dahinter muss nicht geklammert werden.

    Konstanten schreibt man in Python in GROSSBUCHSTABEN.

    Bei Funktions- bzw. Methodenaufrufen kommt kein Leerzeichen zwischen den Funktionsnamen und der Klammer, also z.B. `time.sleep(1)`.

    Das das ältere RPI.GPIO zu nutzen solltest du das neuere / schönere, besser gpiozero-Modul nutzen.


    Gruß, noisefloor

  • Hallo,

    wie gesagt es geht um die Zeilen 80 bis 86. die leider nicht das machen was ich gerne hätte.

    Danke schon mal für die Hilfe

  • Hallo,


    dann überleg' dir doch als allererste Mal, warum der aktuelle Code wie gepostet nur bis Zeile 78 kommt und korrigierst da. Dann behebst du die so nicht sinnvollen Klammern in Zeile 81. Und dann probierst du es nochmal aus.


    Gruß, noisefloor

  • Wie noisefloor schon schrieb, arbeitet dein Programm die von dir genannten Zeilen nicht ab.


    Schau mal in welchem Namensraum die Zeile 81 und 84 steht. Die befindet sich nicht in deiner Dauerschleife ('while True:')

    Die Einrückungen in 82 und 85 passen zu den restlichen Einrückungen im Programm nicht. Du hast vermutlich immer 4 Leerzeichen benutzt(?) Bei diesen Zeilen sind es mehr oder es fehlen welche um die 'if' Funktionen in die Schleife einzubinden.



    Grüße

    Dennis


    Edit: Schneller kann ich nicht tippen und es war trotzdem zu langsam ^^

    ... ob's hinterm Horizont wirklich so weit runter geht oder ob die Welt vielleicht doch gar keine Scheibe ist?

  • Ein Herzliches


    !!!DANKE!!


    an alle die mir Tipps gegeben haben

    es scheint zu funktionieren


  • Stepo Die Kommentare solltest Du auch entsprechend Einrücken. Das schöne an der Einrückung ist ja, das man die Programmstruktur daran erkennen kann. Wenn sich die Kommentare nicht daran halten, macht man das schwerer lesbar.


    Das funktioniert so auch nicht wirklich robust weil im zweiten ``if``-Zweig `fprozent1` verwendet wird, was aber im ersten Schleifendurchlauf nur definiert ist falls der erste ``if``-Zweig ausgeführt wurde. Falls das nicht der Fall wahr bricht das Programm wegen dem unbekannten `fprozent1` ab.


    Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.


    Warnungen sollte man nicht abschalten sondern die Ursache beheben. Zum Beispiel in dem man dafür sorgt das bei Programmende auf jeden Fall `GPIO.cleanup()` aufgerufen wird.


    Warum stehen denn da die Pin-Nummern als Zahlen beim Aufsetzen der Pins wo die doch als Konstanten am Anfang definiert wurden? Und es werden mehr Pins als Ausgang definiert als Konstanten definiert sind und das Programm tatsächlich nutzt?


    Das `SpiDev`-Objekt kann man schon geöffnet erstellen und auch hier sollte man dafür sorgen, dass ordentlich aufgeräumt wird. Diese Objekte sind netterweise Kontextmanager die man mit ``with`` verwenden kann.


    Der Vergleich eines Bytewertes auf >=0,1 macht keinen Sinn.


    Da steht zweimal sehr ähnlicher Code in der Schleife den man in Funktionen herausziehen sollte. Eventuell würde auch eine Klasse Sinn machen.


    Zwischenstand (ungetestet):

    “The most likely way for the world to be destroyed, most experts agree, is by accident. That's where we come in; we're computer professionals. We cause accidents.” — Nathaniel Borenstein

    • Official Post

    Moment, da stimmt doch etwas nicht. :conf: Sollten Sensoren nicht als Input aka gpio.setup (<PIN>, gpio.IN) deklariert werden oder hab ich gerade einen Knoten im Kopf?


    Und nochwas, ist das

    gpio.setup (<PIN>, gpio.IN)

    nicht auch case sensitive?


    //Edit Wer lesen kann ist klar im Vorteil! :shy:

  • hyle Das sind offenbar keine Sensoren. Die werden als OUT aufgesetzt und per `output()` angesprochen. Ist also eher das die Namen falsch/irreführend sind.


    Python an sich ist „case sensitive“ und das stimmt schon so. Das Modul wird ja beim Import in Kleinbuchstaben umbenannt, also muss man das im weiteren Code auch so verwenden.

    “The most likely way for the world to be destroyed, most experts agree, is by accident. That's where we come in; we're computer professionals. We cause accidents.” — Nathaniel Borenstein

    • Official Post

    Das sind offenbar keine Sensoren. Die werden als OUT aufgesetzt und per `output()` angesprochen. Ist also eher das die Namen falsch/irreführend sind.

    Ah ok! Das sollte dringend geändert werden, weil wie Du schriebst ist das irreführend!


    Das Modul wird ja beim Import in Kleinbuchstaben umbenannt, also muss man das im weiteren Code auch so verwenden.

    Stimmt, ich war nur von Dir die richtige "Version" des Imports (from RPi import GPIO) gewohnt und habe das as gpio danach komplett ignoriert / überlesen! :blush: :lol:

  • Hofei Dagegen spräche, dass im Code erst der jeweilige Sensor ausgelesen wird und dann je nach ausgelesenem Wert erst der Ausgang geschaltet wird.

    “The most likely way for the world to be destroyed, most experts agree, is by accident. That's where we come in; we're computer professionals. We cause accidents.” — Nathaniel Borenstein

    • Official Post

    Vielleich bin ich ja auch schon zu lange mit gpiozero unterwegs, aber natürlich gibt ein Sensor einen Wert aus und ist trotzdem ein input device. Ein Taster macht das ja auch.

    https://gpiozero.readthedocs.io/en/stable/api_input.html und nicht nur der. :conf:


    Ich bin verwirrt.

  • So wie ich das verstanden habe, schaltet jeder Sensor eine Pumpe ein/aus.

    D.h. die zugeordneten Ausgänge gehen nicht auf den Sensor, sondern auf die Pumpen.

    Von den Sensoren bekommt er lediglich die Analogwerte der jewiligen Pegel.

    Ich nehme weiter an, dass der Herr eine Hysterese will.


    D.h. wenn der maximale Pegel erreicht ist => Pumpe aus

    ... dann sinkt der Pegel ab auf das Minimum => Pumpe ein


    Kennt man auch von der Heizung (Zweipunktregler).

    Wenn man das nicht macht, geht die Pumpe in der ungünstigsten Situation ständig ein und aus und das sehr kurz hintereinander.



    Code ist nicht getestet. Bei mit check_sensor können noch Fehler drin sein.