millis() delay

Ich versuche das delay neu zu erfinden :smiley:

void warten(unsigned long wart) {
 if(millis()-previousMillis >= wart){
    previousMillis = millis(); //aktuelle Zeit merken
 }
}

Diesen code möchte ich mehrmals zB in der loop und in anderen Funktionen aufrufen.
Wie kann man es anstellen?
Möchte nicht unbedingt simplethreads dazu nehmen.
Hab auch damit versucht

 unsigned long wartmal = warten(1000);

Du speicherst in einer Variablen einen Wert den die Funktion gar nicht zurückgibt.

Du mußt umdenken.
delay() stopt den Sketch für die Wartezeit und macht dann mit dem Sketch weiter.
Mit millis() kontrollierst Du ob eine gewisse Zeit verstrichen ist. Um millis() zu benutzen kannst Du nicht einfach einen Funktion schreiben, die irgendwo womöglich mehrmals in Sketch aufgerufen wird. Diese Funktion weiß nicht wo im Setch sie aufgerufen wurde und wo sie darum weitermachen muß. Welche Kode soll in der Wartezeit ausgeführt werden?

Deine Idee funktioniert nicht. Versuch zu verstehen, wie wait without delay funktioniert.

Grüße Uwe

muss ich also neue Variable anlegen?

     //delay(700);
  if(millis()-previousMillis >= 700) {
     //aktuelle Zeit merken
    previousMillis = millis();
  byte maxReads = 10; //Seconds
  while ((maxReads-- > 0) && client.connected())              // Antwort des Servers lesen
  {
     //delay(1000);
    if(millis()-previousMillis >= 1000) {
       //aktuelle Zeit merken
    previousMillis = millis();
    while (client.available())
    {
      char response = client.read();
      Serial.print(response);
    }
  
  client.stop();
  Serial.println("Done.");
  client.flush();
  }
   }
  }

Weiß ich nicht. Das ist ein Kodeschnipsel aus dem ich nicht über den ganzen Sketch schließen kann.
Grüße Uwe

skorpi08:
Ich versuche das delay neu zu erfinden

Man kann sowas schon machen.
Aber wenn du die gleiche Funktion von verschiedenen Stellen aufrufen willst, dann mußt du der Funktion auf mitteilen, von wo sie aufgerufen wurde.

Dazu könnte man der Funktion eine Variable übergeben die die Position enthält.
In der Funktion müßtest du aber ein Array vorhalten, um die Zeiten für jede Position zu speichern.

In etwa so: (ungetesteter Code!)

boolean delay_new(byte pos, unsigned long Dauer){
  static unsigned long pMillis[4];        // kann maximal 4 mal im Code verwendet werden.
  if(millis()-pMillis[pos] >= Dauer){
    pMillis[pos] = millis();
    return true;
  }
}

Aufgerufen würde die Funktion dann so werden:

void loop() {
  if (delay_new(0,100)){
    // etwas das ich alle 100ms tun will
  };
  if (delay_new(1,1000)) {
    // etwas das ich jede Sekunde tun will
  }  
}

Aber für mich stellt sich die Frage, ob es nicht einfacher ist, die beiden Zeilen

  if(millis()-pMillis[pos] >= Dauer){
    pMillis[pos] = millis();

einfach jedes mal mit in den Code zu schreiben.

Dafür hab ich vor einiger Zeit mal eine Lib gebaut:
http://forum.arduino.cc/index.php?topic=127674.msg960809#msg960809
Hier der Link: WaitWithoutDelay.zip
Einfach in den Library-Ordner entpacken und das Beispiel anschauen.
Mario.

In etwa so: (ungetesteter Code!)

Statt das auf 4 zu beschränken, könntest du statt des Index auch die jeweilige pMillis als Referenz mitgeben.
Aber mit Instanzen einer Klasse ist es schon eleganter.

Da hier ja Pointer gerne Bauchschmerzen verursachen,
hab ich mal Mario's Beispiel umgeschrieben:

#include <WaitWithoutDelay.h>
const int  interval = 1000;                     // interval at which to blink (milliseconds, max 32767)
const byte ledPin=13;

WaitWithoutDelay mywait(interval);     // hiervon könnte man auch mehrere definieren

void setup() {
  // set the digital pin as output:
  pinMode(ledPin, OUTPUT);        
}

void loop() {
  static boolean ledState;
  //check if the interval elapsed
  if(mywait.wait()) {
    // if the LED is off turn it on and vice-versa
    ledState = ! ledState;

    // set the LED with the modified ledState
    digitalWrite(ledPin, ledState);       
  }
  // kommt hier dauernd vorbei für andere Aufgaben, ohne delay
}

P.S. int ist vielleicht nicht ganz der optimale Datentyp für den WaitWithoutDelay c'tor, Mario :wink: