Reifeschrank Automatikmodus Schalter

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

    Ich habe ein Programm geschrieben, bei dem ich Sensorwerte einlese und mittels AD Wandler Poti Werte als Vergleich einlese

    Ziel ist es mittels Schalter und IF Anweisung am GPIO 5 das Programm zwischen Automatikmodus und Schlafmodus hin und her zu schalten-

    Leider funktioniert das nicht so wie ich will

    Das Program reagiert auf den Schalter nicht.

    Wenn ich mittels print den Status des GPIO's auslese, dann sehe ich aber den wechsel von True auf False

    Eine weiterführende Frage ist, ob es eine Möglichkeit gibt, dass die Sensorwerte und auch die Potiwerte nur eingelesen werden, wenn eine Änderung erkennbar ist.

    Ich habe schon recherchiert bezüglich Interupt und Callback funktion aber ich werde daraus einfach nicht schlau.

    Code
    <gpiozero.DigitalInputDevice object on pin GPIO5, pull_up=True, is_active=True>
    <gpiozero.DigitalInputDevice object on pin GPIO5, pull_up=True, is_active=True>
    <gpiozero.DigitalInputDevice object on pin GPIO5, pull_up=True, is_active=True>
    <gpiozero.DigitalInputDevice object on pin GPIO5, pull_up=True, is_active=True>
    <gpiozero.DigitalInputDevice object on pin GPIO5, pull_up=True, is_active=True>
    <gpiozero.DigitalInputDevice object on pin GPIO5, pull_up=True, is_active=True>
    <gpiozero.DigitalInputDevice object on pin GPIO5, pull_up=True, is_active=False>
    <gpiozero.DigitalInputDevice object on pin GPIO5, pull_up=True, is_active=False>
    <gpiozero.DigitalInputDevice object on pin GPIO5, pull_up=True, is_active=False>
    <gpiozero.DigitalInputDevice object on pin GPIO5, pull_up=True, is_active=False>

    Einmal editiert, zuletzt von stefan0815 (12. März 2022 um 23:08)

  • Da sind Einrückungen verloren gegangen, aber der Fehler ist durch die Ausgaben ersichtlich.

    Prüfe auf switch.value in Zeile 90, also

    Python
    if switch.value == True:
        print(switch.value)

    denn nur switch ist eine Referenz auf die Klasse DigitalInputDevice(). ;) Zu Source/Values siehe hier: https://gpiozero.readthedocs.io/en/stable/source_values.html


    //Nachtrag um das auch noch anzusprechen

    Du kannst übrigens == True weglassen, also

    Code
    if switch.value:
        print(switch.value)

    aber das nur am Rande.

  • Danke Hyle das war der richtige Hinweis

    Bin schon gespannt, wann ich das mit den Referenzen und Klassen behirne :conf:

    Auch wenn es nicht den Anschein hat aber ich habe mir im Vorhinein die GPIOzero angesehen und auf das bin eich einfach nicht gekommen.

    Ich schreibe meine Programm ein Notepad++ und beim kopieren gehen alle Einrückungen "verloren"

    Kann schon sein, dass ich dann beim Durchgehen die Eine oder Andere Einrückung übersehe, die es eigentlich gibt.


    SG Stefan

  • Ich schreibe meine Programm ein Notepad++ und beim kopieren gehen alle Einrückungen "verloren"

    Kann schon sein, dass ich dann beim Durchgehen die Eine oder Andere Einrückung übersehe, die es eigentlich gibt.

    Dann machst Du irgend etwas falsch!

    Ich habe zwar Notepad++ viele Jahre nicht benutzt, aber dass der die Einrückungen frisst, glaube ich nicht.

    Erzeuge doch hier im Forum erst einen Codeblock und füge dann in diesen Deinen Code ein.

    Nicht erst den Code einfügen und dann daraus einen Codeblock machen!

  • Hallo,

    Funktionsnamen schreibt man klein_mit_unterstrich. 'if'-Abfragen benötigen keine Klammer, genausowenig wie 'return'.

    'temperature_max_min' verwendet von den drei Argumenten nur eins. Das gilt für 'humidity_max_min' auch. Und jetzt machen beide Funktionen eigentlich das gleiche. Dann könnte man daraus ja eigentlich eine Funktion machen.

    Für deine string-Funktionen gilt das auch. So wie du das machst, sieht es eher so aus, als ob du Funktionen als Überschriften nimmst. Der Sinn einer Funktion ist unter anderem, dass gleiche Aufgaben mit einer Funktion erledigt werden und man den gleichen Code nicht öfters schreiben muss. Wobei die Funktionen für das Erstellen von Strings meiner Meinung nach überflüssig sind.

    Das kannst du direkt bei der Übergabe an die LCD-Funktion machen.

    Wichtig, Strings puzzelt man nicht mit '+' zusammen. Python bietet dafür die 'format'-Methode oder 'f'-Strings. Damit braucht man auch keinen Aufruf von 'round' davor, dass kann man bei der String-Erstellung gleich mit formatieren.

    Zwischenstand, ungetestet:

    Die Logik habe ich mal nicht hinterfragt und die 'main' eigentlich so gelassen wie du sie erstellt hast. Vorallem auch, weil ich die EInrückungen raten musste.

    Achja du musst eine Zeile nicht mit '#Automatikschalter' kommentieren, wenn du anstatt 'switch' einfach 'automatic_switch' verwendest.


    Grüße

    Dennis

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

  • HI

    Danke für eure Hilfe!

    Dennis: Danke für deine Durchsicht und deine Hinweise. Das mit den Strings war halt mein Intuitiver Zugang, ohne deine beschriebene Möglichkeit zu kennen oder mal gelesen zu haben. Werde deinen Code testen und genauer analysieren damit ich auch alles verstehe.

    SG Stefan

Jetzt mitmachen!

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