Ich finde eine Version mit switch und enum ist besser zu lesen, aber schau selbst
void run(const bool blinkAnforderung) {
switch (aktuell) {
case Start:
if (!blinkAnforderung)
return;
digitalWrite(ledPin, HIGH);
aktuell = Hell;
zeitMerker = millis();
case Hell:
if (millis() - zeitMerker < hellPhase)
return;
digitalWrite(ledPin, LOW);
aktuell = Dunkel;
zeitMerker = millis();
case Dunkel:
if (millis() - zeitMerker >= dunkelPhase)
aktuell = Start;
}
}
Hier noch mal alles zusammen
enum Zustand {
Start,
Hell,
Dunkel,
};
const byte taster = 2;
class Blinker
{
protected:
const byte ledPin;
const unsigned long hellPhase;
const unsigned long dunkelPhase;
unsigned long zeitMerker = 0;
Zustand aktuell = Start;
public:
Blinker(const byte ledPin, const unsigned long hellPhase, const unsigned long dunkelPhase)
: ledPin(ledPin), hellPhase(hellPhase), dunkelPhase(dunkelPhase) {}
void run(const bool blinkAnforderung) {
switch (aktuell) {
case Start:
if (!blinkAnforderung)
return;
digitalWrite(ledPin, HIGH);
aktuell = Hell;
zeitMerker = millis();
case Hell:
if (millis() - zeitMerker < hellPhase)
return;
digitalWrite(ledPin, LOW);
aktuell = Dunkel;
zeitMerker = millis();
case Dunkel:
if (millis() - zeitMerker >= dunkelPhase)
aktuell = Start;
}
}
void init() {
pinMode(ledPin, OUTPUT);
}
};
Blinker blinkGruppe[] = { // {pin,hellzeit,dunkelzeit}
{13, 100, 500},
{12, 500, 1000},
};
void setup() {
pinMode(taster, INPUT_PULLUP);
for (Blinker &blinker : blinkGruppe)
blinker.init();
}
void loop() {
bool blinkAnforderung = !digitalRead(taster);
for (Blinker &blinker : blinkGruppe)
blinker.run(blinkAnforderung);
}
Ich habe so wenig wie möglich geändert.
Was nicht heissen soll, dass ich "einen solchen Doppelblinker" so schreiben würde...