millis() hängt in If Anweisung

Hallo Forum,

ohne Wenn und Aber. Ich hänge mit millis() in der IF-Anweisung fest.

Der besseren Übersicht habe ich im Sketch nur ein Relais verwendet

Soll:
RELAIS1 soll für 9 Sekunden offen sein. Danach geschlossen und das nächste Relais wird mit entsprechender Anweisung geöffnet. Nachdem die Relais abgearbeitet sind wird das Programm verlassen.

Die Werte (end_time = 9000;) hole ich später aus einer Variablen ab.

Ist:
Die Anweisung läuft durch bis 9000ms danach wird das Relay1 geschlossen.

Mein Fehler ? Der Loop läuft aber ständig weiter im seriellen Monitor obwohl die Anweisung abgearbeitet ist.

Ich möchte es nicht mit Delay() durchführen da ich mir die spätere Möglichkeit der parallelen Abläufe nicht verbauen möchte.

Ein wenig Unterstützung für einen Wiedereinsteiger wäre sehr Nett.

const int RELAIS1 = 8;
unsigned long period = 1000;
unsigned long time_now = 0;
unsigned long end_time = 9000;

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

 pinMode(RELAIS1, OUTPUT);

 digitalWrite(RELAIS1, HIGH); //Make sure the Relay is in un-powered position at startup
 }



void loop() {
 
  if(millis() <= end_time){
       time_now = millis(); 
       Serial.println("Time_Now_Variable");
       Serial.println(time_now); //das sind die millis
       Serial.println("End_Time_Variable");
       Serial.println(end_time);
       
       digitalWrite(RELAIS1, LOW); //turn RELAIS Lamp on
   }
  
   if(millis() >= end_time){
       //time_now = millis(); 
       Serial.println("Time_Now_Variable");
       Serial.println(time_now); //das sind die millis
       Serial.println("End_Time_Variable");
       Serial.println(end_time);
       
       digitalWrite(RELAIS1, HIGH); //turn RELAIS Lamp off
}
}

relais-milli-test.ino (943 Bytes)

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
Das kannst Du auch noch nachträglich ändern.

Ansonsten schaue Dir zur Verwendung von millis() nochmal BlinkWithoutDelay an und verstehe es.

Gruß Tommy

Hallo @Tommy,

sorry für den unformatted Code.

Habe mir das Beispiel schon gestern Nacht angeschaut. Werde es noch einmal in Ruhe machen.

Danke
Michael

Wenn Du Relais nach dem Einschalten des Arduino für eine bestimmte Zeit einschalten willst brauchst Du kein millis(). Da funktioniert delay() im setup bestens.
Grüße Uwe

Hallo,

mir ist jetzt nicht klar was Du letztlich willst. Du schreibst was von zwei Relais. In deinem Sketch ist aber weit und breit kein zweites Relais zu finden. Loop kann nicht beendet werden, warum willst Du das machen, weil nach 9 sekunden nichts mehr passieren soll? Versuch doch noch mal das etwas genauer zu beschreiben und von Anfang bis Ende, und das in kleineren Schritten. Dann ist das Code erstellen dazu dann relativ einfach.

In deinem jetztigen Wunsch must Du doch nur im Setup einen deffinierten Startzustand für beide Relais schalten, das macht sowiso Sinn, und wenn millis() > 9000 ist schaltest Du den Zustand ein den Du dann haben willst. Danach soll ja nichts mehr passieren.

Als nächstes schaust Du Dir das Beispiel "blink without derlay" an um den Umgang mit millis zu verstehen und baust deinen Sketch so um das nach weiteren 5 sekunden wieder der Anfangszustand erreicht wird und die 9 sekunden erneut starten.

Heinz

Rentner:
Hallo,

mir ist jetzt nicht klar was Du letztlich willst. Du schreibst was von zwei Relais. In deinem Sketch ist aber weit und breit kein zweites Relais zu finden. Loop kann nicht beendet werden, warum willst Du das machen, weil nach 9 sekunden nichts mehr passieren soll? Versuch doch noch mal das etwas genauer zu beschreiben und von Anfang bis Ende, und das in kleineren Schritten. Dann ist das Code erstellen dazu dann relativ einfach.

In deinem jetztigen Wunsch must Du doch nur im Setup einen deffinierten Startzustand für beide Relais schalten, das macht sowiso Sinn, und wenn millis() > 9000 ist schaltest Du den Zustand ein den Du dann haben willst. Danach soll ja nichts mehr passieren.

Als nächstes schaust Du Dir das Beispiel "blink without derlay" an um den Umgang mit millis zu verstehen und baust deinen Sketch so um das nach weiteren 5 sekunden wieder der Anfangszustand erreicht wird und die 9 sekunden erneut starten.

Heinz

