Pool Pumpen Steuerung ohne delay

Hallo , möchte gerne mein Schwimmbadpumpe nur bei Bedarf einschalten.
Auf einem Dach sind ca 10qm Solarheizung verlegt. Umwälzpumpe mit Filter (230V 750W) soll bei Sonneneinstrahlung einschalten und das Wasser durch die Solarkollektoren pumpen um es zu erwärmen.
Da ab und an auch mal Wolken vorbeiziehen sollte die Pumpe daher mit Anlaufverzögerung bzw. Abfallverzögerung betrieben werden.
Habe hierfür einen Arduino UNO und ein Solid State Relay.
Komme aber mit meinem Code nicht weiter.

Sonne sollte erst eine vorgegebene Zeit scheinen und dann kann die Pumpe in Betrieb gehen.
Kommt eine Wolke vorbei oder es wird Abend sollte die Pumpe noch eine gewisse Zeit nachlaufen.

Ob Sonne scheint oder nicht frage ich über Analog 0 ab. Einen Widerstand 0,1Ohm ist dafür in Reihe zu 4 Solarmodulen die sich auf dem selben Dach befinden. Damit wird der Einspeisestrom gemessen.

Hatte da mal ein TaskMacro hier gefunden und versucht das damit zu realisieren.

Beim einschalten des Arduino und ansteigen des Stromes ist alles wie es soll. Überschreitet Analogwert 0 den Wert 60 vergeht die Zeit und SSRelay schaltet ein.

simuliere ich jetzt eine Wolke (Analogwert 0 kleiner 60) schaltet das SSRelay aber sofort ab,was es aber nicht soll.

Wenn ich das ganze mit delay programmiere geht das so wie ich will. Möchte aber in der Zwischenzeit noch ander Sachen z.B. Temeraturmessung anzeigen.

wer kann weiterhelfen?

 #include <TaskMacro.h>

int sensorPin = A0;
int sensorValue = 0;
const int SS_Relay =  2;

void Aus_SS_Relay()
{
  taskBegin();
   while(1)
 { taskPause(6L*1000L);
  digitalWrite(SS_Relay,LOW);}
  taskEnd();
}


void Ein_SS_Relay()
{
  taskBegin();
  while(1)
 { taskPause(3L*1000L);
  digitalWrite(SS_Relay,HIGH);}
  taskEnd();
}

void setup()
{
  pinMode(SS_Relay, OUTPUT); 
  Serial.begin(9600);
}

void loop()
{  
  sensorValue = analogRead(sensorPin); 
  Serial.print("sensorValue  ");
  Serial.println(sensorValue);

  if (sensorValue >60)
    Ein_SS_Relay();
  else
    Aus_SS_Relay();
}

Hallo,
mit millis(), die laufen im Hintergrund durch...
z.B. mit
Gruß und Spaß
Andreas

Genau dies Antwort habe ich erwartet, hilft mir leider nicht weiter da ich der englischen Sprache nicht mächtig bin. Hab schon die "Nachtwächter Funktion" versucht zu verstehen .Komme aber auch da nicht dahinter. Bin auch nicht mehr der jüngste.
Bitte nur Antworten die weiterhelfen.

Hallo,
was möchtest Du dann?!!

Deinen englischen Sketch hast Du doch auch nicht in deutsch geschrieben.

"Bitte nur Antworten die weiterhelfen"

Meine Antwort ist die Lösung zu Deinem Problem.

Du holst Dir Start millis(), dann legst Du End millis() fest.
Und so lange bis die End millis() NICHT- erreicht sind, macht Dein Sketch
etwas anders.

Google suche:

Arduino millis()

nur Seiten auf deutsch.
Das glaube ich einfach nicht.
Gruß und Spaß
Andreas
P.S.
Die Nachtwächtererklärung ist doch auch in englisch… auf deutsch erklärt!

matthiasve:
Genau dies Antwort habe ich erwartet, hilft mir leider nicht weiter....

Bitte nur Antworten die weiterhelfen.

Diese Antwort hilft vielen weiter.
Wie soll Andreas wissen, dass du damit nicht klar kommst.

Und wie sollen wir wissen, was dir weiter hilft ?

Möchtest du, dass wir dir das übersetzen ?

Aber wir googeln gerne für dich und finden das:

Blinken ohne delay 1

Blinken ohne delay 2

millis erklärt

Speziell für dich in deutsch.

