Millis () Wert speichern

Hallo Leute,

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.

Liebe Grüße

Hallo moleu

Probiere es mal mit einer Veriegelung.

if (millisUpdate) xxxxxx = millis (), millisUpdate=false; 

Ich wünsche einen geschmeidigen Tag und viel Spass beim Programmieren in C++.

initialisiere mit:
unsigned long xxxxx=0;
An der Stelle wo Du Dir die aktuelle Zeit merken willst füllst Du xxxxx mit millis().

Um das wiederholte füllen zu unterbinden, setzt Du eine Variable zum sperren.

uint32_t xxxxx;
bool istGesetzt = false;

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

void loop()
{
  if (istGesetzt == false && millis() > 10000)
  {
    Serial.println(F("Merke millis()"));
    xxxxx = millis();
    istGesetzt = true;
  }
  if (millis() % 11000 == 9)
  {
    Serial.print(F("abgelaufener Wert: "));
    Serial.println(millis() - xxxxx);
    delay(1);
  }
}

Wenn du eine lokale Variable so definierst, wird sie bei jedem loop - Durchlauf neu initialisiert. Wenn du das nicht willst, dann mach es nicht :slight_smile:
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.

Ja!
Sicherlich: Ja!

Aber wie immer, das eigentliche Ziel ist geheim.
Der Code ist geheim.
Also auch kein Vorschlag möglich (für mich)

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.

Eine schöne restliche Woche euch!

Dann hast Du es nicht verstanden.

Gruß Tommy

Hi Tommy,

ich habe das Prinzip mit

  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.

Grüße moleu

na dann erhöhst im Intervall eben einen Status

status++;

und zu irgend einer Bedingung - gehst wieder zurück auf status = 0.

Hast du so etwas wie einen Programmablaufplan. Einen Plan was wann passieren soll?

Oder ist es eh erledigt da du schon eine Antwort als Lösung gekennzeichnet hast.

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.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.