Pumpemsteuerung nach Stunden im Fehler, unlogisches Schaltverhalten

Hallo liebe Community,

leider treibt mich kurz vor den Feiertagen meine Pumpensteuerung auf einem Nano Clon in den Wahnsinn.

Angesteuert werden über ein seperates 2 Kanal 5V Relay Bord mit Optokopplern und seperater 5V Spannungsversorgung 2 Pumpen in 2 Drainageschächten über jeweils einen Schwimmerschalter.

Also immer 1 Schwimmerschalter --> 1 Pumpe in dem jeweiligen Schacht für eine bestimmte Zeit (je nach größe des Schachts damit die Pumpe nicht trockenläuft)

Leider hat die Pumpe im vorderen Drainageschacht jetzt häufig Dauerlauf. Allerdings tritt das Phänomen erst nach einigen Stunden/Tagen auf. Nach einem Reset des Arduino läuft das ganze wieder für einiges Stunden.

Da ich mit meinem Latein hier echt am Ende bin hoffe ich das ihr mir ein wenig auf die Sprünge helfen könnt.

Die Schwimmerschalter sind über einen 10kOhm Pulldown Widerstand auf 0V gezogen.

#include <Wire.h>
//#include <math.h>
//#include <SPI.h> // needed in Arduino 0019 or later


const int Schwimmervorne=4;
int Schwimmervornezustand=0;
const int Pumpevorne=3;
const int Schwimmerhinten=5;
int Schwimmerhintenzustand=0;
const int Pumpehinten=6;


void setup() 
{
  Serial.begin(9600);
  Serial.println("Test!");
  pinMode(Schwimmervorne,INPUT);
  pinMode(Pumpevorne,OUTPUT);
  pinMode(Schwimmerhinten,INPUT);
  pinMode(Pumpehinten,OUTPUT);
}

void loop() {

Schwimmervornezustand = digitalRead(Schwimmervorne);
Schwimmerhintenzustand = digitalRead(Schwimmerhinten);

delay(500);

  // Pumpe hinten aus
  {
  if (Schwimmerhintenzustand==1)
  Serial.println("Pumpehinten aus");
  digitalWrite(Pumpehinten,HIGH);
  delay(500);
}
 //Pumpe vorne aus
  if (Schwimmervornezustand==1)
{
   Serial.println("Pumpevorne aus");
   digitalWrite(Pumpevorne,HIGH);
   delay(500);
}
//Pumpe vorne und hinten an
if (Schwimmervornezustand==0 & Schwimmerhintenzustand==0)
  {
  Serial.println("Pumpevorne und hinten an");
  digitalWrite(Pumpevorne,LOW);
  digitalWrite(Pumpehinten,LOW);
  delay(50000);
  }
//Pumpe vorne an
  if (Schwimmervornezustand==0)
  {
  Serial.println("Pumpevorne an");
  digitalWrite(Pumpevorne,LOW);
  delay(50000);
  }
 
//Pumpe hinten an
if (Schwimmerhintenzustand==0)
{
  Serial.println("Pumpehinten an");
  digitalWrite(Pumpehinten,LOW);
  delay(120000);
}
}

Erstmal nur ein Tipp, der helfen könnte.
Den Pulldown- Widerstand je Schwimmerschalter besser auf 4k7 verkleinern.
Und für die Pumpen am Relaiskontakt einen Snubber einsetzen. Damit werden Funken am Kontakt unterbunden. Diese stören meist die empfindliche Elektronik.
Bedingt dadurch kann ein Kontakt auch kleben bleiben.

Und deine Relais sind normal nicht für solche Schaltungen geeignet.
Dein Controller ist auch kein micro sondern ein Nano.

Tausche den Pulldown mal eben aus und werde berichten.

Warum sind die Relais nicht dafür geeignet ?

sind 10A Relais mit Freilaufdiode. die angeschlossenen Pumpen haben jeweils 500 Watt.

Das mit dem Snubber schaue ich mir mal an. Ist wenn ich das richtig gelesen habe ja nur ein RC Glied

So wie ich das sehe, sind die Platinen nicht ausgefräst.
Selbst wenn, würde ich diese Spielzeugrelais nicht für eine derartige Anwendung verwenden. In meiner Drainagepumpensteuerung verwende ich ein Finder-Hutschienenrelais, das ist dafür geeignet.

Das solltest du machen. Und ja, dieses Bauteil ist von Strom und Spannung der Pumpe abhängig. Passende Teile bekommst du z.B. bei Reichelt, ein richtiges Relais auch.

Imübrigen läuft meine Steuerung schon einige Jahre und die Probleme hatte ich anfangs auch. Nur verwende ich keine Schwimmer, sondern Sensoren, die den Wasserstand melden.

Achja, und die Freilaufdiode bietet keinen Schutz bei Funken am Relaiskontakt.

Das was auf den Relais drauf steht gilt nur für die.
Nicht für die Relaisplatine, sie ist nicht für 230V geeignet, bei Feuchtigkeit kann, und wird passieren das 230V auf dem Nano sind, und das ist nicht Gesund für Dich :wink:

