delay eine Sekunde warten um massive Datenmengen zu verhindern

delay ist ja eigentlich ein geht gar nicht aber warum macht man dann z.b. so etwas

Sketch wurde hier gefunden
https://www.arduinoforum.de/code-referenz

Beispiel
unsigned long zeit;
void setup(){
Serial.begin(9600);
}
void loop(){
Serial.print("Zeit: ");
zeit = micros();
// gibt die Zeit seit dem Start des Programms aus
Serial.println(zeit);
// eine Sekunde warten um massive Datenmengen zu verhindern
delay(1000);
}

oder

Dort wird es mit delay und millis erklärt und auf einen Sketch verweist wie man es besser macht.
Die Seite verweist dort auf folgendes Sketch Arduino Night Light und den Sunrise Alarm von James Bruce

hier der sketch

in Zeile 61 delay(1000);

Verstehe ich irgendwie nicht warum halte ich ein Programm komplett an wenn es eigentlich nicht sinnvoll ist.
Wenn man bedenkt das Millis() nach x Tagen überlaufen wäre doch ein zurück setzen der Millis() sinnvoller.

Hoffe mit den Links geht so in Ordnung mir Viel nix besseres ein um das zu dokumentieren.

Man kann delay nehmen, wenn während der delay Zeit nichts anderes gemacht werden soll/muß.
Also zB keine Tastenabfragen gemacht werden müssen.
Grüße Uwe

Hallo,

in beiden genannten Fällen dient das delay dazu um zu verhindern das dir der serielle Monitor zumüllt. Mit 9600 Baud kannste "nur" nix mehr lesen. Mit 250000 Baud stürzt er irgendwann ab. Die 1s delay ermöglicht dir das mitlesen. Steht auch als Kommentar in Zeile 61.

Auf der anderen Seite kann man auch eine Funktion schreiben "seriellerMonitor" der ohne delay aller 1s seine Daten ausgibt. Das hier sollte dir weiterhelfen.

Theseus erklärt millis()

GuntherB - BlinkwithoutDelay - Die Nachtwächtererklärung

Der Wertebereichsüberlauf interessiert nicht wenn man es richtig macht. Der maximale ms Wertebereich (49 Tage) bestimmt dir nur dein größtmögliches Intervall worauf du vergleichen kannst.

und wenn ich aber dabei Tasten abfragen mache, muss ich zwingend das delay ersetzen damit ich nicht warten muss. richtig ?
den sinn im Bsp. verstehe ich nicht warum warte ich nach den Millis() mit delay ? und wie behebe ich mit Milli() das problem des "eine Sekunde warten um massive Datenmengen zu verhindern"
Wenn ich das Delay aus dem Bsp. entferne rennt das ganzer einfach schneller ich sehe da keinen vor oder nachteil

Lies nochmal in aller Ruhe.

Hallo,

in diesen Beispielen sorgt das delay() ja nur auf einfache Weise dazu das die Serielle Schnittstelle nicht überläuft und du was auf dem Monitor lesen kannst. In dem Beispiel schadet es ja nicht. Leider ist es so das in vielen Beispielen delay() verwendet wird und das gerade Anfänger das übernehmen und dann verwirrt sind.

Delay ist ja nicht grundsätzlich falsch, man muss sich nur darüber im klaren sein was passiert, das gilt aber auch für Schleifen for, do , while die werden auch oft falsch oder völlig überflüssig verwendet.

Warum willst Du millis() zurücksetzten auf was , auf 0, das macht es doch schon selber wenn es überläuft.

Wenn man die Abfrage von millis() richtig verwendet passiert beim Überlauf nichts.

if (millis() - altezeit >= interval )

Heinz

Ich benutze oft eine Art Kompromiss:

Den Loop bremse ich generell etwas mit einem kleinen delay (z.B. Delay(5)) und führe aber parallel dazu noch eine Zähler-Variable, die bei jedem Durchlauf um Eins erhöht wird.

So kann ich einerseits "schnelle" Vorgänge (z.B. Tastatur-Abfrage) bei jedem Loop-Durchlauf aufrufen und nicht so oft erforderliche Routinen (z.B. Anzeige auffrischen) immer nur dann, wenn der Zähler einen bestimten Wert erreicht hat (z.B. 10 oder 100). In diesem Falle setze ich dann auch den Zähler auf Null zurück ...

qualidat:
So kann ich einerseits "schnelle" Vorgänge (z.B. Tastatur-Abfrage) bei jedem Loop-Durchlauf aufrufen und nicht so oft erforderliche Routinen (z.B. Anzeige auffrischen) immer nur dann, wenn der Zähler einen bestimten Wert erreicht hat (z.B. 10 oder 100). In diesem Falle setze ich dann auch den Zähler auf Null zurück ...

Das gleiche mit der gleichen Logik machst Du auch mit millis().
Grüße Uwe

Das mit dem loop Zähler mache ich nur, wenn millis() wegen Timergebrauch nicht funktioniert. Aber delay im loop ist im produktiven Sketch selten wirklich nötig

