Pumpensteuerung - schalten erst nach zeitablauf

Hallo,
warum nimmst Du nicht einfach zwei Drucksensoren- und läßt sie in einem
Fensterdiskriminator laufen?
Meiner Meinung nach würde es die Sache auch "sicherer" machen.
Nur mal so…
Gruß und Spaß
Andreas

Hallo Andreas.

Ich hatte als nächstes an eine Wasserflusssensor gedacht. Mit dem könnte ich dann auch die Pumpe vor Trockenlauf schützen.

Hat niemand eine Idee wieso die Pumpe nicht wieder anspringt?

Danke!

Der grundlegende Fehler ist deine Mittelwertbildung, glaub es doch endlich. Es bringt Nichts, wenn man in einer Schleife, die in 20ms "durch" ist, die Werte einsammelt und mittelt - dann hast du einen Mittelwert über die 20ms - das ist viel zu schnell und folgt damit immer noch den Sprüngen des Sensorsignales ziemlich direkt.

Mein Vorschlag sah vor, jeweils einen Teil des Mittelwertes bei jedem Haupt-Loop dazuzuholen, deshalb dieses "Schieberegister" (siehe meinen Beitrag oben). Wenn also der gesamte Loop mit einem Delay von z.B. 20ms versehen ist, werden nicht in 20ms alle Messwerte gemittelt, sondern alle 20ms kommt ein Teil dazu, DAS ist der entscheidende Unterschied.

Würde man diesen Puffer z.B. 500 Variablen groß machen, dann hättest du einen Mittelwert über eine Sekunde ...

Hallo qualidat!

Ich habe mir in den Referenzen "Arrays" angesehen und auch das "KnightRider" Tutorial.
Aber ich komme da nicht weiter.

Ich beziehe mich mal auf Deinen Sketch in Post#18:

petemanzel:

 // (...)

if(sensorWert <= maxDruck - 100) state = 0; // Pumpe AN

if(millis() - previousMillis >= interval && sensorWert >= maxDruck)
  {
    previousMillis = millis(); 
    state = 1; // Pumpe AUS
  }
  if(lastState != state) {
  lastState = state;
 
      switch (state)
      {
      case 0:  // Pumpe Aus
        digitalWrite(pumpenRelais, LOW);
      break;
   
      case 1:  // Pumpe An
        digitalWrite(pumpenRelais, HIGH);
      break;
   
      default:
      problem();
      }
  }
}

Du setzt den Wert von "state" auf 0 und als Kommentar "Pumpe AN"
Nach dem Vergleich von Millis() mit previousMillis setzt Du "state" auf 1 und als Kommentar "Pumpe AUS"
Im anschließenden Switch schaltest Du aber genau entgegen gesetzt.
Und da wunderst Du Dich das die Pumpe nicht ausschaltet?

Ich habe im "switch / case" falsch kommentiert!

digitalWrite(pumpenRelais, LOW); Macht die Pumpe an!

Danke für den Hinweis!

Nimm anstatt der Mittelwertbildung einen Running Median mit 31 Werten und schiebe alle 100 ms einen Wert rein.

Oder warte einfach nach dem einschalten der Pumpe 3 Sekunden mit dem Messen und mach dann erst den Median oder Average. Gibt ne schöne Lib für

Hallo!

"kontinuierliche Mittelwertbildung" hat "qualidat" mir ja auch schon vorgeschlagen. Aber das überfordert mich gerade ein wenig!

Hallo,
was mir noch auffällt…
Mit was rechnest Du da eigentlich? So wie es aussieht mit einem Wert, der von
A2 geliefert wird.
Dein Sensor hat einen Arbeitsbereich von 0 bis 12bar bei 0,5 bis 4,5v

Dünnes Eis…

bei der Auflösung von 0 bis 1023 sind das dann bei einem AD-Wert von 922 gleich
12 bar und bei einem AD-Wert von 103 dann 0bar.

Bei einer Schalthysterese 520/550 sind das dann 6,11 bis 6,55bar.
Bei einer Schalthysterese 350/550 sind das dann 3,62 bis 6,55bar.

Dünnes Eis Ende...

Ich würde das ganze erst einmal in "bar" umrechnen und dann einmal schauen,
wie genau die Pumpe denn den Druck halten kann.

Die wird einen Druck von z.B. von 3bar ja nicht 100%tig halten können.
Aus dieser Druck-Differenz mußt Du ja erst einmal raus. Dann hat auch der Sensor
eine bestimmte Fehler-Toleranz. Diese mußt Du in Deiner Berechnung mit
einbeziehen.

