Schalter prellt

  • Vorbemerkung: Ich bin 70 Jahre alt und möchte/kann nicht mehr komplett programmieren lernen, aber es macht mir Spaß, für bestimmte Aufgaben Lösungen zu finden, die auf einem Raspberry laufen. Ich versuchs mit Python.


    Zur Aufgabe: Ich habe eine Regenwassertonne vor dem Haus und hinter dem Haus einen großen Regenwassertank. In der Tonne ist eine Pumpe, die das Wasser nach hinten pumpt. Über einen Reedkontakt wird an den Raspi gemeldet wenn die Pumpe läuft. Aus der Laufzeit wird die transportierte Wassermenge errechnet. Das Ganze wird in eine Datei geschrieben (Ein- und Ausschaltzeit der Pumpe, Laufzeit, Wassermenge). Leider kommt es wie eigentlich erwartet zum Prellen des Schalters und damit zu vielen überflüssigen Eintragungen in der Datei. Ich habe verschiedene Lösungsansätze gefunden aber nichts hilft wirklich. Hat da jemand eine Idee? Wenn ich da eine Lösung habe möchte ich die Daten eigentlich in eine csv-Datei schreiben.

    Hier mein Script:

    Und hier die Ausgabe als Textdatei:

    Danke schon mal ....

  • Zum Rest des Skripts schreibe ich besser mal nichts.

    Muss man auch nicht.
    Hat der TE sich gut zusammen gesucht und es läuft.
    Auch du hast es lesen und deuten können sonst hättest du keinen Hinweis gegeben.

    Das Rumgestänker von "Profis" an Sniplets von Beginnern wegen irgendwelcher Pseudo-Regeln (Wenns richtige Regeln wären würde der Interpreter meckern) nervt.

    Just my 2ct.

    Offizieller Schmier und Schmutzfink des Forum.

  • Das Rumgestänker von "Profis" an Sniplets von Beginnern wegen irgendwelcher Pseudo-Regeln

    Wo habe ich denn gestänkert? Warum ich besser zum Rest nichts schreibe liegt einzig daran, dass ich am Telefon lese und das Skript hier nicht vollständig überschauen kann. :no_sad:

  • Hallo,


    zur Erklärung, wieso deine Zeilen mit dem Kommentar `entprellen` nicht den gewünschten Effekt haben: `when_pressed` läuft in einem extra Thread ab. Der Interpreter rast also nicht ununterbrochen über die Zeilen und macht dann eine 0,5 s Pause, sondern der macht das nur ein mal.

    Etwas Kritik bzw. Hinweise für ein besseres Script vertrage ich schon. ;)

    Auf Modulebene, der Code ohne Einrückungen, werden nur Klassen, Funktionen und Konstanten definiert. Ausführbarer Code gehört in Funktionen. Es gibt eine Ausnahme, dass ist der Einstiegspunkt in die `main`-Funktion. Diese fehlt bei dir und ist üblicherweise der Einstiegspunkt eines Programms.

    Wenn man eine Datei öffnet, dann sollte man sie auch wieder schließen und beim öffnen sollte man das Encoding angeben, sonst ist nicht sichergestellt, dass das richtige verwendet wird. Damit die Datei auch bei Programmabbruch wieder geschlossen wird, verwendet man das `with`-Statement. Da du `csw.writer` schon importiert hast, könnte man den auch gleich verwenden, anstatt die Ausgabe zu umzuleiten.

    Man will kein `global` in einem Programm, eine Funktion bekommt alles was sie benötigt über Argumente zugewiesen und gibt bei Bedarf etwas mit `return` zurück. Globaler Zustand bringt erschwert nicht nur das Lesen, sondern auch die Fehlersuche, die Wartung und Erweiterung von Programmen.

    Namen werden in Python klein_mit_unterstrich geschrieben, Ausnahme Konstanten, die GANZ_GROSS und Klassen in PascalCase-Schreibweise. Funktionen werden dabei nach ihrer Tätigkeit benannt. In `ein` und in `aus` gibt es `aktuellesEinDatum`.

    Für Zeitmessungen gibt es `time.monotonic()`.

    Die Pin-Nummern könnte man als Konstante definieren um sie bei Bedarf einfacher zu ändern.

    Wenn man sich etwas über einen Funktionsaufruf hinweg merken will, benötigt man eine Klasse. Das wäre meiner Meinung nach auch der am einfachst verständliche Code. Alternativ kannst du in einer Schleife selbst den Zustand der Button's abfragen und Funktionen aufrufen und Rückgaben entgegen nehmen und verarbeiten.


    Beispiel mit einer Klasse, ungetestet:

    Grüße
    Dennis

    🎧 Für mich ist es Erfolg, wenn man ein Lächeln schenkt
    Und wer Drama will, bekommt auch ein Happy End 🎧

  • und der Shebang macht nur Sinn, wenn er in Zeile 1 steht

    ... und das Skript ausführbar gemacht wurde.

    Und der Shebang ist fehlerhaft. Da ist ein Leerzeichen nach dem "!" zu viel

    Das Leerzeichen stört nicht weiter. Der Shebang funktioniert trotzdem als solcher. :wink1:

  • Leider kommt es wie eigentlich erwartet zum Prellen des Schalters und damit zu vielen überflüssigen Eintragungen in der Datei. I


    Gegen prellende Schalter macht man in der Software folgendes:

    Programmstart
    Frage_Taster_ab 
    Endlosschleife Anfang
      Frage_Taster_ab 
      Wenn der Taster genau so wie vorher steht, dann ist der Zustand stabil
      Warte (1 Sekunde)
    Endlosschleife Ende

    Es hat gar keinen Sinn einen Taster 1000 mal in der Sekunde abzufragen, man fragt ihn daher nur so oft ab wie nötig und übernimmt den Zustand wenn er sich nicht ändert.

  • Quote

    Zitat von Bergwichtel

    und der Shebang macht nur Sinn, wenn er in Zeile 1 steht

    ... und das Skript ausführbar gemacht wurde.

    ... und es mit /pfad/dateiname aufgerufen wurde.

    Wenns ner net G'wittern tun tut.

  • Burned_Name Dann bist du in der Schleife gefangen und legst das Skript 1 Sekunde lang lahm?

    Wenn man das von Hand schreiben will, dann merkt man sich den Zeitpunkt, des 1.Signal dass der Taster gibt. Wenn es innerhalb einer kurzer Zeit weitere Signale gibt, werden die einfach ignoriert.


    Grüße
    Dennis

    🎧 Für mich ist es Erfolg, wenn man ein Lächeln schenkt
    Und wer Drama will, bekommt auch ein Happy End 🎧

  • Burned_Name Dann bist du in der Schleife gefangen und legst das Skript 1 Sekunde lang lahm?

    Wenn man das von Hand schreiben will, dann merkt man sich den Zeitpunkt, des 1.Signal dass der Taster gibt.

    Ja, das ist die andere Möglichkeit, wichtig ist das Prinzip:

    Nach einer gewissen Zeit nachschauen ob es immer noch so ist

    Eine "gewisse Zeit" kann auch weniger sein, bringt aber nichts bei Pumpen, wen die Probleme nicht verschwinden dann sind Störungen auf der Leitung, PullDown und Kondensator könnten dann helfen.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!