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
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.
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
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