INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 1 Bewertungen - 2 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Sich wiederholende Intervalle ohne Delay Verzweiflung
11.12.2019, 11:13
Beitrag #1
Sich wiederholende Intervalle ohne Delay Verzweiflung
Hallo liebe Leute,

ich bin leider am verzweifeln und versuche mir hier jetzt Hilfe zu holen, da ich seit 2 Wochen jede Nacht an meinem Code gesessen habe und es aber wohl alleine einfach nicht hin bekomme.. Confused

Es geht um 4 Relais die in Intervallen nacheinander ein und ausgeschaltet werden sollen. Der Skatch läuft aktuell auch, jedoch mit der Funktion Delay die mir natürlich den ganzen Ablauf einfriert.

Ich stelle euch mal den Skatch der aktuell läuft hier rein und einen meiner versuche es one Delay zu lösen:

Code:
#include <Adafruit_SleepyDog.h>


// Bewässerungs Intervalltimer v2.0 Tag/Nacht

const int threshold = 100;
const int relai1 = 2;
const int relai2 = 3;
const int relai3 = 4;
const int relai4 = 5;
const int sensorvcc = 8;




void setup() {
  
Serial.begin(115200);
  while(!Serial) delay(10);
Serial.println("");
Serial.println("Bewässerungs Intervalltimer v2.0 Tages- und Nachtsteuerung");
Serial.println("");

  pinMode(relai1, OUTPUT);
  pinMode(relai2, OUTPUT);
  pinMode(relai3, OUTPUT);
  pinMode(relai4, OUTPUT);
  pinMode(sensorvcc, OUTPUT);

  
  //int countdownMS = Watchdog.enable(4000);
  //Serial.print("Watchdog enabled ");
  //Serial.print(countdownMS, DEC);
  //Serial.println(" milliseconds!");
  //Serial.println();
  }




void loop() {

    digitalWrite(sensorvcc, HIGH);

  int sensorValue = analogRead(A0);  

  Serial.println("");
  Serial.println("Intervall Start...");
  Serial.println("");
  Serial.println("Sensorwert");
  Serial.println(sensorValue);
  

  if (sensorValue > threshold) {
   Serial.println("Tag Intervall");
   Serial.println("Relai 1 AN");
    digitalWrite(relai1, HIGH);  
    delay(300000);
    digitalWrite(relai1, LOW);
   Serial.println("");  
  }
else {      
   Serial.println("Nacht Intervall");
   Serial.println("Relai 1 AN");
    digitalWrite(relai1, HIGH);  
    delay(120000);                
    digitalWrite(relai1, LOW);
   Serial.println("Pause");
    delay(900000);
    
  }  

    sensorValue = analogRead(A0);
   Serial.println("Sensorwert");
   Serial.println(sensorValue);
if (sensorValue > threshold) {
   Serial.println("Tag Intervall");
   Serial.println("Relai 2 AN");
    digitalWrite(relai2, HIGH);  
    delay(300000);
    digitalWrite(relai2, LOW);
   Serial.println("");
  }
else {                    
   Serial.println("Nacht Intervall");
   Serial.println("Relai 2 AN");
    digitalWrite(relai2, HIGH);  
    delay(120000);                
    digitalWrite(relai2, LOW);
   Serial.println("Pause");
    delay(900000);
    Serial.println("");
  }

    sensorValue = analogRead(A0);
   Serial.println("Sensorwert");
   Serial.println(sensorValue);
if (sensorValue > threshold) {
   Serial.println("Tag Intervall");
   Serial.println("Relai 3 AN");
    digitalWrite(relai3, HIGH);  
    delay(300000);
    digitalWrite(relai3, LOW);
    Serial.println("");
  }
else {                    
   Serial.println("Nacht Intervall");
   Serial.println("Relai 3 AN");
    digitalWrite(relai3, HIGH);  
    delay(120000);                
    digitalWrite(relai3, LOW);
   Serial.println("Pause");
    delay(900000);
    Serial.println("");
  }

    sensorValue = analogRead(A0);
   Serial.println("Sensorwert");
   Serial.println(sensorValue);
if (sensorValue > threshold) {
   Serial.println("Tag Intervall");
   Serial.println("Relai 4 AN");
    digitalWrite(relai4, HIGH);  
    delay(300000);
    digitalWrite(relai4, LOW);
    Serial.println("");
  }
else {                    
   Serial.println("Nacht Intervall");
   Serial.println("Relai 4 AN");
    digitalWrite(relai4, HIGH);  
    delay(120000);                
    digitalWrite(relai4, LOW);
   Serial.println("Pause");
    delay(900000);
    Serial.println();
    Serial.println("Interval Ende.");
    Serial.println("");
    //Watchdog.reset();

  }
}

Hier ein Lösungsansatz:

Code:
const int relai1 = 2;
const int relai2 = 3;
const int relai3 = 4;
const int relai4 = 5;