Hallo Heinz,

sorry ich hatte geschrieben das ich es der Einfachheit halber den Code mit nur einem Relais einstelle. Ich werde aber gerne an meinem Fragestil arbeiten. HAst recht.

Grüße

Michael

Hi

... häh?
Hätte ja TOFU geschrieben, aber mir fehlt dafür der TO (Text oben), den FU (FullQuote unten) hast Du ja hinbekommen.

MfG

Moin,

ich möchte mich noch einmal mit der millis() Frage melden.
Ich habe es jetzt auf diesem sehr einfachen Weg gelöst obwohl @uwefeld hier doch den delay() Befehl als besser gewertet hat. Nun ich bin am wiedereintauchend in die Programmierung und lernen schadet nie.

  const int RELAIS1 = 8; //Pin Relais1
  
  unsigned long time_now = 0; //festlegen der Startzeit
  unsigned long time_dauer = 5000; // laufzeit des Relais
  
  #define time_dauer 5000
  
  void setup() {
  Serial.begin(115200);
     
  
    pinMode(RELAIS1, OUTPUT);
   
    digitalWrite(RELAIS1, HIGH); //Make sure the Relay is in un-powered position at startup
    }
  
  
  
  void loop() {
   
  if (millis() <= time_dauer) {
    time_now = millis();
    digitalWrite(RELAIS1, digitalRead(RELAIS1) ^ 1); //oeffnen Relais1
    Serial.println(time_now); //zählt die vergangene Zeit in ms
  }
    
      if(millis() >= time_dauer){
          time_now = millis();
          delay(1000);
          Serial.println("Gesamt vergangene Zeit");
          Serial.println(time_now); //Anzeige der gesamt vergangenen Zeit wird für spätere Notabschaltung benötigt
          digitalWrite(RELAIS1, digitalRead(RELAIS1) ^ 0); ////schliessen Relais
          
  }
}

Nun es funktioniert, doch vielleicht ist mein Gedankengang doch falsch und ich bitte wenn ja, dann was falsch ist.
Grüße
Michael

Ist es beabsichtigt, dass das Relais nach 49,xx Tagen automatisch wieder öffnet?

Wobei "öffnen" vielleicht nicht das richtige Wort ist...
"Flattert!" scheint mir besser zu passen

digitalWrite(RELAIS1, digitalRead(RELAIS1) ^ 0); ////schliessen Relais
Das macht nichts mit dem Relais

OK, habe den Code aus einem Beispiel digitalWrite(RELAIS1, digitalRead(RELAIS1) ^ 0)

Arbeite ich damit, geht die Lampe am Relais1 an und nach 5 Sekunden aus.

Habe es nun so geändert und getestet.

const int RELAIS1 = 8; //Pin Relais1
  
  unsigned long time_now = 0; //festlegen der Startzeit
  unsigned long time_dauer = 5000; // laufzeit des Relais
  
  #define time_dauer 5000
  
  void setup() {
  Serial.begin(115200);
     
  
    pinMode(RELAIS1, OUTPUT);
   
    digitalWrite(RELAIS1, HIGH); //Make sure the Relay is in un-powered position at startup
    }
  
  
  
  void loop() {
   
  if (millis() <= time_dauer) {
    time_now = millis();
    //digitalWrite(RELAIS1, digitalRead(RELAIS1) ^ 1); //oeffnen Relais1
    digitalWrite(RELAIS1, LOW);
    Serial.println(time_now); //zählt die vergangene Zeit in ms
  }
    
      if(millis() >= time_dauer){
          time_now = millis();
          delay(1000);
          Serial.println("Gesamt vergangene Zeit");
          Serial.println(time_now); //Anzeige der gesamt vergangenen Zeit wird für spätere Notabschaltung benötigt
          digitalWrite(RELAIS1, HIGH);
          //digitalWrite(RELAIS1, digitalRead(RELAIS1) ^ 0); ////schliessen Relais
          
  }
}

Vielen Dank @combie

Arbeite ich damit, geht die Lampe am Relais1 an

Nein, mit

digitalWrite(RELAIS1, digitalRead(RELAIS1) ^ 1); //oeffnen Relais1
Flackert der Pin.
Teste es.

OK, habe den Code aus einem Beispiel digitalWrite(RELAIS1, digitalRead(RELAIS1) ^ 0)

Prüfe es!
Und traue keinem Beispiel weiter, als du es werfen kannst.

 unsigned long time_dauer = 5000; // laufzeit des Relais

#define time_dauer 5000

Eins von beidem ist überflüssig.
Und damit böse.

Auch das Delay brauchst du nicht.

combie:
Ist es beabsichtigt, dass das Relais nach 49,xx Tagen automatisch wieder öffnet?

Das ist noch nicht behoben.