Wassernebler

  • Hallo,

    für den kommenden Sommer soll eine Sprühnebelanlage unser Balkon mit kühlfeuchter Luft versorgen.

    Der praktische Aufbau steht, das Python-Programm, welches auf einem Raspberry Pi 3 B+ ausgeführt wird steht nur teilweise, genauer gesagt enthält es zwei Fehler denen ich nicht Herr werde.

    Gewünschte Funktionsbeschreibung:

    Schalter 1 = Nebler an/aus

    Taster 1 = Nebler minimal (langer Pumpenstillstand, kurze Sprühzeit)

    Taster 2 = Nebler maximal (kurzer Pumpenstillstand, längere Sprühzeit)

    Schalter 1 ein schaltet den Nebler ein -> Taster 1 oder Taster 2 startet Schleife mit vorgegebenen Zeiten (lang oder kurz) -> Schalter 1 aus schaltet den Nebler aus.

    Optimal wäre es gewesen, wenn Taster 1 und Taster 2 die Intensivität der Nebelung mit +/- variabel verändert hätte, doch das war mir zu hoch.

    Das folgende Programm schaltet mir bei Tastendruck die Wasserpumpe über ein Relais, allerdings startet die Schleife nach Ablauf der Ausschaltzeit nicht erneut, da wahrscheinlich der Taster nicht als Schalter gewertet wird.

    Zudem schaltet sich der Pumpenausgang nicht sofort bei betätigen des Schalter 1 aus nicht ab.

    Kann mir jemand Unterstützung bieten, da sich meine Python-Kenntnisse auf ein Minimum begrenzen.

  • Zur hilfreichsten Antwort springen
  • Das erste Problem wäre doch schon gelöst, wenn du einen Schalter nimmst.

    Das zweite liesse sich mit einem Zähler bewerkstelligen, sonst schläft das Programm eben so lange wie du vorgibst.

    Code
    i = 1
    while i <= 600:
          time.sleep(0.5)
          i += 1

    Dazwischen kannst du eine Abfrage machen, ob sich der Zustand der Schalter / Taster geändert hat.

    P.S. Ich würde noch ein else: time.sleep(0.5) oder so einbauen, denn wenn nichts gedrückt / geschalten wird, läuft das Script auf Vollgas.

    Die Zeile(n) und die Abfrage(n) drunter sieht für mich sinnlos aus, da sie dann eh immer True ist:

    Status_Taster_Kuehlung_Stufe_1 = True

    Vielleicht hat ein Pythonianer hier auch bessere Vorschläge, ich lerne selbst erst Python. :blush:

    • Hilfreichste Antwort

    Lange sleeps blockieren das Programm. Besser, du merkst dir bestimmte Zeiten (timestamp) zu denen das Programm die Kühlung ein und aus schaltet.

    Übrigens wäre für so eine Schaltung ein Mikrocontroller robuster und billiger - und braucht auch weniger Strom.

    Probiers mal ungefähr so (ins Blaue geschrieben - da sind sicher einige Fehler drin - das kannst du sicher selbst gerade ziehen):

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Hallo,

    zum Pythonianer liegt vor mir auch noch ein harter steiniger Weg, dennoch würde ich mal ein paar Anmerkungen zum Code hier lassen und anschließend mein Vorschlag für den Programmaufbau.

    Dein Shebang(erste Zeile) weist auf Python2 hin, das wird seit über einem Jahr nicht mehr durch die Entwickler supportet. Du solltest Python3 verwenden.

    Anstatt 'RPi.GPIO' solltest du auf das aktuelle 'gpiozero' umsteigen, das hat eine bessere und einfachere Schnittstelle. Mit 'as' werden importe umbenannt, du nennst 'GPIO' in 'GPIO' um, das macht nicht viel Sinn. Wenn dann könnte das so aussehen:  from RPi import GPIO as gpio dann hast du es in beispielsweise in Kleinbuchstaben umbenannt (Was auch sinnfrei wäre). Du importiert 'sleep' von 'time' und danach nochmals 'time' das ist überflüssig, da du nur 'sleep' in deinem Code benötigst. Du kannst 'import time' löschen und weiter unten im Code 'time.sleep()' durch 'sleep()' ersetzen. 'os' ist auch veraltet. Wenn du mit Python ein Programm auf deinem System steuern willst, dann macht man das mit 'subprocess'. Konstanten schreibt man in Python groß, also 'SCHALTER_KUEHLUng_EINAUS'. Dann ignorierst du mit 'GPIO.setwarnings(False)' Fehlermeldungen. Auch da macht man nicht, man sollte dafür sorgen das keine Fehlermeldungen entstehen. Das ist in deinem Fall durch ein 'GPIO.cleanup()' zu bewerkstelligen. Bei der Benutzung von 'gpiozero' fällt das sogar weg. Wieder ein Grund umzusteigen.

    Ich würde versuchen eine Klasse zu schreiben um mir die Zustände zu merken, dann kannst du auch die schrittweise Erhöhung der Zyklen realisieren.

    Ich habe gerade keine Möglichkeit das zu testen, aber die Grundidee von mir würde wie im folgenden Code aussehen. Der ist aber nicht funktionsfähig, aber vielleicht kann einer dazu sagen, dass das die richtige Richtung ist, in der du weiter entwickeln kannst. Naja oder eben auch nicht, das müssen die Pythonianer dann entscheiden:

    Grüße

    Dennis

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

  • Wie sinnig es ist, jemandem, der einen prozeduralen Ansatz vorlegt, einen Vorschlag in OOP zu liefern, bleibt offen...

    Wo ist denn in deinem Programm die Zeit, in der die Pumpe abgeschaltet ist (120-300 Sekunden)?

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Hallo,

    ich habe ja nicht gesagt, dass das der sinnvollste Vorschlag ist. Ich wollte nur eine Richtung vorgeben um sich nicht auf feste Zyklenzeiten zu beschränken, sondern das pro Tastendruck die Zeit erhöht oder verringert wird. Das wurde ja am Rande als Wunsch angesprochen. Ich weis nicht in wie weit sich der Themenersteller mit der Programmierei auseinander setzen will. Hier kann jeder nur Vorschläge bringen. Dann sollte der weiter verfolgt werden, der dem Themenersteller am meisten zusagt.

    Meine Zeit wird als Konstante 'STARTZYKLUS' mit 5 Sekunden vorgegeben und sollte dann pro Tasten Druck um eine Sekunde erhöht oder verringert werden. Ich schrieb ja, dass mein Vorschlag dieses Ziel verfolgt.


    Grüße

    Dennis

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

  • Hallo und vielen Dank für eure Ratschläge.

    Ich habe einfachhalber versucht Gnom`s Quellcode anzuwenden um zu sehen wie sich der Raspberry verhält.

    Bei Anwendung dieses Codes...

    ...bekomme ich folgenden Fehler...

    Code
    Traceback (most recent call last):
      File "/home/pi/Rain.py", line 47, in <module>
        if GPIO.output(Ausgang_Wasserpumpe) == False:
    TypeError: function takes exactly 2 arguments (1 given)

    Was genau hat dieser Fehler zu bedeuten?

    Ich hatte versucht die Zeile 47 wie folgt zu ändern. Ein Fehler kam nicht mehr, aber die Zeile wurde nicht richtig abgearbeitet da in diesem Moment der Ausgang definitiv auf "false" stand und die Abarbeitung bei else weiterging...

    Code
    if GPIO.output(Ausgang_Wasserpumpe,GPIO.LOW) == False:
  • Hallo,

    du greifst mit 'GPIO.output()' auf eine Funktion zu, die du mit 'import RPi.GPIO' in dein Python-Programm geladen hast. Diese Funktion benötigt zwei Argumente damit sie ausgeführt werden kann. Argumente schreibt man, getrennt mit Kommas, in die Klammern hinter dem Funktionsaufruf. In deinem Fall braucht die Funktion eine Pin-Nummer(BCM oder GPIO, das legst du am Programmanfang selbst fest. In deinem Fall hast du dich für BCM entschieden) und den Status, auf den der Pin gesetzt werden soll. Also High oder Low. Das kann man bei GPIO auch noch mit 0, 1, True oder False angeben. Hier in der Dokumentation unter 'Output' steht was die Funktion benötigt und in welcher Form du die Argumente mitgeben kannst/sollst.

    Du hast das mit deinem Versuch, wie du es nennst, richtig gemacht. Die Funktion bekommt mit 'Ausgang_Wasserpumpe' die Pin-Nummer 17 und diese wird auf low gesetzt.

    Grüße

    Dennis

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

  • Der Pin ist zwar als Ausgang geschaltet, es soll aber in dieser Programmzeile festgestellt werden, ob dieser Ausgang auf HIGH oder LOW geschaltet ist.

    Es müsste gehen mit:

    if GPIO.input(Ausgang_Wasserpumpe) == False:

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Der Pin ist zwar als Ausgang geschaltet, es soll aber in dieser Programmzeile festgestellt werden, ob dieser Ausgang auf HIGH oder LOW geschaltet ist.

    Es müsste gehen mit:

    if GPIO.input(Ausgang_Wasserpumpe) == False:

    Ja, da bin ich auch schon schwer drüber gestolpert, weil ich meinte, wenn der GPIO als Ausgang gesetzt wurde, wäre ein GPIO.input() == True: danach falsch. Etwas verwirrend, die Bezeichnung. :lol:

  • Ja, da bin ich auch schon schwer drüber gestolpert, weil ich meinte, wenn der GPIO als Ausgang gesetzt wurde, wäre ein GPIO.input() == True: danach falsch. Etwas verwirrend, die Bezeichnung. :lol:

    In der Tat verwirrend!

    Aber ja, es funktioniert tatsächlich mit...

    Code
    if GPIO.input(Ausgang_Wasserpumpe) == False:

    Die funktionsweise des Programms kann ich größtenteils nachvollziehen, einzig

    Code
    Timestamp= time.time()

    muss ich mir etwas tiefer ansehen.

    Danke erstmal für eure Bemühungen. :)

  • Die Funktion holt sich nur den "Timestamp", eine Zahl, die dem Datum und der Uhrzeit entspricht. Die Zahl ist die Anzahl der vergangenen Sekunden seit dem 1.1.1970 (wenn ich mich nicht irre). Mit dem Timestamp kannst du Vergleiche anstellen, indem du ihn speicherst und dann zum Beispiel 15 Sekunden dazuaddierst und schaust, wann die aktuelle Zeit diesen Wert überschreitet.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Hallo Gnom,

    Zitat


    Die Funktion holt sich nur den "Timestamp", eine Zahl, die dem Datum und der Uhrzeit entspricht. Die Zahl ist die Anzahl der vergangenen Sekunden seit dem 1.1.1970 (wenn ich mich nicht irre). Mit dem Timestamp kannst du Vergleiche anstellen, indem du ihn speicherst und dann zum Beispiel 15 Sekunden dazuaddierst und schaust, wann die aktuelle Zeit diesen Wert überschreitet.

    Die Erklärung klingt logisch ;)


    Zitat


    PS: Was für Wasservernebler hast du denn da im Einsatz? Taugen die was?

    Die Nebler habe ich über Amazon besorgt, zu Testzwecke diese an eine ausgeliehene 12V/DC Tauchpumpe mit 0.8bar angeschlossen. Zugegeben, ich war etwas enttäuscht, von Nebel keine Spur, lediglich leichte seichte Wassertropfen, aber sehr fein.

    Nun habe ich eine 12V/DC 75W Tauchpumpe mit 25l/min und 2.1bar bestellt, um mehr Druck aufbauen zu können, mal sehen ob ein Unterschied erkennbar ist.

    Aufgrund der erhöhten Leistung reicht jetzt natürlich das Netzteil nicht mehr aus, ein größeres mit 100W ist unterwegs.

    Es ist ja noch Zeit bis zum Sommer, Zeit verschiedene Düsen durchzutesten. ;)

  • Schick doch mal nen Link auf das Teil...

    Ich kenne eine Wasser"nebel"sprühanlage in einer Firma - die läuft aber meines Wissens mit 200 Bar...

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Schick doch mal nen Link auf das Teil...

    Ich kenne eine Wasser"nebel"sprühanlage in einer Firma - die läuft aber meines Wissens mit 200 Bar...

    Da ich ein Balkon im Obergeschoss habe ohne Wasseranschluss, muss ich versuchen mir anderweitig zu helfen.

    Ich verwende folgende Teile:

    Wasserpumpe: Reich Power Jet Plus 2.1bar 75W

    Düsen/Zerstäuber: Klick [Anzeige]

    Dazu einen Wasserkanister aus dem Campingbereich und Festo Pneumatikschlauch.

  • Ich muss mich noch einmal melden.

    Hatte das Gerät gestern nochmal eingeschaltet, um die Funktion der neuen Wasserpumpe zu testen.

    Ganz seltsam...irgendwie schaltet das Relais ganz kurz nach umlegen des Ein/Aus-Schalters. Dann bei betätigen der Taste 1 oder Taste 2 schaltet das Relais nach ca. 1 Sekunde kurz ein, dann sofort wieder aus. Bleibe ich auf der Taste, klackt das Relais im Sekundentakt. Man merkt dass die Pumpe starten möchte, sie rüttelt nur einen Moment.

    Als erstes habe ich im Terminal über GPIO readall den Schalter, die Taster und den Ausgang geprüft.

    Alle Signale arbeiten wie es sein soll.

    Taster 1 gedrückt -> 1, Taster 1 losgelassen -> 0

    Taster 2 gedrückt -> 1, Taster 2 losgelassen -> 0

    Taster 1 und Taster 2 gleichzeitig gedrückt -> 1, Taster 1 und Taster 2 losgelassen -> 0

    Den Ausgang habe ich manuell über "gpio -g mode 17 out" und "gpio -g write 17 1" gesetzt, GPIO readall -> 1 und Pumpe läuft!

    Ausgeschaltet habe ich den Ausgang über den Befehl "gpio -g write 17 0", GPIO readall -> 0 und Pumpe steht!

    Demnach sollten alle Signalzustände stimmen!?

    Oder habe ich mir selbst einen verborgenen Fehler eingebaut?

    Kann mir jemand einen Tipp geben, wie oder wo ich noch den Fehler suchen kann?

    Vielen Dank. :)


    Hier der Quellcode:


    NACHTRAG:

    Vielleicht sollte ich noch erwähnen, dass ich an jeden Taster einen 10kOhm pulldown-Widerstand angelötet habe.

    Verdrahtung eines Tasters/Schalters:

    3,3V -> Taster Pin 1

    Taster Pin 2 -> Masse

    Taster Pin 2 -> GPIO

    Da ich die Taster bzw. den Schalter in einem externen Gehäuse verbaut habe, bin ich nur mit einem Massedraht von einem Masse-Pin in das Gehäuse gefahren und habe dort die Masseseite der 3 pulldown-Widerstände miteinander verlötet. (Leitungslänge ca. 200mm)

    Einmal editiert, zuletzt von WeatheredVoice48979 (12. Februar 2021 um 11:42)

  • Hallo,

    nach langer Fehlersuche und erfolgreicher Unterstützung seitens "Gnom" ist das Problem gelöst, für mich jedenfalls.

    Nach Einschalten der Wasserpumpe wirken Störsignale auf die GPIO`s, welche nun durch eingefügte Entprellzeiten ausgeblendet werden.

    Vielen Dank nochmal an Gnom! :)

    Hier der aktuelle Quellcode:

  • Hallo,

    ich muss zu deinem generellen Aufbau noch unbedingt etwas anmerken. Achte bitte unbedingt darauf, dass die Anlage täglich gereinigt und desinfiziert wird. Es hat seinen Grund, dass Klimaanlagen heute nur noch mit Dampfluftbefeuchtern gebaut werden, da wird durch die Temperaturen alles abgetötet.

    Du wirst Deine Anlage wahrscheinlich bei optimalen "Bruttemperaturen" einsetzen wollen (Stichwort: Legionellen), da ist eine regelmäßige Desinfektion wichtig!

    Nur ein gutgemeinter Hinweis, viele Leute denken einfach nicht an solche Gefahren.

Jetzt mitmachen!

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