unsigned long previousMillis = 0;
const long interval = 10000;

void setup() {
  
Serial.begin(115200);

  pinMode(relai1, OUTPUT);
  pinMode(relai2, OUTPUT);
  pinMode(relai3, OUTPUT);
  pinMode(relai4, OUTPUT);
}



void loop() {

unsigned long currentMillis = millis();
  if (currentMillis - previousMillis <= interval) {
    
  digitalWrite(relai1, HIGH);
  }
   if (currentMillis >= interval) {
      
  digitalWrite(relai1, LOW);
  }

    if (currentMillis - previousMillis <= interval) {
    
  digitalWrite(relai1, HIGH);
  }
   if (currentMillis >= interval) {
      
  digitalWrite(relai1, LOW);
  }

}

Und hier noch einer:

Code:
const int relai1 = 2;
const int relai2 = 3;
const int relai3 = 4;
const int relai4 = 5;


int relaiZahl = 4;                                  
int ledPin[] = {2, 3, 4, 5};                    
unsigned long currentMillis = 0;
unsigned long previousMillis[] = {0, 0, 0, 0};
int interval[] = {3000, 6000, 9000, 12000};      




void setup() {

  for (int i = 0; i < relaiZahl; i++) {
    pinMode(ledPin[i], OUTPUT);
  }
}

void loop() {
  currentMillis = millis();
  for (int i = 0; i < relaiZahl; i++) {     if(currentMillis - previousMillis[i] > interval[i]) {
      previousMillis[i] = currentMillis;
      digitalWrite(ledPin[i], HIGH);
    }
    else if(currentMillis - previousMillis[i] > interval[i]) {
      digitalWrite(ledPin[i], LOW);
    }
  }
}

Ich bekomme die Relais zwar eingeschalten aber nicht wieder aus und des weiteren ist mir noch nicht klar wie ich über die millis Funktion nach schalten des letzten Relais wieder von vorne anfangen kann.

Leute ich wäre euch so dankbar wenn jemand helfen kann HeartHeartHeart
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.12.2019, 12:12
Beitrag #2
RE: Sich wiederholende Intervalle ohne Delay Verzweiflung
Schau Dir das Beispirel BlinkWithoutDelay in der IDE an und verstehe es. Dabei kann Dir die Nachtwächtererklärung und/oder die Erklärung zu millis hier in "Tutorials und Literatur" helfen.

Schreibe Dir genau auf, was wann mit Deinen Relais passieren sollen (also wann sie ein-/ausgeschaltet werden sollen).

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.12.2019, 12:55
Beitrag #3
RE: Sich wiederholende Intervalle ohne Delay Verzweiflung
Der letzte Punkt von Tommy ist auch sehr wichtig. Wie sollen die Relais schalten? Ist das Schalten voneinander abhängig, oder schaltet jedes Relais im eigenen Zeittakt, unabhängig von den anderen?

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.12.2019, 15:22
Beitrag #4
RE: Sich wiederholende Intervalle ohne Delay Verzweiflung
(11.12.2019 12:12)Tommy56 schrieb:  Schau Dir das Beispirel BlinkWithoutDelay in der IDE an und verstehe es. Dabei kann Dir die Nachtwächtererklärung und/oder die Erklärung zu millis hier in "Tutorials und Literatur" helfen.

Schreibe Dir genau auf, was wann mit Deinen Relais passieren sollen (also wann sie ein-/ausgeschaltet werden sollen).

Gruß Tommy

Erst mal vielen Dank für deine Antwort !

Ich habe das BlinkWithoutDelay Beispiel nach jedem weiteren Versuch, immer wieder zu rate genommen und versucht mich bei meinem Vorhaben daran zu orientieren.
Auch erweiterte Beispiele auf Basis des BlinkWithoutDelay Programm´s, haben mich zwar immer wieder auf neue Lösungsansätze gebracht aber leider nie zu einem funktionierendem Ergebnis geführt.
Als ich vor einigen Tagen auf das Beispiel anhand des Nachtwächters gestoßen bin, dachte ich das wäre der Durchbruch aber leider auch wieder nicht zum Ziel geführt.


(11.12.2019 12:55)MicroBahner schrieb:  Der letzte Punkt von Tommy ist auch sehr wichtig. Wie sollen die Relais schalten? Ist das Schalten voneinander abhängig, oder schaltet jedes Relais im eigenen Zeittakt, unabhängig von den anderen?

Auch dir erst mal herzlichen Dank für die Antwort !

Die Relais sollen immer einzeln und nacheinander laufen: Relai 1 5min an und dann so lange aus, bis alle anderen Relais fertig sind.
Dann soll es noch den Fall geben, in dem die Zeiten sich ändern und nochmals zusätzliche Pausen zwischen jedes Relai kommen.

Ich bekomme mit der millis Funktion zwar die Relais an, jedoch nicht mehr aus und auch ein Intervall der sich dann stetig wiederholt ist mir bis jetzt nicht gelungen.

Ich habe wirklich mit allen Mittel versucht selbst auf die Lösung zu kommen aber aktuell droht eben das ganze Projekt an dieser Sache zu scheitern.. Confused
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.12.2019, 15:46
Beitrag #5
RE: Sich wiederholende Intervalle ohne Delay Verzweiflung
(11.12.2019 15:22)RobertLeRopp schrieb:  Die Relais sollen immer einzeln und nacheinander laufen: Relai 1 5min an und dann so lange aus, bis alle anderen Relais fertig sind.
Dann soll es noch den Fall geben, in dem die Zeiten sich ändern und nochmals zusätzliche Pausen zwischen jedes Relai kommen.
Hmm ... kann ich mir im Ganzen noch nicht so recht vorstellen. Kannst Du da mal ein Zeitdiagramm zeichnen ( einfach auf ein Blatt Papier und abfotografieren reicht ), dass man sich das besser vorstellen kann? Wenn da Abhängigkeiten sind, ist millis() ja nur die halbe Lösung.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.12.2019, 16:37
Beitrag #6
RE: Sich wiederholende Intervalle ohne Delay Verzweiflung
Ich komme mit der Beschreibung auch nicht wirklich klar. Besonders "soll es noch andere Zeiten mit Pausen geben" ist ja eigentlich ein NoGo in der Beschreibung.

Male das Ganze wirklich mal auf, auch mit den Pausen (wovon sollen die abhängig sein?)

Was ich in Deinem Code vermisse, ist das Setzen von previousMillis.
Der Ablauf ist zwingend immer so:
Code:
if (millis() - previousMillis >= intervall) {
  previousMillis = millis();
  // tu was
}
Jede Abweichung davon führt Dich früher oder später ins Verderben.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.12.2019, 16:51
Beitrag #7
RE: Sich wiederholende Intervalle ohne Delay Verzweiflung
Also. es geht um 4 Relais, die nacheinander geschaltet werden sollen, diese Relais sind aber niemals gleichzeitig an, sondern eines nach dem anderen

Das ganze noch unterschiedlich am Tag und in der Nacht.

der Ablauf am Tag:

Relai 1 geht für 5 Minuten an und schaltet sich danach aus, nun geht Relai 2 für 5 Minuten an und danach wieder aus, nun Relai 3 für 5 Minuten an danach aus und zu guter letzt Relai 4 für 5 Minuten an und dann aus.

Sobald das letzte relai ausgegangen ist (in dem Fall Relai4) soll alles wieder von vorne beginnen, also bei Relai 1.
Und das ist für mich auch der größte Knackpunkt, das eben nach Ablauf meiner 4 Relais alles wieder von vorne beginnt.

Nachts soll zwischen jedem Relai das abgeschalten wurde jeweils noch eine Pause herrschen bevor es mit dem nächsten Relai weiter geht.

Ich versuche es aktuell schon wieder mit diesem Beispiel hier, habe ich aber auch schon mehrfach durch..
https://www.arduinoforum.de/arduino-Thre...kl%C3%A4rt
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.12.2019, 17:06
Beitrag #8
RE: Sich wiederholende Intervalle ohne Delay Verzweiflung
Und woher weist Du, ob es Tag oder Nacht ist?
Sind die Nachtpausen gleich lang?

Wir warten dann mal auf die Skizze.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  delay-millis()-while-Sensorenabfrage RCudino 22 816 01.04.2020 06:46
Letzter Beitrag: RCudino
  Denkanstoß gesucht - in Schrittkette delay() ersetzen SpaghettiCode 19 403 31.03.2020 21:31
Letzter Beitrag: MicroBahner
  for-schleife, delay, millis, interrupt Harry 8 172 31.03.2020 21:02
Letzter Beitrag: Harry
  Menu funktioniert ohne Serial.println nicht GSA1150 7 143 30.03.2020 18:26
Letzter Beitrag: Tommy56
  Stepper Motor mit zwei Taster bedienen / Fehler ohne Fehlermeldung Milano 6 264 21.03.2020 16:06
Letzter Beitrag: MicroBahner
  Arduino IDE 1.8.11 , lassen sich keine Sketch.zip hinzufügen Christian_Moba-Arduino 4 484 23.02.2020 13:18
Letzter Beitrag: Christian_Moba-Arduino
  Scrollpausen im Oled Display ohne Delay Alter Fritz 7 437 25.01.2020 13:22
Letzter Beitrag: Alter Fritz
  Millis anstatt delay ThorstenP 25 2.007 29.11.2019 16:34
Letzter Beitrag: Tommy56
  Programm hängt sich auf Jonas Meier 3 479 13.11.2019 11:12
Letzter Beitrag: MicroBahner
  Schleife nur 1x durchlaufen ohne for... Hanibal_Smith 3 678 01.10.2019 19:44
Letzter Beitrag: Tommy56

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste