problem mit Millis

Hi,

ich habe mal eine frage zu Millis.

ich möchte das nach 3 Sekunden eine 1 angezeigt wird nach 6 Sekunden eine 2 nach 9 Sekunden
eine 3 und nach 12 Sekunden soll es von vorne beginnen. Nach 3 Sekunden wird eine 1 angezeigt und dann bleibt das so 2 und 3 kommen nicht. was mache ich falsch?

unsigned long startMillis;
unsigned long currentMillis;

void setup() {

  Serial.begin(9600);
  startMillis = millis();

}

void loop() {

  currentMillis = millis();

  if (currentMillis - startMillis >= 3000)
  {

    Serial.println("1");

  } else   if (currentMillis - startMillis >= 6000)
  {

    Serial.println("2");

  } else   if (currentMillis - startMillis >= 9000)
  {

    Serial.println("3");


  } else   if (currentMillis - startMillis >= 12000)
  {

    startMillis = currentMillis;
    
  }

}

nach 3000 millis ist

currentMillis - startMillis >= 3000

immer true.

Daher keine Änderung der Ausgabe.

Außerdem solltest du dir merken, welche der Ausgaben du schon gemacht hast...

hi,

danke für die antworten.

kann man das irgendwie anders umsetzten

irgendwie nein.
anders ja.

im Prinzip brauchst nur deine If von oben nach unten umkehren, dann fällst oben bei den hohen Werten rein oder fällst einen Schritt nach unten.

Melasse:
kann man das irgendwie anders umsetzten

Klar: Endliche Automaten bauen.

Hallo,

So wie du das hast bleibt das immer bei 1 hängen weil die erste Bedingung ja immer erfüllt ist und das auch für anderen Fälle.

mach aus deinen >= Abfragen einfach <= dan klappt das. Ob es dann das ist was Du haben willst musst Du entscheiden.

Heinz

combie:
Klar: Endliche Automaten bauen.

Hi,

ja habe da ein Tutorial hier im Forum gefunden damit hats geklappt.

Danke

Hi

Wenn Du nun noch Deine Lösung den folgenden Suchenden präsentieren möchtest?
Du bist nicht der Erste, Der einen Knoten im Hirn hatte, wenn's um millis() ging :wink:
Auch könntest Du das gefundene Tutorial verlinken, dürfte den folgenden Suchenden ebenfalls helfen.

MfG

Hi,

also hier ist der Link:

https://forum.arduino.cc/index.php?topic=328241.0

und ich habe das genau so benutzt.

nur mit einer delay Zeit statt den beidem Phasen.

mir hat es sehr geholfen :slight_smile:

Mfg

Melasse:
mir hat es sehr geholfen :slight_smile:

Freut mich, wenn mein altes Geschreibsel hilft :slight_smile:

ich möchte das nach 3 Sekunden eine 1 angezeigt wird nach 6 Sekunden eine 2 nach 9 Sekunden
eine 3 und nach 12 Sekunden soll es von vorne beginnen

ich würde es einfach so machen:

unsigned long startzeit;
byte letzter;

void loop() {
  byte zaehler = (millis()-startzeit) / 3000;  // 0, 1, 2, 3 (Änderung alle 3 Sekunden)
  if (zaehler >3) {
    zaehler = 0;
    startzeit = millis();
  }
  if (letzter != zaehler) {
      Serial.println(zaehler);
      letzter = zaehler;
  }
}

Wer überall endliche Automaten sehen will, findet einen oder zwei.
Wem das zu hochtrabend ist, kommt auch so zurecht, hoffe ich.

Nachtrag:
"nach 12 Sekunden soll es von vorne beginnen" ist etwas unklar: von vorne beginnen heisst eigentlich, dass 3 Sekunden lang nichts passiert, bis dann die "1" geschrieben wird.
Nach 12 Sekunden könnte aber auch die 1 wieder erscheinen sollen.
Das obige Beispiel macht es nochmals anders, aber es ist ja nur ein Beispiel, wie einfach etwas sein kann, was sich "endlicher Automat" nennen darf.