Interrupt lässt Relais wild und schnell schalten.

Du brauchst für deine Relaissteuerung keinen Interrupt.
So zeitkritisch ist deine Steuerung nicht.

Mach es ganz normal in der Loop.
Dazu musst du natürlich deine kompletten delays() entfernen und durch eine Funktion mit millis ersetzen.
Sieh dir dazu das Beispiel BlinkWithoutDelay in der IDE an.

Interrupts sind für Dinge die sehr schnell und/oder sehr regelmäßig stattfinden müssen.

Entsprechend sollten Interrupts auch so kurz wie möglich sein. Sie sind kein Ersatz für regulären Programmfluss. delay() hat darin nichts verloren und geht auch gar nicht.

Vielen Dank für die schnellen Antworten.

Das Problem ist aber das in der falls/sonst Variante das Programm ja diese ca. 3 Stunden in Warteposition steht bevor das Ventil eben für die besagte Minute öffnet. In dieser Zeit kann ich den Taster aber nicht abfragen oder gibt es da noch eine andere Variante?

ghostship:
Vielen Dank für die schnellen Antworten.

Das Problem ist aber das in der falls/sonst Variante das Programm ja diese ca. 3 Stunden in Warteposition steht bevor das Ventil eben für die besagte Minute öffnet. In dieser Zeit kann ich den Taster aber nicht abfragen oder gibt es da noch eine andere Variante?

Dann lies bitte meinen kompletten Post.

Du musst die delays ersetzen.

gibt es da noch eine andere Variante?

Ja. Bei BlinkWithoutDelay geht es nicht um Blinken, sondern um WithoutDelay.

Alternativ könntest Du den MoToTimer aus den MobaTools verwenden. Damit ist es vielleicht etwas einfacher :wink: . Das Grundprinzip ist aber dasselbe - die delay müssen raus. Ein Beispiel ist auch dabei.

ghostship:
... In dieser Zeit kann ich den Taster aber nicht abfragen oder gibt es da noch eine andere Variante?

Die Anderen haben ja schon erwähnt, dass BlinkWithoutDelay das Prinzip zeigt. Wenn es darum geht, mehrere Sachen quasi gleichzeitig zu erledigen, strickst Du Dir am besten einen Endlichen Automaten. Das Strickmuster ist z.B. hier, hieroder hier erklärt. Im Wesentlichen geht es darum die „warte“-Denke durch die „es ist Zeit für“-Denke zu ersetzen.

Gruß

Gregor

Hallo Leute

Jetzt habe ich nach ein wenig hin und her verstanden was man mit mills macht.
Schaue mir gleich die Beispiele der letzten 2 Kommentare an aber hier mal mein Code mit dem es jetzt wunderbar funktioniert.

Vielen Dank für eure Hilfe

long Steuerung = 0L;
int Zeit = 0;
void Unterprogramm();


void setup() {
  pinMode(15, INPUT_PULLUP);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(15, INPUT);
  digitalRead(15);

  digitalWrite( 4 , HIGH );

  digitalWrite( 5 , HIGH );

  digitalWrite( 12 , HIGH );

  digitalWrite( 13 , HIGH );

}

void loop() {
  Steuerung = millis();
  while(Steuerung + 1000L >= millis()) {		
      Unterprogramm();
    }
  Zeit = ( Zeit + 1 );
  if (( Zeit == 50 )) {
    digitalWrite( 12 , LOW );
  }
  if (( Zeit == 60 )) {
    digitalWrite( 12 , HIGH );
    Zeit = 0;
  }
}

//Pumpensteuerung
void Unterprogramm() {
  if (digitalRead(15)) {
    digitalWrite( 5 , HIGH );
    digitalWrite( 12 , HIGH );
    digitalWrite( 13 , HIGH );
    digitalWrite( 4 , LOW );
    delay( 10000 );
    digitalWrite( 4 , HIGH );
    delay( 2000 );
    digitalWrite( 5 , LOW );
    delay( 10000 );
    digitalWrite( 5 , HIGH );
    delay( 2000 );
    digitalWrite( 12 , LOW );
    delay( 10000 );
    digitalWrite( 12 , HIGH );
    delay( 2000 );
    Zeit = 0;
  }
}

Das mit den Code-Tags konntest du doch schon.
Warum hier nicht mehr ?

ghostship:
... hier mal mein Code mit dem es jetzt wunderbar funktioniert. ...

Schön, dass Du Dich nochmal meldest. Gib Dir noch ein bisschen Mühe, Deinen Code lesefreundlicher zu gestalten und mit Kommentaren zu versehen - z.B. was an welchen Pin angeschlossen ist. Du weißt nicht, was dieses Wochenende noch auf Dich zukommt :slight_smile:

