Regensensor

  • Tom's Raspberry Bitte poste Deinen Quelltext nicht als Bild, sondern als Text.

    Und zwar mittels des Icons </> als Codeblock. Dann ist das für alle leichter lesbar.


    Und wie razupaltuff schrieb: Es passiert doch genau das, was Du programmiert hast.

    Wenn Du etwas anderes erwartest, beschreibe das.

  • Hallo,


    zu deinem Problem: Du machst etwas wenn der GPIO-Pin einen bestimmten Pegel hat. Diesen hat er aber über eine längere Zeit und da du das ungebremst in einer Dauerschleife abfragst, bekommst du auch immer die selben Ausgaben. Du musst also softwareseitig dafür sorgen, das nach der einmaligen Ausgabe von 'Regen' das erst wieder ausgegeben wird, wenn sich der Pegel des GPIO-Pins geändert hat. Dafür kannst du einen Namen definieren und ihm Wahrheitswerte zuweisen. Diese fragst du vor der Ausgabe ab und dementsprechende gibst du ein 'Regen' aus oder eben nicht.


    Zu deinem Code: 'time' wird importiert aber nicht genutzt, solltest du aber, damit die Dauerschleife nicht so ungebremst durchrennt.

    'as' wir verwendet um Module umzubennen, du nennst 'GPIO' in 'GPIO' um, besser wäre from RPi import GPIO. Einfacher wäre gpiozero anstatt 'GPIO' zu verwenden.

    Konstanten werden in Python GANZ_GROSS geschrieben, Funktionen und Namen klein_mit_unterstrich und Klassen in CamelCase.

    Es wird kein ausführbarer Code auf Modulebene(der Code ohne Einrückungen) geschrieben, hier stehen nur Definitionen von Konstanten, Funktionen und Klassen.

    Warnungen schält man nicht auf stumm sondern behebt sie. In diesem Fall wird das meistens durch einen einfachen Aufruf von 'GPIO.cleanup()' vor Programmende erledigt.

    Am Ende der Schleife tut es gut, wenn der Pi kurz eine kleine Zeit durchatmen kann, dafür kannst du 'time.sleep' verwenden. Importiert ist es ja schon. Wenn du 'if'-Abfragen hast, bei denen entweder die eine oder die andere zutrift, dann verwendet man zum einleiten der Abfrage 'if' und für jede weitere 'elif'. Somit wird keine weitere Abfrage durchgegangen wenn eine vorherige erfüllt war.

    Kommentare sind wichtig, aber wenn in einer Zeile 'print('Regen')' steht, ist der Kommentar "Regen" unnötig. Kommentiert wird nur, warum ein Code etwas macht und das nur, wenn es nicht offensichtlich ist. Also wenn man zusätzlich zur Dokumentation noch Infos benötigt.

    Der ganze ausführbarende Code gehöhrt dann noch in eine Funktion.

    Bei deinem jetztigen Code würde das dann so aussehen:

    Überlege dir mal wie du die softwareseitige Abfrage einbauen könntest.


    Grüße

    Dennis

    “If you’re not paying for the product, then you are the product” Daniel Hövermann

  • Tom's Raspberry Bitte poste Deinen Quelltext nicht als Bild, sondern als Text.

    Und zwar mittels des Icons </> als Codeblock. Dann ist das für alle leichter lesbar.


    Und wie razupaltuff schrieb: Es passiert doch genau das, was Du programmiert hast.

    Wenn Du etwas anderes erwartest, beschreibe das.

    welche Schritte müsste ich setzen damit nur einmal der aktuelle Zustand ausgegeben wird und erst nach Veränderung wieder erneut der Zustand ausgegeben wird?

  • Danke für deine Antwort!



    welche Schritte müsste ich setzen damit nur einmal der aktuelle Zustand ausgegeben wird und erst nach Veränderung wieder erneut der Zustand ausgegeben wird?


    Bitte entschuldige meine Fragen aber ich bin absoluter Neuling.

  • welche Schritte müsste ich setzen damit nur einmal der aktuelle Zustand ausgegeben wird und erst nach Veränderung wieder erneut der Zustand ausgegeben wird?

    Das, was du suchst, sind fallende Flanken und steigende Flanken.

    Wenn du unbedingt RPi.GPIO verwenden willst:



    Mit gpiozero gehts einfacher.

    Edited once, last by DeaD_EyE: from RPi import GPIO as gpio ().

  • gpio.cleanup() nicht vergessen!

    Sofern die GPIOs nur von einem Prozess gesteuert werden.


    Ich hoffe mal, dass es irgendwann eine nutzbare libgpiod in gpiozero gibt. Der Zugriff via sysfs ist veraltet und RPi.GPIO greift direkt auf den Speicher zu (nicht sysfs) und schreibt dort rein. Deswegen ist es mit eins der schnellsten Backends für den RPi, wenn es um GPIO geht.


    In einem meiner Projekte nutze ich gpio.cleanup() explizit nicht, da noch andere Programme im Hintergrund laufen und auf GPIO zugreifen und falls ein bestimmter Pin zurückgesetzt wird, wird die Versorgungsspannung nach 60 Sekunden abgeschaltet (so gewollt).


    PS: Normal sollten nur die GPIOs zurückgesetzt werden, die via GPIO.setup() in dem Prozess konfiguriert werden. Bin mir da aber nicht zu 100 % sicher.

  • In Deinem individuellem Setup hast Du sicher Gründe dafür die GPIO nicht zurückzusetzten, aber der RPi.GPIO-Maintainer empfiehlt das in seinem Tutorial. Allein deshalb würde ich das auch hier (öffentlich) mit einbauen.


    Wäre ja doof, wenn das Skript abgebrochen und neu gestartet wird und die Meldung "GPIO 12 is always in use..." (oder sowas) oder 30°C, die Sonne scheint, das Gewitter ist längst vorbei, aber im print() regnet es. :conf:

  • Post by Tom's Raspberry ().

    This post was deleted by the author themselves ().
  • Post by Tom's Raspberry ().

    This post was deleted by the author themselves ().