IR Sterung Mit Interrupts

@Uwe: Ich habe für das Beispiel den Code des originalen BlinkWithoutDelay verwendet, damit es leichter vergleichbar ist. Ansonsten hätte ich den Zustandwechsel auch mit einem state = ! state abgekürzt.

Zum Fehler in der IDE0022, hier kann man das new vermutlich durch folgenden Aufruf ersetzen: WaitWithoutDelay mywait = WaitWithoutDelay(1000);. Dann müssen Methoden des Objekts aber mit "." statt mit "->" referenziert werden.

@t-lie:
z.B. so:

void setColor (int red, int green, int blue) {
 static  WaitWithoutDelay localwait = WaitWithoutDelay(1000);
 
 if(localwait.wait()) {
    Serial.println("setColor called");
    // RGB LED: write inverted value for each color
    analogWrite(ledr, 255 - red);
    analogWrite(ledg, 255 - green);
    analogWrite(ledb, 255 - blue);
  }
}

Damit kann man die Funktion sooft aufrufen wie man will, sie wird nur nach Ablauf einer Sekunde die Farbe der LED ändern. Ich persönlich würde das "Hilfs delay" aber nicht in die Funktion selbst packen, sondern den Aufruf der Funktion in das Wait kapseln. Das hat den Vorteil, das die Funktion setColor() an verschiedenen Stellen im Programm verwendbar ist, wobei es durchaus vorkommen kann, das man gar kein oder ein anderes delay haben möchte als die fixen 1000ms. Das geht natürlich nur, wenn sich die Funktion selbst nicht um das delay kümmert.
Die Funktion setColor() hat die Aufgabe die Farbe eine LED per PWM zu setzen, daher sollte sie auch nicht mehr machen.