Wenn Du das schon "samplen" willst, dann mußt Du das in Deinem Arbeitsbereich
machen, der z.B. bei 3 bis 4bar liegt.
Das wäre dann der AD-Wert 308 bis 376.
Das sind 64 AD-Werte die Du erst einmal stabil einfangen mußt. Wenn Du nicht
weißt, was geliefert wird- und auch nicht, was Du brauchst, dann kannst Du mit
Deinen millis() rumhampeln bis das Rohr platzt.
Gruß und Spaß
Andreas
P.S. mal sehen ob das Eis hält...
P.P.S. ein "TrockenLaufSensor" ist eine gute Idee. Schau mal nach, was für
eine ED Deine Pumpe für die Laufzeit hat, vielleicht mußt Du sie nach einer
bestimmten Zeit abschalten.

Ich hatte das bereits im Einsatz, aber nach dem 4. Sensor stillgelegt, bis ich was besseres finde.

  1. RunningMedian lib ist ideal dafür, weil beim Median Ausreißer eben nicht berücksichtigt werden. Bei Mittelwert schon. Wobei die Lib beides kann.

  2. Per z.B. simpleTimer lib machst du alle 100 ms eine Messung und schreibst sie in den Median

  3. Damit du überhaupt weisst, um welchen Wertebereich es geht (siehe ein Post vorher), lass dir per Testsketck alle 20ms die Messung seriell ausgeben und logge das mit. Schalte dann die Pumpe ein paarmal an und aus, damit du mehrere Messreihen bekommst.

  4. Der Messbereich vom Sensor ist ungeeignet und erschwert das ganze nur.

  5. Wenn du die Messreihen hast, ist egal, ob du in bar umrechnest oder die Rohwerte nimmst

  6. Passende Hysterese nicht vergessen

Beim Hauswasserwerk bin ich auf einen Durchflusssensor umgestiegen, funktioniert so halbwegs. Dummerweise verengt er den Leitungsquerschnitt von 22 auf 13 mm. Sollte mal einen Bypass dran machen

Hallo,
"ist egal, ob du in bar umrechnest oder die Rohwerte nimmst"

Ich würde das schon in bar oder Wassersäule rechnen und anzeigen.
Wenn er ein Si-Ventil drinne hat das z.B. bei 4bar öffnet- aber knöcheltief
im Wasser steht, dann zeigt der Arduino ihm Max Druck 376 an.
Da kann er dann etwas mit anfangen??
Steht da aber 4 Bar, ist das Aussagekräftig.

Kann sein, das ich das alles überspitzt sehe, aber vor unbeaufsichtigtem
Wasser, Öl und Gas habe ich einen HöllenRespekt.
Gruß und Spaß
Andreas

klar , für die Ausgabe schon in Bar, aber intern würde ich der Einfachheit und schnelligkeit halber mit 16bit int arbeiten

petemanzel:
Bekomme jetzt diese Fehlermeldung:

mioPressControlIntervall.ino: In function 'void setup()':
mioPressControlIntervall:33: error: call of overloaded 'print(long unsigned int (&)())' is ambiguous

Da fehlen Klammern:

Serial.print(millis()); Serial.print(" : "); Serial.println(maxDruck);

petemanzel:
Die Pumpe geht jetzt aber nicht an bei maxDruck -(minus) 100.

sensorWert >= maxDruck

kann nicht erreicht werden, denn mehr als maxDruck geht ja nicht.

sensorWert >= (maxDruck - 50)

So funktioniert Dein Sketch.

Hallo,
was macht ihr da eigentlich mit eurem "Hauswasserwerk"- wenn es denn eines ist?

Im groben funktioniert das doch so:
Ihr bohrt unsere schöne Erde an, stopft ein Rohr in das Loch, an das Rohr eine
Pumpe, dann ein Rückschlagventil, dann zum Speicher oder zur Brauchwasserstelle?

Der Durchflusssensor gehört doch vor die Pumpe, damit sie nicht trocken läuft?
Nach der Pumpe ein Rückschlagventil damit ein Druck aufgebaut werden kann?
So erzeugt ihr doch einen Arbeitdruck von z.B. 2 bis 4 bar?
Wenn kein Wasser entnommen wird, dann ist der MaxDruck 4 bar in der Anlage.
Wenn jetzt Wasser entnommen wird, dann sinkt dieser Druck langsam auf
unter 2 bar.
Also, weniger als 2 bar Pumpe an- mehr als 4 bar Pumpe aus.
Wenn jetzt eure Pumpen sich "andauernt" ein- und ausschalten, dann stimmt doch
etwas nicht an der Montage oder den Dimensionen eurer Hauswasserwerke??

Es ist doch nicht so, Pumpe an- zack 4 bar. Wasserhahn auf- zack 2 bar?
Oder sehe ich da etwas nicht richtig?
Gruß und Spaß
Andreas

SkobyMobil:
Ich bohrt unsere schöne Erde an, ...

Nicht doch, ich nutze Regenwasser :slight_smile: Da wurde nur ein Loch für den Tank gegraben.

SkobyMobil:
Es ist doch nicht so, Pumpe an- zack 4 bar. Wasserhahn auf- zack 2 bar?

Da Wasser nicht komprimierbar ist, verhält sich das bei meiner Tauchdruckpumpe in etwa so. Ein Hauswasserwerk sollte die Zackigkeit durch komprimierbare Luft etwas abmildern. Auch der Hausanschluß fällt von 6 auf ca. 2 bar, wenn ein Wasserhahn geöffnet wird.

Ich habe auf die ursprüngliche Frage, warum der Sketch nicht funktioniert, geantwortet. Hier ist das Forum für Arduino und nicht für Gartenbewässerung oder Toilettenspülungen, denke ich zumindest. Wobei eine Gesamtbetrachtung des Projektes ja durchaus sinnvoll sein kann. :slight_smile:

Ich bohrt unsere schöne Erde an, stopft ein Rohr in das Loch, an das Rohr eine
Pumpe, dann ein Rückschlagventil, dann zum Speicher oder zur Brauchwasserstelle?

Wenn tatsächlich "die Erde angebohrt wird" und die Pumpe saugen muss, ist ein Rückschlagventil ganz unten direkt hinter/im Ansaugsieb. Damit der Saugschlauch nicht trocken fällt.
Einfachste Installationen verzichten dann sogar auf das Rückschlagventil hinter der Pumpe und setzen statt dessen den Saugschlauch unter Druck, wenn die Pumpe abschaltet.

Es ist doch nicht so, Pumpe an- zack 4 bar. Wasserhahn auf- zack 2 bar?

Doch, wenn der Speicher kein Luftpolster hat.

Und auch mit Druckluftpolster: zwischen 3.7 und 4 bar zum Abschalten würde ein Durchfluss-Sensor fast 0 anzeigen. Da brauchst du auch eine gute Verzögerungszeit, wenn du per Durchfluss-Überwachung einen Trockenlaufschutz machen willst. So kommt es dann doch wieder Richtung Arduino.
Sonst brauchts keinen Durchfluss-Sensor.

Idealerweise baut man ein kleines Druckausgleichsgefäss mit Menmbran ein, das glättet die Druckschwankungen etwas.

War früher mit mechanischen Druckschaltern immer dran. Sieht aus, wie so ein runder Ballon.

SkobyMobil:
Hallo,
ich weiß nicht, ob es richtig ist daruf zu antworten. Hier gab es ja schon
welche "auf den Deckel" für Toilettenspülung und Gartenbewässerung…
Also nur kurz.

"Auf den Deckel" gibt es hier höchstens was von Uwe, ich sage nur meine Meinung. Und da ist mir aufgefallen, daß sich der TO schon länger nicht mehr gemeldet hat. Da stelle ich mir die Frage, wieso das so ist. Meine Mutmaßung: Der TO ist ins Bohrloch gefallen oder das Thema hat sich von seiner ursprünglichen Fragestellung zu weit entfernt.

Ich hatte die zweite Möglichkeit vermutet und wollte freundlich auf diesen Umstand aufmerksam machen :slight_smile:

Weil aber auch meine Hinweise in #39 den TO leider nicht zurückgeholt haben, doch noch was zu dem spannenden Thema Gartenbewässerung (die Toiletten habe ich nicht angeschlossen, da es sich derzeit nicht rechnet).

michael_x:
Wenn tatsächlich "die Erde angebohrt wird" und die Pumpe saugen muss, ist ein Rückschlagventil ganz unten direkt hinter/im Ansaugsieb. Damit der Saugschlauch nicht trocken fällt.

Ist das Loch zu tief, klappt das Saugen nicht mehr, weshalb im Bohrloch eine Tauchdruckpumpe benötigt wird, um für das Hauswasserwerk einen Vordruck zu liefern.

Ich nutze eine vergleichbare Tauchdruckpumpe mit Druckschalter (3,2 bar), Trockenlaufschutz und Schwimmerschalter im Regenwassertank zur Gartenbewässerung. Hahn auf, Wasser läuft. Der Druck reicht auch für einen Hochdruckreiniger. Da habe ich kein schlechtes Gewissen wegen Wasserverschwendung. Wenn der Tank leer ist, was ich erst einmal geschafft habe, warte ich auf den nächsten Regen :wink:

Hallo Pete, wie sieht es mit Deinem Sketch aus?

if(millis() - previousMillis >= kalibrieren)
wird im Setup teil möglicherweiße nicht durchlaufen, da
millis() - previousMillis zu diesem Zeitraum kleiner 30000 sein dürfte.

im Setup

newDruck = analogRead(druckSensor);
if(newDruck > maxDruck)
  maxDruck = newDruck;