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
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;
}
}
}