Probleme beim programmieren mit Python3

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • 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

    Einmal editiert, zuletzt von Stepo (19. November 2020 um 12:13)

  • 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

  • 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 ^^

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • 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):

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

    • Offizieller Beitrag

    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.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

    • Offizieller Beitrag

    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:

  • Da SPI verwendet wird, werden das Sensoren mit SPI Bus sein, und die Ausgänge des Pi sprechen die Sensoren an welcher Antworten soll (Chip Select). Deswegen ist der Name wohl schon passend.

    Aber alles nur Mutmaßungen die Lösung kann ja hoffentlich der TE noch geben

    • Offizieller Beitrag

    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.

Jetzt mitmachen!

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