gibt es eine Möglichkeit, den aktuellen millis () - Wert zu speichern?
Ich möchte diesen gespeicherten Wert gerne dann permanent von millis () abziehen, um quasi einen reset auf null zu machen.
Ich hänge gerade daran, dass wenn man eine
unsigned long xxxxxx = millis ()
erstellt, das ja nie ein fester Wert ist, sondern die Millisekunden in der Variable weiter laufen.
Wenn du eine lokale Variable so definierst, wird sie bei jedem loop - Durchlauf neu initialisiert. Wenn du das nicht willst, dann mach es nicht
Im berühmten BlinkWithoutDelay wird eine globale Variable verwendet, und diese nur selten (bei jedem Blink-Zustandswechsel) gesetzt.
Statt globaler Variablen kann man für lokale Variable auch das Schlüsselwort static verwenden.
Eine static Variable behält ihren Wert zum nächsten loop-Durchlauf, wenn ihr kein neuer Wert zugewiesen wird.
bitte sieh dir das IDE Beispiel "Blink without Delay" an.
Da wird das gemacht.
Außerdem zeigt es dir so nebenbei einiges anderes das dir auch gefallen wird.
Danke Euch allen für die schnellen Antworten!
Ich war leider erst heute morgen wieder im Büro zum ausprobieren, und jetzt klappt es einwandfrei.
@michael_x@noiasca Das "Blink Without Delay" Beispiel habe ich mir angeschaut und auch verstanden, es hat aber nicht ausgereicht weil ich irgendwie das aktualisieren von millis() sperren musste. Ich brauchte einen Reset auf null, um mitten im Programm noch einmal ein 5sek-Intervall abzuwarten. Das mit static habe ich jetzt nicht verwendet aber werde es mir mal anschauen.
@my_xy_projekt@paulpaulson Ich habe es jetzt so wie euer Vorschlag war mit einem bool gelöst. Bei istGesetzt == false wird millis() einmalig als previousMillis gespeichert und dann istGesetzt = true gestellt. Danach wird previousMillis von currentMillis abgezogen für den Reset.
unsigned long previousMillisTare = 0; //Tare
const long intervalTare = 3000;
const long intervalTare2 = 5000;
const long intervalTare3 = 5100;
bool istGesetzt = false;
void loop() {
...
if (status == 2) { //Tare alle Wägezellen
unsigned long currentMillisTare = millis();
lcd.setCursor(0, 0);
lcd.print("System tare...");
if (currentMillisTare - previousMillisTare < intervalTare) {
LoadCell_1.tareNoDelay();
LoadCell_2.tareNoDelay();
LoadCell_3.tareNoDelay();
}
if (currentMillisTare - previousMillisTare >= intervalTare && currentMillisTare - previousMillisTare < intervalTare2) {
lcd.setCursor(0, 1);
lcd.print("done");
}
if (currentMillisTare - previousMillisTare >= intervalTare2 && currentMillisTare - previousMillisTare < intervalTare3) {
lcd.clear();
status = status + 1; //AUTOWECHSEL
}
if (currentMillisTare >= intervalTare3 && istGesetzt == false) {
previousMillisTare = millis();
istGesetzt = true;
}
}
...
}
und nach Abarbeitung der Aufgaben wird in den nächsten Status gesprungen.
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
}
ja auch angewendet, ich brauche aber leider kein blink und kein loop, sondern das Programm soll in den nächsten Status springen nach Ablauf der Intervalle.
Deshalb das gesperrte/gespeicherte previousMillis, auf das dann die Zeit weiter läuft.
Es ist erledigt, aber danke Dir wirklich!
Der Status wird immer durch einen Knopfdruck erhöht.
In dem einen speziellen Fall sollte es nur von selber zum nächsten Status wechseln, deshalb die Sache mit den Intervallen.