Viele Wege sind möglich, für ein anderes Thema hatte ich mal diesen Ansatz:
const byte ledrot = 8;
const byte ledweiss = 9;
const unsigned int intervall[] = {400, 50, 400, 50, 50, 50};
const byte anzahl = sizeof(intervall) / sizeof(intervall[0]);
unsigned long zeit_jetzt, zeit_vorhin;
byte schritt;
void setup() {
pinMode(ledrot, OUTPUT);
pinMode(ledweiss, OUTPUT);
}
void loop() {
zeit_jetzt = millis();
if ((zeit_jetzt - zeit_vorhin) >= intervall[schritt]) {
zeit_vorhin = zeit_jetzt;
switch (schritt) {
case 0:
digitalWrite(ledrot, HIGH);
break;
case 1:
digitalWrite(ledrot, LOW);
break;
case 2:
digitalWrite(ledweiss, HIGH);
break;
case 3:
digitalWrite(ledweiss, LOW);
break;
case 4:
digitalWrite(ledweiss, HIGH);
break;
case 5:
digitalWrite(ledweiss, LOW);
break;
}
schritt = (schritt + 1) % anzahl;
}
}
Auf Kosten von Speicher geht es kürzer:
#define ROT 8
#define WEISS 9
const unsigned int intervall[] = {50, 400, 50, 50, 50, 400};
const byte ledpin[] = {ROT, ROT, WEISS, WEISS, WEISS, WEISS};
const byte anzahl = sizeof(intervall) / sizeof(intervall[0]);
unsigned long zeit_jetzt, zeit_vorhin;
byte schritt;
void setup() {
pinMode(ROT, OUTPUT);
pinMode(WEISS, OUTPUT);
digitalWrite(ROT, HIGH);
}
void loop() {
zeit_jetzt = millis();
if ((zeit_jetzt - zeit_vorhin) >= intervall[schritt]) {
zeit_vorhin = zeit_jetzt;
schritt = (schritt + 1) % anzahl;
digitalWrite(ledpin[schritt], !digitalRead(ledpin[schritt]));
}
}
Bei mehr Geblinke könnte auch eine Struktur sinnvoll sein:
#define ROT 8
#define WEISS 9
//const unsigned int intervall[] = {50, 400, 50, 50, 50, 400};
//const byte ledpin[] = {ROT, ROT, WEISS, WEISS, WEISS, WEISS};
struct Blinken {
Blinken(const unsigned int intervall, const byte ledpin) : intervall(intervall), ledpin(ledpin) {}
const unsigned int intervall;
const byte ledpin;
};
Blinken blinken[] {
{50, ROT},
{400, ROT},
{50, WEISS},
{50, WEISS},
{50, WEISS},
{400, WEISS}
};
const byte anzahl = sizeof(blinken) / sizeof(blinken[0]);
unsigned long jetzt, vorhin;
byte schritt;
void setup() {
pinMode(ROT, OUTPUT);
pinMode(WEISS, OUTPUT);
digitalWrite(ROT, HIGH);
}
void loop() {
jetzt = millis();
if ((jetzt - vorhin) >= blinken[schritt].intervall) {
vorhin = jetzt;
schritt = (schritt + 1) % anzahl;
digitalWrite(blinken[schritt].ledpin, !digitalRead(blinken[schritt].ledpin));
}
}