qualidat:
Den Loop bremse ich generell etwas mit einem kleinen delay (z.B. Delay(5)) und führe aber parallel dazu noch eine Zähler-Variable, die bei jedem Durchlauf um Eins erhöht wird.

So kann ich einerseits "schnelle" Vorgänge (z.B. Tastatur-Abfrage) bei jedem Loop-Durchlauf aufrufen und nicht so oft erforderliche Routinen (z.B. Anzeige auffrischen) immer nur dann, wenn der Zähler einen bestimten Wert erreicht hat (z.B. 10 oder 100). In diesem Falle setze ich dann auch den Zähler auf Null zurück ...

Ich halte den Ansatz für sehr unglücklich, wenn du alles mit millis oder micros timest fährst du viel besser.

Fährst du dein Auto auch immer mit angezogener Handbremse und schleifender Kupplung?

ElEspanol:
Das mit dem loop Zähler mache ich nur, wenn millis() wegen Timergebrauch nicht funktioniert. Aber delay im loop ist im produktiven Sketch selten wirklich nötig

Welchen Timer nutzt du denn, wenn millis() dabei nicht funktioniert? Ich nutze beides gleichzeitig.

War für ein Projekt, das aber momentan im standby ist. Irgendeine rc lib, die ppm einliest und ausgibt auf einem Nano.

Ich würde auf jeden Fall vermeiden, den Timer 0 zu benutzen. Man hat doch noch Timer 1 (16Bit) und Timer 2 (8Bit). Brauchst Du wirklich so viele Timer? Alternative zum Nano wäre dann noch der pro Micro. Genauso klein, und hat noch einen weiteren 16-Bit Timer ( Timer 3 ).

Whandall:
Ich halte den Ansatz für sehr unglücklich, wenn du alles mit millis oder micros timest fährst du viel besser.

Fährst du dein Auto auch immer mit angezogener Handbremse und schleifender Kupplung?

Na ja, man könnte das mit einem kleinen delay auch so sehen, dass man mit dem Auto nicht immer Vollgas fährt :wink:

Aber im Prinzip ist es schon richtig, dass die millis-Variante besser ist. Hängt letztendlich aber vom Einzelfall ab. Es gibt durchaus auch Anwendungen, da ist ein delay(5) bereits tödlich.

Ich nutze eine Timer-Lib, welche müsste ich Zuhause schauen, und damit auf einem Nano Clone aktuell 5 verschiedene Timer ohne Probleme laufen.

Edit: ich nutze die ticker-lib von GitHub - sstaub/Ticker: Ticker library for Arduino.

Beispiel:

#include <Ticker.h>

uint32_t millisFromStart;
Ticker timer1(getMillis, 1000);

void getMillis()
{
  millisFromStart = millis();
  Serial.print("Millis seit Start: ");
  Serial.println(millisFromStart);
}

void setup()
{
  Serial.begin(9600);
  timer1.start();
}

void loop()
{
  timer1.update();
}

Ich hab die Lib nicht programmiert. Nur eingesetzt.

Hallo

Wenn du wirklich nicht sicher bist ob millis noch richtig sind, dann bau dir was ein was alle 60 s kommt und messe es mit einer Uhr nach, das geht doch mit einem Sekundenzeiger ganz einfach. Kannst ja auch 10 Minuten nehmen wenn du magst.

Hi

millis() ist nichts, worauf man eine Uhr aufbauen würde.
Nicht nur, weil millis() zwingend laufende Interrupts braucht (was z.B. bei WS2812B nicht der Fall ist), sonder auch, weil der Kram 1-zu-1 an einem Timer hängt, Der je nach Temperatur, Wetterlage und Abstand zum Saturn ein Muckensack anders läuft.

Bei einem Uhr-Projekt komme ich so nur auf 700 millis()-Ticks in einer Sekunde - den Rest der Zeit spielt der Arduino mit den LEDs.

Zu, dann noch Mal kurz zurück zu delay().

Das delay() steht in vielen Beispielen, weil es in Diesen NICHT um das Warten/Verlangsamen geht, sondern um irgend welche anderen Dinge, Die Dir per Terminal angezeigt werden.
Und hier ist's besser, wenn Du davon auch was lesen kannst.

Leider ,wie hier schon geschrieben wurde, sieht so jeder Anfänger, daß überall delay() benutzt wird - und benutzt Es.

Wenn Dir millis() und die Prüfung der Wartezeit in Fleisch und Blut übergegangen ist, bleibt für delay() nur noch Platz, wo man ggf. kurz einen Taster entprellt oder den Wachhund beruhigt (Der bei yield(), aufgerufen durch delay(), wohl ein WDR (WatchDogReset) erfährt).

Bei meinem aktuellen Konstrukt habe ich aber viel mehr mit 'normalen' State-Maschinen zu tun, als mit millis() :slight_smile: - wenn auch eine Seite der Kommunikation via millis() alle x Sekunden Sensorwerte verschickt.

Und natürlich: ohne delay() :wink:

MfG