Befehl: Magnetventil aus funktioniert nicht

Guten Abend Aruino Comunity,

Ich habe mir als Laie ein Programm geschrieben und es funktioniert soweit auch recht gut.

Aber wenn der Druckschalter gedrückt wird, dann wird auch das "Magnetventil_C" auf "LOW" gesetzt.
Anschliessend am ende des "IF-Befehls" sollte es wider auf "HIGH" gesetzt werden.

Nur das passiert nicht - es wird erst beim nächsten else Befehl auf HIGH geschalten.

Hat jemand eine Idee warum?

Danke und einen schönen Abend
:slight_smile:

if (druckSchalterStatus == HIGH) {
vorhin = jetzt;
MagState_0 = true, MagState_A = false, MagState_B = false, MagState_C = true;
digitalWrite(Magnetventil_0, LOW), digitalWrite(Magnetventil_A, HIGH), digitalWrite(Magnetventil_B, HIGH), digitalWrite(Magnetventil_C, LOW);
delay(3000);
digitalWrite(Pumpe, LOW);

if (jetzt - vorhin >= ausgusszeit) {
vorhin = jetzt;
MagState_0 = false, MagState_B = true, MagState_C = true, MagState_C = false ;
digitalWrite(Magnetventil_0, HIGH),digitalWrite(Pumpe, HIGH);
digitalWrite(Magnetventil_C, HIGH); // DIESER BEFEHL WIRD NICHT AUSGEFÜHRT!!
}
}

else {
if (MagState_0 == false) {
if (jetzt - vorhin >= pausenzeit) {
vorhin = jetzt;
MagState_0 = true, MagState_B = true, MagState_C = false, timer1 = true;
digitalWrite(Magnetventil_0, LOW), digitalWrite(Magnetventil_B, LOW), digitalWrite(Magnetventil_C, HIGH);
delay(3000);
digitalWrite(Pumpe, LOW);
}
}

Wasserfilter_Test_probe.ino (7.69 KB)

Setze Deinen Code bitte direkt ins Forum. Benutze dazu Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *). So ist er auch auf portablen Geräten lesbar.
Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

Hi

Der Sketch fing so schön an - und dann ein 7-Tage-delay 8O

Davon ab ... Das tut?

    digitalWrite(Magnetventil_0, HIGH), digitalWrite(Pumpe, HIGH), digitalWrite(PIEPS, HIGH), digitalWrite(Magnetventil_A, HIGH), digitalWrite(Magnetventil_B, HIGH), digitalWrite(Magnetventil_C, HIGH);
    delay(604800000);  // 7 Tage

Meine - die ganzen Komma da drin ...

WAS soll der Sketch WANN machen?
Ich tue mich akut etwas schwer, den Ablauf zusammen zu bekommen.
Auch, weil auf Knopfdrücke reagiert werden soll wo auch besagte Pausen (7 Tage ... DELAY !!!) vorkommen.
Timer2 sagt mir nur, daß Es wohl auch einen Timer1 geben wird ... aber was damit ist??

MfG

Hier mal mein Programm:

erläutern tue ichs im nächsten post!

int druckSchalter = 6;              // pullup Taster gedrückt = Wasserfilterung & Ausguss in Behälter für Ausgusszeit
int druckSchalterStatus=0;
int messwert=0;                     // Wassersensor = Leckwassermelder - Wasserkontakt = Mag_0 geschlossen bis Arduino reset
int PIEPS=5;                        // Wassersensor positiv = dauer Pips

const byte Magnetventil_0  = 12;    // Hauptwasserzufluss - Wasserpumpe und Magnetventil gleichzeitig geschaltet.
const byte Magnetventil_A = 11;     // Spühlung der Membran - Durchfluss Wasser geschlossen = Filtervorgang  --  offen = Spühlung
const byte Magnetventil_B = 10;     // Wasser Abfluss
const byte Magnetventil_C = 9;      // Wasser Ausguss
const byte Pumpe = 8;               // Pumpe Wasser Ausguss
// Magnetventil A/B/C --> normal (0) = geschlossen / (1) = durchfluss
// Magnetventil 0/Pumpe--> normal (0) = geschlossen / (1) = durchfluss

// Mag_V-0 Anschlüsse an Relais drehen  & Programm ändern --> bei Stromausfall 5V =  ... MagV_0 muss aus sein!

// Test Zeiten A
// const unsigned long ausgusszeit = 5000, pausenzeit = 10000, spuehlzeit = 20000, spuehlpause = 20000;
//                        5 Sekunden        10 Sekunden         20 Sekunden   

// Test Zeiten B
const unsigned long ausgusszeit = 300000, pausenzeit = 7200000, spuehlzeit = 10800000, spuehlpause = 10800000;
//                                  5min             2 Stunde                    3 Stunden

// Dauerbetrieb Zeiten
//const unsigned long ausgusszeit = 600000, pausenzeit = 43200000, spuehlzeit = 129600000, spuehlpause = 129600000;
//                                 10min         12 Stunde                        36 Stunden  
    
unsigned long jetzt, vorhin, spuehljetzt, spuehlvorhin;

// Relais
bool MagState_0 = false;      // Hauptwasserzufluss      -  false = kein Wasser & Pumpe aus  // true = Wasser fliesst & Pumpe ein
bool MagState_A = false;      // Spühlung der Membran    -  false = Filter  // true = Spühlung (Durchfluss Wasser geschlossen = Filtervorgang  --  offen = Spühlung)
bool MagState_B = false;      // Wasser Abfluss          -  false = kein Abwasser --> Ausguss (Behälter) // true = Abwasser fliesst --> Abwasser
bool MagState_C = false;      // Wasser Ausguss          -  false = kien Wasser --> Abwasser // true = Wasser fliesst --> Ausguss (Behälter)
bool timer1 = false;
bool timer2 = false;

// Relais 0/A/B/C -       IN = 0 --> relais grün   --> Kontakt A-B = 1 (Stromfluss)    -----> Relais aus = Mag_V aus (keine erwärmung der Bauteile)

// Relais IN an GRND = geschlossen
// Arduino ausgang HIGH = Relais false / Arduino Ausgang LOW = Relais true 
// Relais false = Mag Ventil geschlossen / Relais true = Mag Ventil durchfluss
// --> Arduino HIGH = Mag Ventil geschlossen (false) / Arduino LOW = Mag Ventil durchfluss (true)

void setup() {
 Serial.begin(9600);
 pinMode (druckSchalter, INPUT_PULLUP);    // offen = HIGH (1) = kein Ausguss - warten
                                           // geschlossen (gedrückt) = LOW (0) = Wasserfilterung & Ausguss in Behälter für Ausgusszeit
//pinMode (leck, INPUT);
 pinMode (5,OUTPUT);                       // PIPS
 pinMode (A1,INPUT);                       // Lechwasser
 
 // Ausgang Arduino
 pinMode(Magnetventil_0, OUTPUT);          // LOW = gesperrt & Pumpe Aus -- HIGH = durchfluss & Pumpe ein   !!!    //// Relais gedreht
 pinMode(Magnetventil_A, OUTPUT);          // HIGH = Filter -- LOW = Spühlung
 pinMode(Magnetventil_B, OUTPUT);          // HIGH = Ausguss (Behälter) // LOW = Abfluss (abwasser)
 pinMode(Magnetventil_C, OUTPUT);          // HIGH = Abfluss (abwasser)  // LOW = Ausguss(Behälter) 
 pinMode(Pumpe, OUTPUT);                   // HIGH = Pumpe ein   // LOW = Pumpe aus                          !!!   //// Relais gedreht

digitalWrite(Magnetventil_0, HIGH);
digitalWrite(Pumpe, HIGH);
digitalWrite(Magnetventil_A, HIGH);
digitalWrite(Magnetventil_B, HIGH);
digitalWrite(Magnetventil_C, HIGH);

}

