Hallo,
so wenig wie möglich ändern war auch meine erste Herangehensweise. Man muss sich erstmal reindenken.
Zufrieden war ich mit dem switch case noch nicht. ;)
Meine neue Version ist nun auch 6 Byte größer. Egal. Ich finde es noch besser lesbar. Man sieht was wann passiert.
Da man naturgemäß mit positiver Logik besser klar kommt, habe ich die positive Logik, die combie in loop mit der Tasterabfrage schon macht in switch case weitergeführt. Die Zustände namentlich machen jetzt auch das was sie aussagen. Das war mein Ziel.
Bsp. der Zustand AUS bleibt aus, solange wie nicht erneut geblinkt werden soll, erst dann ändert sich der Zustand.
EINSCHALTEN schaltet wirklich nur ein und übergibt in den nächsten Zustand.
Danach bleibt der Zustand HELLPHASE solange erhalten wie er gültig ist, macht demnach auch hier genau das was der Name sagt usw.
Alle wieder versöhnt?
switch default könnte man hier weglassen, da alle Zustände behandelt werden, das prüft ja der Compiler.
const byte taster = 2;
class Blinker
{
protected:
const byte ledPin;
const unsigned long hellPhase;
const unsigned long dunkelPhase;
unsigned long zeitMerker = 0;
typedef enum {AUS, EINSCHALTEN, HELLPHASE, DUNKELPHASE} state; // Steuerzustände
state sprungZiel = AUS;
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 (sprungZiel) {
case AUS:
if(blinkAnforderung == true) {
sprungZiel = EINSCHALTEN;
}
break;
case EINSCHALTEN:
digitalWrite(ledPin,HIGH);
zeitMerker = millis();
sprungZiel = HELLPHASE;
break;
case HELLPHASE:
if(millis()-zeitMerker > hellPhase) {
digitalWrite(ledPin,LOW);
zeitMerker = millis();
sprungZiel = DUNKELPHASE;
}
break;
case DUNKELPHASE:
if(millis()-zeitMerker > dunkelPhase) {
sprungZiel = AUS;
}
break;
default: digitalWrite(ledPin,LOW); // sollte nie eintreten
break;
}
}
void init()
{
pinMode(ledPin,OUTPUT);
}
};
Blinker blinkGruppe[] = { // {pin,hellzeit,dunkelzeit}
{30,100, 500},
{31,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);
}