Danke HotSystems. Bin leider kein Programmierer sondern nur einfacher Elektiker. Möchte ja auch nicht blinken zu unterschiedlichen Zeiten ,sondern bei der Bedingung A0 >60 eine Zeit starten und erst dann was einschalten.Genauso wenn sich A0 wieder ändert nach <60 soll nicht direkt was passiern sondern erst wieder eine Zeit gestartet werden
Bekomme das einfach nicht auf die Reihe.
Ein kleines Beispiel würde da wohl helfen. Danke

matthiasve:
Danke HotSystems. Bin leider kein Programmierer sondern nur einfacher Elektiker. Möchte ja auch nicht blinken zu unterschiedlichen Zeiten ,sondern bei der Bedingung A0 >60 eine Zeit starten und erst dann was einschalten.Genauso wenn sich A0 wieder ändert nach <60 soll nicht direkt was passiern sondern erst wieder eine Zeit gestartet werden
Bekomme das einfach nicht auf die Reihe.
Ein kleines Beispiel würde da wohl helfen. Danke

Aber genau dass ist doch in den Beispielen erklärt.
Du musst nur einfach das “Blinken” ausblenden und nur mit der Zeit arbeiten.

Am Anfang millis merken und vergleichen wenn größer der gewünschten Zeit, dann deine Funktion ausführen.

Du solltest beide Schaltschwellen nicht gleich setzen, sondern einen Abstand dazwischen lassen. Z.B. bei > 61 ein und bei < 59 aus. Das nennt man Hysterese und es verhindert laufendes Ein- und Ausschalten.

Gruß Tommy

Danke Tommy, das mit der Hysterese ist mir schon klar, kenn ich von anderen Schaltungen . Mir geht es nur um die Einschaltverzögerung bzw. Ausschaltverzögerung. HotSystems hat das schön erklärt,Am Anfang millis merken und vergleichen wenn größer der gewünschten Zeit, dann deine Funktion ausführen. So soll es sein. Aber wie schreibt man das in den Sketch?

Hallo,
indem man (nicht Frau) sich das mit C&P aus den angebotenen Links und Beispielen holt.
Gruß und Spaß
Andreas

,sondern bei der Bedingung A0 >60 eine Zeit starten und erst dann was einschalten.

und was soll passieren, wenn in der Zeit A0 kurz unter 60 fällt?

Genauso wenn sich A0 wieder ändert nach <60 soll nicht direkt was passiern sondern erst wieder eine Zeit gestartet werden

und was soll passieren, wenn in der Zeit A0 kurz über 60 steigt?

Mein Vorschlag zu dem Problem wäre ein etwas anderer Programmablauf:

Du misst alle Sekunde die Helligkeit. Über dem Schwellwert wird eine Zählvariable um eins erhöht bis sie ihren maximalen Wert z.B. 300 erreicht, unterm Schwellwert wird sie jeweils um eins erniedrigt bis sie Null ist.

Erreicht die Zählvariable ihr Maximum, dann wird die Pumpe eingeschaltet. Die Messungen laufen weiter. Erreicht die Zählvariable wieder den Wert Null, wird die Pumpe abgeschaltet.

Der Vorteil ist, dass bei Wetter mit ständig wechselndem Sonnenschein die Pumpe zwar länger zum Start braucht, aber dennoch startet. Auch kannst du mehrere Schwellen einbauen, so dass bei starker Sonne immer um zwei hochgezählt wird und die Pumpe früher startet.

Generell solltest du dir überlegen, ob nicht ein Temperatursensor am Solarkollektor das sinnvollste zum Schalten der Pumpe wäre.

Hallo Combie
und was soll passieren, wenn in der Zeit A0 kurz unter 60 fällt?
und was soll passieren, wenn in der Zeit A0 kurz über 60 steigt?

Nix, wenn die Bedingung von Analog 0 > 60 Zeit starten und dann SSRelay (Pumpe ) einschalten
wenn die Bedingung von Analog 0 < 60 andere Zeit starten und dann SSRelay ausschalten

Zeit hat immer Vorrang ,hoffe ich hab das so verständlich erklärt

Gruß Matthias

Hallo,

als Beispiel für eine Zeitsteuerung mit millis(), habe ich mal eben BlinkwithoutDelay auf den von mir in #11 vorgeschlagenen Ablauf umgemodelt:

const int ledPin =  13;      // the number of the LED pin
int State = LOW;             // ledState used to set the LED
int Zaehler=0;
unsigned long previousMillis = 0;        // will store last time LED was updated
const long interval = 1000;           // interval at which to blink (milliseconds)


void setup() {
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, State);
}