void loop() {
  jetzt = millis();
  spuehljetzt = millis();
  messwert=analogRead(A1);
  druckSchalterStatus=digitalRead(druckSchalter);

   if (messwert>100 ) {                        
        spuehlvorhin = spuehljetzt ;                   
        vorhin = jetzt;
        MagState_0 = false;
        digitalWrite(Magnetventil_0, HIGH),digitalWrite(Pumpe, HIGH), digitalWrite(PIEPS, HIGH), digitalWrite(Magnetventil_A, HIGH), digitalWrite(Magnetventil_B, HIGH), digitalWrite(Magnetventil_C, HIGH);
        delay(604800000);  // 7 Tage
      }
        
    else   { 

    
              if (!MagState_A) {
                 if (spuehljetzt - spuehlvorhin >= spuehlpause) {
                    spuehlvorhin = spuehljetzt;
                    timer2 = true;
                    }
                 } 
              else {
                 if (spuehljetzt - spuehlvorhin >= spuehlzeit) {
                     spuehlvorhin = spuehljetzt;
                     timer2 = false;
                     }
                   }

              if ((timer1 == true) && (timer2 == true))  { 
                 MagState_A = true;
                 digitalWrite(Magnetventil_A, LOW);
                 }
              else   {
                 if  ((timer1 == false) || (timer2 == false))   {
                     MagState_A = false;
                     digitalWrite(Magnetventil_A, HIGH);
                     }
                 }
  

              if (druckSchalterStatus == HIGH) {           // Taster gedrückt = Ausguss Filterwasser in Behälter
                                                          //               MagV_0 = LOW  (Durchfluss)  MagV_C = LOW (Durchlfuss @ Behälter)
                  vorhin = jetzt;                        //               MagV_B = HIGH (geschlossen)  MagV_A = HIGH (Filter)
                  MagState_0 = true, MagState_A = false, MagState_B = false, MagState_C = true;
                  digitalWrite(Magnetventil_0, LOW), digitalWrite(Magnetventil_A, HIGH), digitalWrite(Magnetventil_B, HIGH), digitalWrite(Magnetventil_C, LOW);
                  delay(3000);
                  digitalWrite(Pumpe, LOW);
               
                  if (jetzt - vorhin >= ausgusszeit) {
                     vorhin = jetzt;
                     MagState_0 = false, MagState_B = true, MagState_C = true, MagState_C = false ;
                     digitalWrite(Magnetventil_0, HIGH),digitalWrite(Pumpe, HIGH);
                     digitalWrite(Magnetventil_C, HIGH);
                     }
              }
               
              else {
                   if (MagState_0 == false) {                                 //  Spühlen - Wasser in Ausguss
                      if (jetzt - vorhin >= pausenzeit)  {                   //               MagV_0 = LOW (durchfluss)  MagV_C = HIGH (geschlossen)
                          vorhin = jetzt;                                    //               MagV_B = LOW (Durchlfuss@Abfluss)  MagV_A = egal
                          MagState_0 = true, MagState_B = true, MagState_C = false, timer1 = true;
                          digitalWrite(Magnetventil_0, LOW), digitalWrite(Magnetventil_B, LOW), digitalWrite(Magnetventil_C, HIGH);
                          delay(3000);
                          digitalWrite(Pumpe, LOW);
                          }
                      }
  
                    else {
                         if (jetzt - vorhin >= ausgusszeit) {
                            vorhin = jetzt;
                            MagState_0 = false, MagState_B = false, timer1 = false;
                            digitalWrite(Magnetventil_0, HIGH),digitalWrite(Pumpe, HIGH), digitalWrite(Magnetventil_B, HIGH);
                            }
                         }


                    }
           }
}

Hallo zusammen,
danke dass ihr mir ein weig hilft!

Das Problem erkäre ich nochmals ganz am ende des Post - vielleicht muss man zum lösen des Problems das Programm gar nicht ganz verstehen!

Die Magnetventile sind stromlos zu und mit Strom offen = Durchfluss
Die Relais sind bei GRND an IN geschaltet und mit Signal an IN aus.

ok, der 7 Tage delay ist der Leckwassersensor - also wenn beim Wasserfilter Wasserleckt dann soll er konstant auf aus sein!

Mag_V_0 ist das Zuwasserventil
Pumpe die Wasserpumpe

Mag_V_A ist die Spühlschaltung - die ersten Befehle nach dem Leckwasser-delay sind für dieses Ventil.
Das Venil A soll alle 36h ein und wider ausschalten.
Ich möchte aber dass das Ventil nicht heissläuft.
Darum schaltet es durch den timer1 nur ein, wenn der Spühlvorgang (alle 12h) stattfindet.

              if (!MagState_A) {
                 if (spuehljetzt - spuehlvorhin >= spuehlpause) {
                    spuehlvorhin = spuehljetzt;
                    timer2 = true;
                    }
                 } 
              else {
                 if (spuehljetzt - spuehlvorhin >= spuehlzeit) {
                     spuehlvorhin = spuehljetzt;
                     timer2 = false;
                     }
                   }

              if ((timer1 == true) && (timer2 == true))  { 
                 MagState_A = true;
                 digitalWrite(Magnetventil_A, LOW);
                 }
              else   {
                 if  ((timer1 == false) || (timer2 == false))   {
                     MagState_A = false;
                     digitalWrite(Magnetventil_A, HIGH);
                     }
                 }

Mag_V_B ist für den Wasserabfluss - bei Spühlen immer offen nur zu wenn Taster gedrückt

Mag_V_C ist für den Filterwasser Ausguss - nur offen wenn Taster gedrückt

Tasterschaltung: Tasterdruck = Wasserfilterung für 10min

              if (druckSchalterStatus == HIGH) {           // Taster gedrückt = Ausguss Filterwasser in Behälter
                                                          //               MagV_0 = LOW  (Durchfluss)  MagV_C = LOW (Durchlfuss @ Behälter)
                  vorhin = jetzt;                        //               MagV_B = HIGH (geschlossen)  MagV_A = HIGH (Filter)
                  MagState_0 = true, MagState_A = false, MagState_B = false, MagState_C = true;
                  digitalWrite(Magnetventil_0, LOW), digitalWrite(Magnetventil_A, HIGH), digitalWrite(Magnetventil_B, HIGH), digitalWrite(Magnetventil_C, LOW);
                  delay(3000);
                  digitalWrite(Pumpe, LOW);
               
                  if (jetzt - vorhin >= ausgusszeit) {
                     vorhin = jetzt;
                     MagState_0 = false, MagState_B = true, MagState_C = true, MagState_C = false ;
                     digitalWrite(Magnetventil_0, HIGH),digitalWrite(Pumpe, HIGH);
                    digitalWrite(Magnetventil_C, HIGH);
                     }
              }

Und das ist die Spühlschaltung - sie soll alle 12 Stunden geschehen, ausser bei Tasterdruck.
Das Mag_V_A soll sich alle 36 Stunden bei der Spühlung öffnen und schliessen, so dass das Wasser in Beiden kreisläufen (Filter & Spühlung) regelmässig getauscht wird.

else {
                   if (MagState_0 == false) {                                 //  Spühlen - Wasser in Ausguss
                      if (jetzt - vorhin >= pausenzeit)  {                   //               MagV_0 = LOW (durchfluss)  MagV_C = HIGH (geschlossen)
                          vorhin = jetzt;                                    //               MagV_B = LOW (Durchlfuss@Abfluss)  MagV_A = egal
                          MagState_0 = true, MagState_B = true, MagState_C = false, timer1 = true;
                          digitalWrite(Magnetventil_0, LOW), digitalWrite(Magnetventil_B, LOW), digitalWrite(Magnetventil_C, HIGH);
                          delay(3000);
                          digitalWrite(Pumpe, LOW);
                          }
                      }
  
                    else {
                         if (jetzt - vorhin >= ausgusszeit) {
                            vorhin = jetzt;
                            MagState_0 = false, MagState_B = false, timer1 = false;
                            digitalWrite(Magnetventil_0, HIGH),digitalWrite(Pumpe, HIGH), digitalWrite(Magnetventil_B, HIGH);
                            }
                         }

Ich hoffe ihr versteht so ein wenig mehr.

Das Problem:
Der Befehl - Der Mag_V_C = LOW bei Tasterdruck wird durch den Befehl Mag_V_C = HIGH im nächsten IF Befehl (Fett rot markiert) nicht aufgehoben.

Erst durch den Befehl HIGH Befehl in der Spühlschaltung (fett grün markiert)

if (jetzt - vorhin >= ausgusszeit) {
vorhin = jetzt;
MagState_0 = false, MagState_B = true, MagState_C = true, MagState_C = false ;
digitalWrite(Magnetventil_0, HIGH),digitalWrite(Pumpe, HIGH);
digitalWrite(Magnetventil_C, HIGH);
}
}

else {
if (MagState_0 == false) { // Spühlen - Wasser in Ausguss
if (jetzt - vorhin >= pausenzeit) { // MagV_0 = LOW (durchfluss) MagV_C = HIGH (geschlossen)
vorhin = jetzt; // MagV_B = LOW (Durchlfuss@Abfluss) MagV_A = egal
MagState_0 = true, MagState_B = true, MagState_C = false, timer1 = true;
digitalWrite(Magnetventil_0, LOW), digitalWrite(Magnetventil_B, LOW), digitalWrite(Magnetventil_C, HIGH);
delay(3000);
digitalWrite(Pumpe, LOW);
}
}

Dein Bandwurmsketch wird durch dein mehrfaches Aufteilen noch unübersichtlicher.

Du solltest deine eindeutigen Programmteile in Funktionen ausgliedern, dadurch wird dein Sketch übersichtlicher und du hast es leichter bei der Fehlersuche.

Hallo,

das mit dem delay(7tage) solltest du noch mal überdenken. Damit Du den Fehler finden kannst solltest Du ein paar Serial.print() einbauen um zu sehen wo es klemmen könnte.
ich vermute ja mal das irgendwo in einer der anderen If Bedingungen das Ventil quasi gleichzeitig wieder ausgeschaltet wird.

Aber mit den Serial.print kannst Du das finden.

Heinz

ok, sorry ... da sieht man, dass ein Anfänger am Werk ist! :cold_sweat: :cold_sweat:

Serial.print bedeutet, dass ich die Befehle auf das Magnetvenil_C auf einem Display darstelle.
Und somit erkennen kann, wann es ei & ausgeschaltet wird?

Das könnte ich aber auch mit einem LED machen oder?

Das mit dem Sketch ist nur als gut gemeinter Hinweis zu sehen.
Ein übersichtlicher Sketch wird einfach besser gelesen.

Und Leds sind zur Anzeige da nicht so optimal, mit dem seriellen Monitor kannst du mehr Informationen anzeigen.
Auch das ist übersichtlicher.

Hallo,
aus Deinem code

if (jetzt - vorhin >= ausgusszeit) {
           vorhin = jetzt;
          MagState_0 = false, MagState_B = true, MagState_C = true, MagState_C = false ;
          digitalWrite(Magnetventil_0, HIGH),digitalWrite(Pumpe, HIGH);
          digitalWrite(Magnetventil_C, HIGH);          // DIESER BEFEHL WIRD NICHT AUSGEFÜHRT!!
          Serial.println"Ventil C  ein Ausgusszeit jetzt abgelaufen " // hier ausgabe zum fehler finden
 }

damit siehst du dann das dieser Programteil abgearbeitet wird und mit diesem Teil das Ventil auch eingeschaltet wird. Wenn es denoch aus bleibt wird es an einer anderen Stelle im Program wieder ausgeschaltet.

natürlich solltest Du etwas sinvolles als Text ausgeben, damit Du den Ablauf kontrollieren kannst.

Heinz

ok, das werde ich so zu lösen probieren.

Da ich aber nur 3x einen Befehl fürs Magnetventil C gebe, hoffe ich das ich den Fehler auch noch so finde. (die Lieferzeit für den Monitor wird wohl ein paar Tage dauern)

Die Fett Markierten stellen sind alle Befehle fürs Magnetventil C!!

oiresar:
Das Problem:
Der Befehl - Der Mag_V_C = LOW bei Tasterdruck wird durch den Befehl Mag_V_C = HIGH im nächsten IF Befehl (Fett rot markiert) nicht aufgehoben.

Erst durch den Befehl HIGH Befehl in der Spühlschaltung (fett grün markiert)

if (druckSchalterStatus == HIGH) { // Taster gedrückt = Ausguss Filterwasser in Behälter
// MagV_0 = LOW (Durchfluss) MagV_C = LOW (Durchlfuss @ Behälter)
vorhin = jetzt; // MagV_B = HIGH (geschlossen) MagV_A = HIGH (Filter)
MagState_0 = true, MagState_A = false, MagState_B = false, MagState_C = true;
digitalWrite(Magnetventil_0, LOW), digitalWrite(Magnetventil_A, HIGH), digitalWrite(Magnetventil_B, HIGH), digitalWrite(Magnetventil_C, LOW);
delay(3000);
digitalWrite(Pumpe, LOW);

if (jetzt - vorhin >= ausgusszeit) {
vorhin = jetzt;
MagState_0 = false, MagState_B = true, MagState_C = true, MagState_C = false ;
digitalWrite(Magnetventil_0, HIGH),digitalWrite(Pumpe, HIGH);
digitalWrite(Magnetventil_C, HIGH);
}
}

else {
if (MagState_0 == false) { // Spühlen - Wasser in Ausguss
if (jetzt - vorhin >= pausenzeit) { // MagV_0 = LOW (durchfluss) MagV_C = HIGH (geschlossen)
vorhin = jetzt; // MagV_B = LOW (Durchlfuss@Abfluss) MagV_A = egal
MagState_0 = true, MagState_B = true, MagState_C = false, timer1 = true;
digitalWrite(Magnetventil_0, LOW), digitalWrite(Magnetventil_B, LOW), digitalWrite(Magnetventil_C, HIGH);
delay(3000);
digitalWrite(Pumpe, LOW);
}
}

ok, dann muss ich mir erst einen Monitor bestellen.

(die Lieferzeit für den Monitor wird wohl ein paar Tage dauern)

Ist das ernst gemeint?


Oben rechts.

Grüße Uwe

Hallo,

der Monitor ist in der IDE enthalten , Werkzeuge / serieller Monitor , schau dir dazu mal ein Beispiel an

Beispiel / Baiscs / analogReadSerial

Heinz