IR Sterung Mit Interrupts

Wie bereits geschrieben, mußt Du die Struktur Deines Programms ein wenig anpassen. WaitWithoutDealy funktioniert nicht wie ein einfaches dealy, es wird also nicht an der Stelle gewartet. Das Programm merkt sich auch nicht, wo noch etwas zu tun wäre, wenn die Wartezeit abgelaufen ist.
Ein Beispiel: In der Funktion leseIR() wird überall setColor() aufgerufen, aber nur wenn ein bestimmter Wert von der Fernbedienung erkannt wurde. So wie das geänderte setColor() jetzt funktioniert, wird es in 99% der Fälle wo es aufgerufen wird nichts tun, weil die Bedingung (localwait->wait()) nicht erfüllt ist. Das ist der Grund warum ich geschrieben habe, das das Warten nicht in die setColor() Funktion gehört.
Ich würde sämtliche Aufrufe von setColor() in die loop() verlagern, nur dort wird geschaltet. leseIR() sollte nur die Variable modus setzen und zusätzlich 3 Variablen für den Farbwert von rot, grün und blau.
Das WaitWithoutDelay muss aus setColor() raus, wenn Farbe setzen, das sofort ohne Verzögerung. Dort wo Du eine Verzögerung brauchst, kapselst Du den Aufruf von setColor() mit dem WaitWithoutDelay.
Das "modus" ist schon ein sehr guter Ansatz, diese Variable definiert ja in welchem Status sich Dein Programm befindet, nur muss der Modus "0" auch in der lopp() wiederfinden.

//delay für RGB-LED
WaitWithoutDealy colorWait = WaitWithoutDealy(1000);

//werte für RGB-LED, werden von leseIR() gesetzt
int r,g,b = 0;

void loop() {
  //IR lesen
  leseIR();
  
  switch(modus) {
   case 0:
      if(colorWait.wait()) {
         setColor(r,g,b)  
      }
      break;

   case 1:
      fade(fadespeed);
      break;
  
   case 2:
      pcambi();
      break;
  
   case 3: 
      break;
    
  }
  
} // LOOP  Ende

Der Trick beim BlinkWithoutDelay ist, das Dein Arduino wie "irre" immer wieder die Funktion loop() durchläuft, mehrere tausend Mal pro Sekunde. Anhand der Variable "modus" weiss das Programm in welchen Case-Block (switch innerhalb von loop()) es jeweils aktiv werden muss. Dort sorgt dann aber das WaitWithoutDelay (in meiner Beispiel-loop() exemplarisch für setColor()) dafür, das z.B. setColor() nicht tausend Mal pro Sekunde aufgerufen wird, sondern immer nur, wenn eine Sekunde vergangen ist. Allerdings blockiert die setColor() Funktion dabei nicht das komplette Programm. Das leseIR() wird nämlich bei jedem loop() Durchlauf aufgerufen.

Allerdings frage ich mich eh schon die ganze Zeit, warum das "delay" für das setColor() überhaupt gebraucht wird. Wenn ich auf der Fernbedienung der Knopf für "Rot" drücke, sollte das doch gleich umschalten, oder? Beim "fade" macht das schon mehr Sinn. Auch bei der Funktion pcambi() sehe ich das ein, weil hier im 500ms Takt geblinkt werden soll.

Nun zu Deinem "geht aber immer noch nicht". Was genau geht denn nicht? Werden überhaupt Befehle von der Fernbedienung erkannt? Hast Du mal Debugausgaben auf die serielle Schnittstelle gemacht, um zu sehen was Dein Programm überhaupt macht? Hast Du einzelne Teile des Programms mal separat getestet?

Mario.