void loop() {
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {//Ist schon eine Sekunde seit dem letzten Aufruf vergangen?
    previousMillis = currentMillis; //Zeitpunkt des letzten Zeitaufrufs merken
    if (analogRead(A0) > 60) {
      if (Zaehler < 300) {Zaehler++;}//Sonne scheint->Zähler erhöhen bis max. 300
    } else {
      if (Zaehler > 0) {Zaehler--;} //sonst erniedrigen
    }
    
    if (Zaehler == 300) {State = HIGH;}//Pumpe wird gestartet
    if (Zaehler == 0) {State = LOW;}
    digitalWrite(ledPin, State);
  }
}

Ich hoffe, ich habe keine Fehler drin.

Nix

Ja, dann:

#include <TaskMacro.h>

int sensorPin = A0;
int sensorValue = 0;
const int SS_Relay =  2;

const unsigned long wartezeit = 10UL * 60 * 1000 ;// 10Minuten


void TuePumpe()
{
  taskBegin();
   while(1)
   {

     // grundeinstellung     
     digitalWrite(SS_Relay,LOW); // pumpe aus

     taskWaitFor(sensorValue > 60); // Anforderung EIN

     taskPause(wartezeit); // warte auf einschalten
     digitalWrite(SS_Relay,HIGH); // pumpe ein


     taskWaitFor(sensorValue < 60); // Anforderung AUS
     
     taskPause(wartezeit); // warte auf ausschalten
   }
  taskEnd();
}


void TueAnzeige()
{
  taskBegin();
   while(1)
   {
     taskPause(1000); // anzeigeintervall 1 Sekunde
     Serial.print("sensorValue  ");
     Serial.println(sensorValue);   
  }
  taskEnd();
}




void setup()
{
  pinMode(SS_Relay, OUTPUT); 
  Serial.begin(9600);
}

void loop()
{  
  sensorValue = analogRead(sensorPin); 
  TueAnzeige();
  TuePumpe();
}

Danke Combie das funktioniert. Ist genau was ich mir vorgestellt habe. Wäre da in 100Jahren nicht dahinter gekommen, Danke auch an Theseus für deine Mühe. Habs noch nicht getestet werd ich aber morgen machen. Für heute bin ich erst mal glücklich.

Gruß Matthias

Generell solltest du dir überlegen, ob nicht ein Temperatursensor am Solarkollektor das sinnvollste zum Schalten der Pumpe wäre.

Hallo Theseus grundsätzlich hast du Recht. Habe aber schon schlechte Erfahrungen mit Temperaursensoren DS1820 gemacht wenn die Leitungen zu lang sind. Müsste ja die Temperatur auf dem Dach an den Kollektoren messen und ebenso direkt am Pool und da einen Vergleich machen.Hab auch hier schon öfter gelesen das die Kollegen da auch Probleme haben.

Die Solarpoolheizung war ja die letzten Jahre seit 2004 ,wie soll ich sagen, rein mechanisch in Betrieb. Und das zur vollen Zufriedenheit. Hatte damals einen 12V 400W Gleichstrom Motor an die Umwälzpumpe (230V) angeflanscht mittels einer zuschaltbaren Kupplung. Die 4x100Watt Solar-Module auf dem Dach direkt am Motor angeschlossen. Sonne scheint schwach, Pumpe läuft langsam. Sonne scheint stark, Pumpe läuft schnell. Keine Sonne , Pumpe steht. War für mich die ideale Steuerung.War ausreichend zur Erwärmumg und Filterung. Besser gehts nicht.
Da meine Pumpe Wasserseitig letztes Jahr den Geist aufgegeben hat musste also eine neue her. Natürlich war nach so langen Jahren die Original Pumpe nicht mehr erhältlich.
Aus gesundheitlichen Gründen möchte ich den mechanischen Umbau jetzt nicht mehr machen und bin zu dieser Lösung gekommen.
Habe mir einen Wechselrichter für Netzeinspeisung zugelegt. Dort wird dann der Strom Gleichstromseitig gemessen und eingespeisst. Der Arduino schaltet dann mittels SSRelay die Pumpe (230V) ein und aus
Danke für deinen Sketch gefällt mir auch sehr gut und ich habe gleichzeitig die Möglichkeit auf eine LCD-Display mir die Zählwerte und die Sensorwerte anzuschauen.

Gruß Matthias der jetzt noch ein Gehäuse druckt um alles einzubauen.

Such mal hier im Forum, es gibt bereits so ein Thema, ich glaub der Titel ist sogar Wortwörtlich gleich.