Gruß

Gregor

gregorss:
Schön, dass Du Dich nochmal meldest. Gib Dir noch ein bisschen Mühe, Deinen Code lesefreundlicher zu gestalten und mit Kommentaren zu versehen - z.B. was an welchen Pin angeschlossen ist. Du weißt nicht, was dieses Wochenende noch auf Dich zukommt :slight_smile:

Gruß

Gregor

Was meinst du mit "was auf dich zukommt"?

Jetzt funktioniert es wirklich gut.
Auch schön das es die Delays gibt, denn ich will das der Taster nicht abgefragt wird solange sich das Modul im Sprinklerbetrieb befindet und nicht im Leerlauf.

Wie füge ich denn Kommentare hinzu?
Ich habe vermutlich das Pferd von hinten aufgezäumt aber das ist schon immer meine Art.

Hi

ghostship:
Ich hatte also folgendes vor und benutze dazu ArduBlock in Version 2.

Befürchte, sowohl die 'magic numbers' wie die fehlenden Kommentare sind der Programmier-Art geschuldet.

Bin mir nicht sicher, ob diese 'Einsteigerfreundlichen Systeme' nicht doch die falsche Richtung ist - ob man aus den zusammen gepuzzelten Blöcken in drei Wochen noch mehr herleiten kann, als ein Häh?

MfG

PS: Wenn Du etwas nur zu bestimmten Zeiten abfargen willst, dann mach Das doch auch so - delay() ist der falsche Weg - Du verbaust Dir somit sämtliche Möglichkeiten, Deinen Sketch zu erweitern - weil Alles einfach nur blockiert.
Das wirst Du erkennen, wenn Du Dir die Links in #7 reingezogen hast.
Die MoBaTools aus #6 gehen ebenfalls diese Richtung und bei Fragen dazu ist der MicroBahner (ist ja Seine Lib) auch nicht weit weg.

Z.B. so: // Kommentar.

ghostship:
Auch schön das es die Delays gibt, denn ich will das der Taster nicht abgefragt wird solange sich das Modul im Sprinklerbetrieb befindet und nicht im Leerlauf.

Dazu braucht man doch kein Delay

ghostship:
Was meinst du mit "was auf dich zukommt"?

KO-Tropfen, Drogen, aus dem Fenster geworfene Klaviere ...

Wie füge ich denn Kommentare hinzu?
Ich habe vermutlich das Pferd von hinten aufgezäumt aber das ist schon immer meine Art.

Ich vergaß - Du benutzt Ardublock. Notiere halt irgendwie/-wo, was wo passiert und was wofür benutzt wird.

Gruß

Gregor

Hallo Gemeinde

Ich habe den Code nun auf den Wemos geladen und und meine Box verkabelt.

Leider schaltet der Sketch auch auf den Kreislauf der Ventile wenn der Taster nicht gedrückt wird.
Dies scheint unwillkürlich zu passieren. Genau wird dies dann durch die Zeit für das Öffnen des Ventils an Pin 12 ausgelöst.

Kann es sein das der Eingang für den Taster irgendwie nur minimale Spannungen als Signal interpretiert?
Ich benutze den 3,3 V Ausgang des Wemos für das Startsignal da die 5 V für das Relais-Shield reserviert sind. Ich habe schon eine Wartezeit von 1 sek eingegeben um den Taster zu entprellen.

Leider ohne Erfolg. Muss ich da noch einen zusätzlichen Widerstand zwischen schalten?
Eigentlich habe ich ja Pull-Up für diesen Eingang aktiviert.

long Zeitsteuerung = 0L;
int Zeit = 0;
void Unterprogramm();


void setup() {
  pinMode(15, INPUT_PULLUP);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(15, INPUT);

  //Eingaenge und Ausgaenge definieren

  digitalRead(15);


  //3,3V Eingang

  digitalWrite( 4 , HIGH );

  digitalWrite( 5 , HIGH );

  digitalWrite( 12 , HIGH );

}

void loop() {
  Zeitsteuerung = millis();
  while(Zeitsteuerung + 1000L >= millis()) {		
      Unterprogramm();

      //Wenn nicht Unterprogramm durch Tastendruck aufgerufen wird, soll alle 2 Stunden das Ventil am Pin 12 fuer 30 Sekunden geoeffnet werden.
    }
  Zeit = ( Zeit + 1 );
  if (( Zeit == 7200 )) {
    digitalWrite( 12 , LOW );
  }
  if (( Zeit == 7230 )) {
    digitalWrite( 12 , HIGH );
    Zeit = 0;
  }
}