Das mit den 230V auf dem Arduino ist natürlich ein Argument .

da hatte ich bisher gar nicht drüber nachgedacht. zumal ich direkt unter dem relai eine hutschiene habe....

Eigentlich hätte ich auch lieber ein UC Relai von z.B Eltako genommen oder halt direkt eins von Finder habe seiner Zeit aber leider keins mit Optokoppler und Freilaufdiode gefunden und wollte dem Arduino nicht den Spulenstrom zumuten.

@HotSystems hast du zufällig eine Type deiner Relais für mich ?

Als Snubber könnte ich ja eigentlich einen Shelly Snubber benutzen und den einfach zwischen Relai Ausgang und N hängen. sollte seinen Job ja dann tun oder wie seht ihr das ?

Und das bei einer Pumpensteuerung. Echt leichtsinnig.

Die Pumpen sind ja im Nachbarraum :wink:

Ich kenne die Shelly Snubber nicht. Aber ein Snubber gehört parallel zum Kontakt.

Und den Relaistyp schreibe ich noch, da muss ich erst in der Werkstatt nachschauen. Und da habe ich extra einen Transistor mit Widerständen und eine Freilaufdiode dran.

Das ändert nichts an der "Gefährdung".

Hallo CyrixTheDragon

Nimm die Zeitsteuerung raus und installiere pro Pumpe jeweils einen Schwimmschalter-Oben und einen Schwimmschalter-Unten.

Ich sag ja war etwas dessen ich mir so nicht bewusst war. Ist ja dann mit den neuen Relais ausgestanden.

Aber der Code an sich ist denke ich erst einmal in Ordnung ? Auch wenn mit Sicherheit nicht gerade professionell und hübsch gemacht da ich sonst nur mit einer Siemens Logo rumwerkel.

Grundsätzlich eine gute Idee. Das Problem ist aber ja nicht das die Schwimmer nicht melden sondern das sich das ganze System an sich nach einiger Zeit irgendwie weghängt.

Selbst wenn ich den Schwimmerschalter manuell überbrücke schaltet der Arduino den Ausgang leider nicht ab.

Wozu die delay 500? Die {} stimmen auch nicht.

1 Like

Ok, wenn du andere Relais verwendest, ist das ok.
Ich würde auch bei der Zeitsteuerung bleiben, auch wenn das mit den eingesetzten delays sehr ungünstig ist. Aber wenn die Steuerung nichts anderes machen soll, wird das so funktionieren. Und ich habe kein direktes Problem darin sehen können.
Eine bessere Steuerung bekommst du, wenn du die delays durch eine Funktion mit millis ersetzt. Dann wird bei richtiger Programmierung der Controller nicht blockiert.

Ich setze übrigens auch eine Zeitsteuerung ein, habe aber zusätzlich noch im unteren und oberen Bereicht weitere Sensoren, die mir bei Ausfall die Pumpe abschalten bzw. eine Email senden.

Das mit den Klammern hätte ja fast der Fehler sein können, nur das es die falsche Pumpe ist. Aber ein Problem ist es trotzdem, nur dass es direkt auftreten müsste.

Das Delay kann theoretisch raus. Habe ich nur irgendwann mal eingebaut gehabt damit ich ein wenig Zeit gewinne von Flashen zum mit den Monitor schauen ob alles so funktionert wie ich es gerne hätte.

Was genau du mir mit den Klammern sagen möchtest verstehe ich leider gerade nicht.

Die Klammer vor der if-Zeile gehört hinter die if-Zeile.
In diesem Zustand wird nur die erste Zeile hinter der Bedingung direkt ausgeführt.

habe ich abgeändert.

mit den millis das habe ich mir die tage schon angeschaut weil es theoretisch ja passieren kann das während die eine Pumpe läuft und den Pegel zum einschalten erreicht hat eine weitere dazu kommen könnte und der arduino ja dann für die angegebene Zeit erst einmal in der jeweiligen Funktion "feststeckt" bis die Zeit abgelaufen ist .

Habe ich aber ehrlich gesagt nicht verstanden gehabt mit den millis.

Ist in meinem Fall auch eigentlich zu vernachlässigen weil ich einen "normalen" Pumpenschwimmerschalter auf der 230V Seite der Pumpe des hinteren Schachts als "Backup" hängen habe falls der Microcontroller mal abraucht und beide Schächte untereinander verbunden sind ab einer gewissen höhe.

Da muss man sich auch richtig reinlesen.
Die Funktion millis() ist ein Timer der unabhängig die Zeit zählt und du speicherst nur die Anfangszeit und vergleichst die mit deiner Laufzeit. Wenn die aktuelle Zeit erreicht wurde, wird abgeschaltet.
Wenn man es einmal raus hat, ist es einfach.

Das wäre mir dann zu aufwändig, daher zusätzliche Sensoren. Alles nur 5 Volt. Außer der Pumpe.