Steuerung Magnetventile / Hauptstrom/ Bypass mit Taster

Moin Moin

Ich möchte eine Einweichanlage für Schweineställe bauen, mit der ich nach dem Waschen auch desinfizieren kann. Dazu muss ich zwei Magnetventile bzw. zwei Relais schalten. Das eine soll ca. alle dreißig Minuten drei Minuten lang Wasser durchlassen, und dass immer wiederholen. Dann will ich die Einweichanlage erstmal wegstellen, mit dem Hochdruckreiniger waschen und danach soll für drei Minuten Wasser über einen Bypass mit einem Dosiersystem geführt werden, und das ganze soll nach einer Viertelstunde einmalig wiederholt werden. Danach soll sich das System am besten Ausschalten oder einfach garnichts machen. Für das Umstellen auf desinfizieren habe ich einen Schalter eingebaut. Dieser muss also quasi jederzeit auszulesen sein.

Das ganze ist mein erstes Projekt, und ich hab mir folgenden Code schon mal versucht aus verschiedenen Foren zusammenzukopieren.

int redPin = 9;
int schalterPin = 2;
int tasterstatus = 0;
byte wasser = 12;
int mittel = 10;
byte greenPin = 13;                  // LED liegt am (digitalen) Pin 13
boolean valuelampe = LOW;         // Startwert der LED
boolean valuerelais = LOW;

;
unsigned long previousMillis = 0; // speichert wie viele Sekunden seit derletzten Änderung vergangen sind
unsigned long interval = 1000;    // Interval zwischen zwei Änderungen
 
void setup()
{
  pinMode(greenPin, OUTPUT);      // Setzt den ledPin (Pin 13) als Ausgang
pinMode (schalterPin, INPUT);
pinMode(redPin,OUTPUT);
pinMode (wasser,OUTPUT);
pinMode (mittel, OUTPUT);
}

 
void loop()
{
tasterstatus=digitalRead(schalterPin);

if (tasterstatus == HIGH) {
digitalWrite (greenPin, LOW);
digitalWrite (redPin, HIGH);
digitalWrite (wasser, LOW);
digitalWrite (mittel, HIGH);
delay (3000);
digitalWrite (redPin, LOW);
digitalWrite (mittel, LOW);
delay (3000);
digitalWrite (redPin, HIGH);
digitalWrite (mittel, HIGH);
delay (3000);
digitalWrite (redPin, LOW);
digitalWrite (mittel, LOW);
delay (3000);

}
else
{
digitalWrite(redPin, LOW);
}
 /* es wird kontrolliert, ob die Zeit für das Blink-Intervall schon abgelaufen ist
  * Wenn die Zeitdifferenz zwischen dem Letzten Abspeichern und der aktuellen Zeit größer
  * als das Intervall ist, so wird die nachfolgende Funktion ausgeführt.
  */
  if (millis() - previousMillis > interval) {
    previousMillis = millis();   // aktuelle Zeit abspeichern
 
    // LED Zustand wecheln.
    valuelampe = !valuelampe;
 valuerelais= !valuerelais;
    // Wert auf den Ausgang schreiben
    digitalWrite(greenPin, valuelampe);
  digitalWrite(wasser, valuerelais);
  }
}

Jetzt habe ich die Hardware und alles Problemlos mit dem Code prüfen können, hatte extra dafür kurze Intervalle eingestellt. Allerdings habe ich jetzt gemerkt, dass ich die Wasserprogrammierung ja nicht auf 3/30 einstellen kann. Kann mir jemand weiter helfen? Vielleicht ja auch nur mit einem Link zu einer ähnlichen Programmierung.

PS: Zur Anzeige und Fehlervermeidung habe ich zwei LED´s, eine grüne für Wasser und eine rote für Desinfektionsmittel eingebaut.

statt der delay's arbeitest du auch mit millis wie bei valuelampe

So lange Du mit delay() arbeitest,
legst du den Controller für diese
Zeit schlafen. Er tut dann NIX.
Auch nicht den Schalter abfragen.

Das wiederspricht deinem Wunsch
ihn jederzeit abfragen zu können.

Es gibt die Möglichkeit, das millis()
mehrfach einzusetzen, um die delays zu ersetzen.

Was ich nicht verstanden habe ist dein Wunsch
die Wasserprogrammierung auf "3/30" einzustellen.
Evtl. gehst du darauf näher ein?

Stefan

Danke erstmal für die Antworten

Also der Schalter muss nur auslesbar sein, wenn das Wasser läuft, damit ich auf Desinfizieren umstellen kann. Nachdem der Schalter gedrückt wurde, soll nur noch zweimal das Ventil auf gehen und dann gar nichts mehr passieren.

Ich möchte, dass das Wasser für drei Minuten fließt und dann für 30 Minuten aus ist, nur soll in dieser Zeit immer der Knopf ausgelesen werden.

Eigentlich brauchte ich erst mal Hilfe dabei, zwei verschieden lange Zeiten für das Wasser einzustellen mit millis()

Wenn Du schon 1 mal mit millis() arbeitest, sollte das 2. Mal doch kein Problem sein:

uint32_t aktMillis, lastMillis1, lastMillis2;
uint32_t intervall1 = 30000, intervall2 = 1000;

void loop() {
  aktMillis = millis();
  if (aktMillis - lastMillis1 >= intervall1) {
    lastMillis1 = aktMillis;
    tueEtwas();
  }
  if (aktMillis - lastMillis2 >= intervall2) {
    lastMillis2 = aktMillis;
    tueEtwasAnderes();
  }
}

Gruß Tommy