//Pumpensteuerung
void Unterprogramm() {
  if (digitalRead(15)) {

    //Wenn Taster gedrueckt, wird das Sprinklerprogramm ausgefuehrt und die 3 Ventile an Pin 4, 5 und 12 fr jeweils 40 Minuten geoeffnet
    delay( 1000 );
    digitalWrite( 5 , HIGH );
    digitalWrite( 12 , HIGH );
    digitalWrite( 4 , LOW );
    delay( 2400000 );
    digitalWrite( 4 , HIGH );
    delay( 2000 );
    digitalWrite( 5 , LOW );
    delay( 2400000 );
    digitalWrite( 5 , HIGH );
    delay( 2000 );
    digitalWrite( 12 , LOW );
    delay( 2400000 );
    digitalWrite( 12 , HIGH );
    delay( 2000 );
    Zeit = 0;
  }
}

Hi

Der automatisch generierte Sketch lässt sich nur sehr schwer lesen - Du könntest Diesen mit Kommentaren auf-hübschen.
Entferne die ganzen unnötigen Leerzeilen, schreibe in die Zeilen, WAS dort passiert.
NICHT 'Pin 12 wird auf HIGH gesetzt' - sondern eher 'Relais für Pumpe 2 wird auf AN gesetzt'.
Das Erste sehen sogar wir im Sketch, das Zweite ist nur Dir bekannt - wenn überhaupt.

Das WHILE mit millis() ist falsch herum - Abfargen IMMER millis()-startzeit>=Wartezeit.
IMMER!!
Wenn Das ArduBlock nicht bringt: Tonne
DAS fällt Dir nach 49,x Tagen (oder einem Vielfachen davon) auf die Füße - und ich weiß ja nicht, ob ich eine Amog laufende Pumpensteuerung mitten in der Nacht in ab jetzt 50 Tagen haben möchte ... doch, weiß ich: Nein, will ich nicht!

Davon ab - WO ist Da ein Interrupt?
(Nicht, daß man für einen Taster einen Interrupt braucht - man handelt sich viel mehr Probleme damit ein, als man Nutzen davon ziehen kann - man kann schlampige Programmierung damit kaschieren, aber für welchen Preis??)

MfG

pinMode(15, INPUT_PULLUP);

pinMode(15, INPUT);

Was meinst du, was diese beiden Zeilen mit deinem gewünschten Pullup machen?

postmaster-ino:
Hi

Der automatisch generierte Sketch lässt sich nur sehr schwer lesen - Du könntest Diesen mit Kommentaren auf-hübschen.
Entferne die ganzen unnötigen Leerzeilen, schreibe in die Zeilen, WAS dort passiert.
NICHT 'Pin 12 wird auf HIGH gesetzt' - sondern eher 'Relais für Pumpe 2 wird auf AN gesetzt'.
Das Erste sehen sogar wir im Sketch, das Zweite ist nur Dir bekannt - wenn überhaupt.

Das WHILE mit millis() ist falsch herum - Abfargen IMMER millis()-startzeit>=Wartezeit.
IMMER!!
Wenn Das ArduBlock nicht bringt: Tonne
DAS fällt Dir nach 49,x Tagen (oder einem Vielfachen davon) auf die Füße - und ich weiß ja nicht, ob ich eine Amog laufende Pumpensteuerung mitten in der Nacht in ab jetzt 50 Tagen haben möchte ... doch, weiß ich: Nein, will ich nicht!

Davon ab - WO ist Da ein Interrupt?
(Nicht, daß man für einen Taster einen Interrupt braucht - man handelt sich viel mehr Probleme damit ein, als man Nutzen davon ziehen kann - man kann schlampige Programmierung damit kaschieren, aber für welchen Preis??)

MfG

Die Antwort ist auch sehr schwer zu lesen. Sorry

Was soll ich damit anfangen? "Das WHILE mit millis() ist falsch herum - Abfargen IMMER millis()-startzeit>=Wartezeit.
IMMER!!"

Warum sollte mir die Steuerung nach 50 Tagen auf die Füsse fallen?
Ich setze doch die Zeit jeweils nach jeder "Reaktion" wieder zurück auf 0.

Und das mit dem Interrupt habe ich ja gelassen nachdem mir schon jemand anderes unter die Arme gegriffen hatte.

Ich nehme das Startsignal über einen Taster vom Pin 3,3 V zum digitalen I/O Pin D15.
Wollte eigentlich nur wissen ob es sein kann das der Taster prellt oder dort noch minimale Spannungen fließen die den Eingang irreführen.

Warum sollte mir die Steuerung nach 50 Tagen auf die Füsse fallen?

millis() selbst läuft nach ca. 50 Tagen über