combie:
Ich habe mir das mal aufmerksam angesehen.
Es gibt dort 2 Dinge, welche aus meiner Sicht verbesserungswürdig sind.
Einmal das magische Define "#define LEDSCHALTZEIT 1000".
Das verbessere ich mal nicht großartig, denn das tuning ist eher trivial. Einfach ein weiterer Konstruktor Parameter.
Der zweite Punkt betrifft den "schritt". Das Tuning ist nicht ganz so trivial.
Erstmal sollte es begrenzt werden, auf die tatsächlich möglichen Schritte.
Denn bisher könnte man auf die Idee kommen mit schritt++ einfach einen weiter zu gehen, was wegen des fehlenden default: Zweigs zu einem Problem werden könnte.
Ebenso wird eine Initialisierung/Zuweisung, z.B. so: schritt = PI; nicht unterbunden
Ansonsten finde ich die Idee, die Schritte auf byte zu begrenzen zu wollen voll OK.
Die magische Null bei der Initialisierung darf auch unterbunden werden.
Die Verbesserung findet sich im folgenden.
a. schritt und alles damit zusammenhängende, auf 8 Bit begrenzt
b. schritt ist jetzt vollkommen Typesicher
c. das #define entsorgt, aber die Funktionalität nicht verändert
d. ein paar Nullen bei der Konstruktorinitialisierungsliste hinzugefügt(Kosmetik(?!))
constexpr uint32_t LEDSCHALTZEIT = 1000;
class Taster
{
private:
enum class Schritt:byte {WARTEN, MINZEIT, LEDZEIT};
const byte tasterPin, ledPin;
const uint32_t tastMinzeit, ledAn;
uint32_t tastMillis, ledMillis;
bool tastNeu, tastAlt;
Schritt schritt;
public:
Taster(const byte tasterPin, const byte ledPin, const uint32_t tastMinzeit):
tasterPin(tasterPin), ledPin(ledPin), tastMinzeit(tastMinzeit), ledAn(LEDSCHALTZEIT), tastMillis(0), ledMillis(0), tastNeu(0), tastAlt(0), schritt(Schritt::WARTEN) {}
void init() //Initialisierung
{
digitalWrite(ledPin, HIGH);
pinMode (ledPin, OUTPUT);
pinMode (tasterPin, INPUT_PULLUP);
tastAlt = digitalRead(tasterPin);
}
void run()
{
uint32_t jetzt = millis();
tastAlt = tastNeu;
tastNeu = digitalRead(tasterPin);
switch (schritt)
{ case Schritt::WARTEN:
if (tastAlt && !tastNeu)
{
tastMillis = jetzt;
schritt = Schritt::MINZEIT;
}
break;
case Schritt::MINZEIT:
if ((jetzt - tastMillis >= tastMinzeit))
{
if (!tastNeu)
{
digitalWrite(ledPin, LOW);
ledMillis = jetzt;
schritt = Schritt::LEDZEIT;
} else {
schritt = Schritt::WARTEN;
}
}
break;
case Schritt::LEDZEIT:
if (jetzt - ledMillis >= ledAn)
{
digitalWrite(ledPin, HIGH);
schritt = Schritt::WARTEN;
}
break;
}
}
};
Taster taster []
{ //tasterPin, ledPin, tastMinzeit
{ 2, 9, 30}, // gelb
{ 3, 10, 30}, // rot
{ 4, 11, 30}, // gruen
{ 5, 12, 30}, // blau
{ 6, 13, 2000} // weiß
};
void setup()
{
for (Taster &t : taster) t.init();
}
void loop()
{
for (Taster &t : taster) t.run();
}
Wie man sieht, keine Welt bewegenden Änderungen .....
Im Grunde alles beim alten.
hallo liebe gemeinde, 
am Wochenende hatte ich nun endlich wieder mal zeit für mein Projekt. ;D ich habe es soweit fertig gestellt. 8)
Nur ist mir beim testen aufgefallen das beim Start des UNOs immer erstmal alle LEDs auf High sind und sie erst auf low geschalten werden wenn ich die tasten der jeweiligen led für die TastMinzeit betätige.
so als müsste man erst alles initialisieren. 
leider erschließt sich mir aus dem Sketch nicht warum dies so ist!? 
Hat jemand Tipps?
vielen dank im voraus 