[gelöst] millis() statt delay , ich verzweifle..

Hallo allerseits,
langsam bring mich millis() um denVerstand… :~

Ich möchte das delay in meinem Sketch durch millis() erstezten , damit der Rest des Sketches nicht blockiert wird.
Aber versteh nicht, wie und wo …
Es geht darum 2 LDR zu vergleichen und wenn Sie gleich sind, eine Pause machen.
Klappt 1a mit delay, aber dann ist der Rest für die Zeit blockiert.
Ich möchte das nur der Vergleich unterbrochen wird, bis die zeit um ist.

Kann doch nicht so schwer sein… (mich leider unlösbar :blush:)

Das ist der relevante Code-Teil

if (-1*tol > dhoriz || dhoriz > tol)        // check if the diffirence is in the tolerance else change horizontal angle
  {
    if (left < rightN)                                              // ist links kleiner als rechts, fahre nach rechts
    { 
      Serial.println(F("<- Move"));
      digitalWrite(moveright, HIGH);              // einzelne schritte -
      digitalWrite(moveleft, LOW);      
    }
    else if (left > rightN)                                     // ist links größer als rechts, fahre nach links
    {
      Serial.println(F("Move ->"));      
      digitalWrite(moveleft, HIGH);                   // einzelne schritte +
      digitalWrite(moveright, LOW);
    }
    else if (left == rightN)                                   // sind links u. rechts gleich, in dieser stellung für 20 sek. bleiben
    {
      Serial.println(F("Horizontal Optimal !"));
      digitalWrite(moveleft, HIGH);
      digitalWrite(moveright, HIGH);
    
      delay(20000);                                     // 20 sek warten
    }

    if (left != rightN)  { /* nix */ }                 // sind links und rechts ungleich, weiter suchen...
   }

Kann jemand HELFEN ?

Vielen Dank

Also ich sehe da keinen Ansatz mit millis von dir

So vielleicht?

//Global definieren:
long delayMillis = -20000;  // Neu  -20000 damit der allererste Vergleich immer TRUE ist. Bei "0" wäre der Vergleich erst nach 20 sec erstmalig TRUE


if (millis() > delayMillis + 20000)   // Neu
{
  if (-1 * tol > dhoriz || dhoriz > tol)      // check if the diffirence is in the tolerance else change horizontal angle
  {
    if (left < rightN)                                              // ist links kleiner als rechts, fahre nach rechts
    {
      Serial.println(F("<- Move"));
      digitalWrite(moveright, HIGH);              // einzelne schritte -
      digitalWrite(moveleft, LOW);
    }
    else if (left > rightN)                                     // ist links größer als rechts, fahre nach links
    {
      Serial.println(F("Move ->"));
      digitalWrite(moveleft, HIGH);                   // einzelne schritte +
      digitalWrite(moveright, LOW);
    }
    else if (left == rightN)                                   // sind links u. rechts gleich, in dieser stellung für 20 sek. bleiben
    {
      Serial.println(F("Horizontal Optimal !"));
      digitalWrite(moveleft, HIGH);
      digitalWrite(moveright, HIGH);

      delayMillis = millis();                                     // 20 sek warten    // Neu
    }

    if (left != rightN)  
    {
      /* nix */
    }                 // sind links und rechts ungleich, weiter suchen...
  }
}

sschultewolter:
Also ich sehe da keinen Ansatz mit millis von dir

Da könntest du recht haben…
Ich habe das alles wieder gelöscht, um den Anfangszustand wieder herzustellen.
Und dann geposted… Sorry.

Aber meine Versuche sahen so aus:

if (-1*tol > dhoriz || dhoriz > tol)                // check if the diffirence is in the tolerance else change horizontal angle
  {
    
    if (left < rightN)                                // ist links kleiner als rechts, fahre nach rechts
    {
      Serial.println(F("<- Move"));
      digitalWrite(moveright, HIGH);                  // einzelne schritte -
      digitalWrite(moveleft, LOW);      
    }
    else if (left > rightN)                           // ist links größer als rechts, fahre nach links
    {
      Serial.println(F("Move ->"));      
      digitalWrite(moveleft, HIGH);                   // einzelne schritte +
      digitalWrite(moveright, LOW);
    }
    else if (left == rightN)                          // sind links u. rechts gleich, in dieser stellung für 30 sek. bleiben
    {
      if((millis() - Zeit_2) > pause){
        
      Zeit_2 = millis();
      Serial.println(F("Horizontal Optimal !"));
      digitalWrite(moveleft, HIGH);
      digitalWrite(moveright, HIGH);
      }
      //delay(pause);
    }

    if (left != rightN)  { /* nix */ }                 // sind links und rechts ungleich, weiter suchen...
   }

