Frage zu millis()

Hi zusammen,
ich bin gerade dabei, mir den endlichen Automaten mit millis() anzueignen.
Mit folgendem Code will ich den Zustand zweier LEDs jeweils nach einem bestimmten Intervall ändern, es soll zwischen der Änderung (z.B. LED1=HIGH, LED2=LOW) eine Art delay geben (case NIX). Allerdings schalten die LEDs mit diesem Code ohne das Delay um, wenn Rot1 LOW wird, wird Rot2 sofort HIGH.
Als Anfänger, der das System auch noch nicht zu 100% verstanden hat, finde ich den Fehler nicht. Deswegen wäre es super, wenn mir hier jemand helfen könnte, sollte ja nicht allzu schwer sein :wink:

const byte RotPin1 = 7;
const byte RotPin2 =9;
//
const boolean ein = HIGH;
const boolean aus = LOW;
//
const int ZEITROTPHASE1 = 3000;
const int ZEITROTPHASE2 = 3000;
const int ZEITNIX1 = 1000;
const int ZEITNIX2 = 1000;
unsigned long ampelMillis;
unsigned long ampelIntervall;
//
enum ZUSTAENDE {ROT1, ROT2, NIX1, NIX2};
byte zustand = ROT1;

void setup() {
  // Definiert die Pins als Ausgang
  pinMode(RotPin1, OUTPUT);
  pinMode(RotPin2, OUTPUT);
}

void loop() {
  // Ampelschaltung
  if (millis() - ampelMillis >= ampelIntervall) {
    switch (zustand) {
      case ROT1:
        digitalWrite(RotPin1, HIGH);
        zustand = NIX1;
        ampelMillis = millis();
        ampelIntervall = ZEITROTPHASE1;
        break;
        //
      case NIX1:
        digitalWrite(RotPin1, LOW);
        digitalWrite(RotPin2, LOW);
        zustand = ROT2;
        ampelMillis = millis();
        ampelIntervall = NIX1;
        break;
        //
      case ROT2:
        digitalWrite(RotPin2, HIGH);
        zustand = NIX2;
        ampelMillis = millis();
        ampelIntervall = ZEITROTPHASE2;
        break;
        //
     case NIX2:
        digitalWrite(RotPin1, LOW);
        digitalWrite(RotPin2, LOW);
        zustand = ROT1;
        ampelMillis = millis();
        ampelIntervall = NIX2;
        break;
    }
  }
}

Ich stolpere über ampelIntervall = NIX1;
und ampelIntervall = NIX2;

Sonst sieht das so aus, als wenn Du einen mir bekannten Text gelesen hättest. Gut so :slight_smile:

Auf den ersten Blick sehe ich, dass Deine Variable "ampelIntervall" nicht initialisiert wird. Ist deshalb 0. Willst Du das beim ersten Durchlauf des Loop?
Pat

agmue:
Ich stolpere über ampelIntervall = NIX1;
und ampelIntervall = NIX2;

Sonst sieht das so aus, als wenn Du einen mir bekannten Text gelesen hättest. Gut so :slight_smile:

Auweh, was für ein dummer Fehler. Da hätte ich aber auch selbst draufkommen können. Es muss natürlich =ZEITNIX1 bzw =ZEITNIX2 sein...
Das habe ich tatsächlich, Du hast das ja auch sehr gut erklärt :wink:
Dann sag ich hier gleich 2 mal vielen vielen Dank! :slight_smile:

Bitte gerne, ich freue mich über eine positive Rückmeldung! :grin: