Hallo, um die beim delay erzeugte Blockade zu eliminieren habe ich eine Delay-Alternative geschrieben. Funktioniert soweit wie ein delay.
Allerdings weiss ich nicht, ob eine do-while Schleife nicht ebenfalls blockiert.
Weiss jemand da mehr oder hat eine noch bessere Idee?
Aufruf mit new_delay(1000)
Hier die Routine:
void new_delay(int interval)
{
unsigned long currentMillis = millis();
do
{
currentMillis = millis();
}
while (currentMillis - previousMillis2 <= interval);
previousMillis2 = currentMillis;
}
Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden.
Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.
mfg ein Moderator.
Da kannst Du auch gleich delay() verwenden. beides blockiert.
Du bist doch nicht erst seid gestern dabei, das englische Forum solltest Du kennen und auch von BlinkWithoutDelay schon gehört haben.
hatte vorher einen anderen deutschen Beitrag hier gelesen, daher angenommen, ich wäre im deutschen Forum... Sorry.
Ok, wenn es auch blockiert, die anderen Methoden sind aber kein direkter Ersatz für delay!
Um einen Code von delays zu cleanen, müsste da was her was mit wie im obigen Beispiel
mit z.B. new_delay(1000) aufrufen kann und demnach nur die delay-Befehle ersetzen.
Du kannst Warten bis die Zeit vorbei ist = delay()
Du kannst hie und da schauen ob die Zeit vorbei ist und nichts dabei machen = while + millis()
Du kannst hie und da schauen ob die Zeit vorbei ist und Zwischenzeit etwas anderes machen = https://docs.arduino.cc/built-in-examples/digital/BlinkWithoutDelay
Genau genommen ist dein new_delay einfach schlechter als delay, weil der yield-Aufruf fehlt.
Bei einem ESP läufst du damit in ein Watchdog-Problem.
Und int ist der falsche Datentyp für den Parameter
Das hier ist für einen Delay Ersatz. Der Programmteil, der Anstelle von "Mache was" steht, wird einmal alle 300ms durchgeführt. Die Zeile "Sekundenablauf1 = millis();" startet die 300ms neu. Das steht also für "delay();" und kann an jeder Stelle des Programmes ausgelöst werden. Das Programm läuft immer durch und man kann andere Dinge im Loop machen. Erst nach 300ms, wird der Programmteil wieder einmal ausgeführt. Wenn die Zeile "Sekundenablauf1 = millis();" nicht am Ende steht, wird der Teil solang angefahren, bis wieder irgendwo "Sekundenablauf1 = millis();" aufgerufen wird. Dann ist wieder 300ms Pause. Es gibt also KEINEN STOPP IM LOOP. sondern es läuft immer wieder durch. Nur der Programmteil, der anstelle von "Mache was" steht, wird nur alle 300ms eimal ausgeführt. Wie lange dieser Programmteil ist, spielt keine Rolle. Meine Prgramme laufen immer in ein paar milliSekunden von Loop Anfang bis Loop Ende, obwohl es viele Teile gibt die oft lange nicht durchlaufen werden, auch mit ganz verschiedenen Aus-Zeiten. Da sind in manchen Teilen Stopps eingebaut, von vielen Sekunden bis auch mal 10 Minunten. Trotzdem läuft in diesen Zeiten alles andere, nur diese Programmteile werden in den Stoppzeiten umfahren.
UND GENAU DAS IST DER UNTERSCHIED zwischen Delay und Millis. Delay stoppt das komplette Programm, mit den Millis werden nur Teile des Programmes so lange UMFAHREN, bis sie wieder mal dran sind, und es wird NICHT GESTOPPT.
unsigned long Stoppuhr = 0;
unsigned long Sekundenablauf1 = 0; // Pausezeit 300ms wird eingerichtet
const unsigned long Pausezeit1 = 300;
//-------setup Start-------------
void setup()
{
Sekundenablauf1 = millis(); //300ms Pause start
//--------setup Ende-----------
}
//--------Loop Start-------------
void loop()
{
Stoppuhr = millis(); // Millis werden an Stoppuhr übergeben
//---------Test ob Pausezeit zuende ist-----
if (Stoppuhr - Sekundenablauf1 >= Pausezeit1) // 300msec abgelaufen?
{
/*
Mache alle 300ms einmal was
*/
Sekundenablauf1 = millis(); // 300ms Pause neu start
}
//--------Loop Ende-----------
}