Aber da wird keine Pause gemacht

      if((millis() - Zeit_2) > pause){
        
      Zeit_2 = millis();

Soweit schon mal nicht ganz falsch. Die Klammer um die Subtraktion kannste weglassen. Ob Zeit_2 nun ein sinniger Variablenname ist, sei dahingestellt. lastMillis wäre ggf. besser. Des weiteren kannst du auch gleich oder größer abfragen ">=".

Wie hast du Zeit_2 deklariert? In der loop musst du static unsigned long nehmen, in den globalen Variablen reicht das ohne static.

Hallo phthalo,

phthalo: So vielleicht? ...

Ich teste... Danke... bis gleich....

Hallo sschultewolter,

sschultewolter:       if((millis() - Zeit_2) > pause){               Zeit_2 = millis();

Soweit schon mal nicht ganz falsch. Die Klammer um die Subtraktion kannste weglassen. Ob Zeit_2 nun ein sinniger Variablenname ist, sei dahingestellt. lastMillis wäre ggf. besser. Des weiteren kannst du auch gleich oder größer abfragen ">=".

Wie hast du Zeit_2 deklariert? In der loop musst du static unsigned long nehmen, in den globalen Variablen reicht das ohne static.

Der Variablenname ist nur so eingetrage, bis der ablauf funktioniert. Zeit_2 ist als static unsigned longdeklariert.

Wenn ich das richtig sehe und verstehe, liegt es nur an denKlammern (m die Subtraktion) ?

Ich teste das mal eben.. Danke... bis gleich

Du musst unterscheiden ob du etwas alle x Sekunden machen willst oder ob du nach einer Aktion einmal eine bestimmte Zeit warten willst. Letzteres geht leicht anders als das Standard Beispiel BlinkWithoutDelay.

Dafür muss man die Variable die man subtrahiert vorher auf millis() setzen. Also zu dem Zeitpunkt ab dem das Warten anfangen soll. Dann ist die Differenz 0 und damit automatisch kleiner aus der Vergleichswert. Diese Abfrage kommt dann als erstes und alles andere in den else-Zweig.

Hallo sschultewolter,
leider klappt das so nicht, oder ich verstehe es nicht… :blush:

if (-1*tol > dhoriz || dhoriz > tol)                // check if the diffirence is in the tolerance else change horizontal angle
  {
    
    if (left < rightN)                                // ist links kleiner als rechts, fahre nach rechts
    {
      Serial.println(F("<- Move"));
      digitalWrite(moveright, HIGH);                  // einzelne schritte -
      digitalWrite(moveleft, LOW);      
    }
    else if (left > rightN)                           // ist links größer als rechts, fahre nach links
    {
      Serial.println(F("Move ->"));      
      digitalWrite(moveleft, HIGH);                   // einzelne schritte +
      digitalWrite(moveright, LOW);
    }
    else if (left == rightN)                          // sind links u. rechts gleich, in dieser stellung für 30 sek. bleiben
    {
      if(millis() - lastMillis1 > pause)
      {
        
      lastMillis = millis();
      Serial.println(F("Horizontal Optimal !"));
      digitalWrite(moveleft, HIGH);
      digitalWrite(moveright, HIGH);
      
      //delay(pause);
    }
    }

    if (left != rightN)  { /* nix */ }                 // sind links und rechts ungleich, weiter suchen...
   }

Hallo Serenifly,

Serenifly:
Du musst unterscheiden ob du etwas alle x Sekunden machen willst oder ob du nach einer Aktion einmal eine bestimmte Zeit warten willst. Letzteres geht leicht anders als das Standard Beispiel BlinkWithoutDelay.

Dafür muss man die Variable die man subtrahiert vorher auf millis() setzen. Also zu dem Zeitpunkt ab dem das Warten anfangen soll. Dann ist die Differenz 0 und damit automatisch kleiner aus der Vergleichswert. Diese Abfrage kommt dann als erstes und alles andere in den else-Zweig.

Aber ist mein Ansatz der nicht so ?

if((millis() - lastMillis1) > pause){
        
      lastMillis = millis();
      Serial.println(F("Horizontal Optimal !"));
      digitalWrite(moveleft, HIGH);
      digitalWrite(moveright, HIGH);
      }

So, es läuft.... :D Ich hatte die abfrage an der falsche Stelle im Sketch.

Allen Beteiligten vielen DANK !

Problem gelöst... Juhu.. :D :grin: :D :grin: