Ajuda com código de arduino

Não consigo fazer com que quando eu apertar o botão e soltar (TECLA4), o led fique no modo fade(modo onde o led aumenta e diminui o brilho lentamente), até que outro botão seja apertado ou o mesmo seja desligado. O O que acontece é: ou ele executa uma veze e para, ou fica em loop infinito. As demais funções de cores únicas consegui fazer com um único botão como liga e desliga. Só falta essa lógica que estou quebrando a cabeça.

#define tecla1 0xFF0AF5
#define tecla2 0xFFAA55
#define tecla3 0xFF12ED
#define tecla4 0xFF7A85

#define VERDE 10
#define VERMELHO 9
#define AZUL 6
#include <IRremote.h>

int dadosIR = 12;
int flag0 = 0;
int flag1 = 0;
int flag2 = 0;

IRrecv irrecv(dadosIR);
decode_results resultados;

void setup() {
pinMode(VERDE, OUTPUT);
pinMode(VERMELHO, OUTPUT);
pinMode(AZUL, OUTPUT);
Serial.begin(9600);
digitalWrite(VERDE, LOW);
digitalWrite(VERMELHO, LOW);
digitalWrite(AZUL, LOW);
Serial.println(“Ligando Controle…”);
irrecv.enableIRIn();
Serial.println(“Controle remoto habilitado”);
}

void loop() {

if (irrecv.decode(&resultados)) {
Serial.println(resultados.value, HEX);

switch (resultados.value) {
  case tecla1: verde(); break;
  case tecla2: vermelho(); break;
  case tecla3: azul(); break;
  case tecla4: efeito_verde(); break;
}

irrecv.resume();

}
delay(100);
}

void efeito_verde() {
int r1, r2;
while (1) {
for (r1 = 0; r1 <= 255; r1++) {
analogWrite(VERDE, r1);
delay(10);
}
for (r2 = 255; r2 >= 0; r2–) {
analogWrite(VERDE, r2);
delay(10);
}
}
}

void verde () {
if (flag0 == 0) {
flag0 = 1;
} else
flag0 = 0;
digitalWrite(VERDE, flag0);
}

void vermelho () {
if (flag1 == 0) {
flag1 = 1;
} else
flag1 = 0;
digitalWrite(VERMELHO, flag1);
}

void azul () {
if (flag2 == 0) {
flag2 = 1;
} else
flag2 = 0;
digitalWrite(AZUL, flag2);
}

Falai @Andre1994 bom dia.
Cara o problema de loop infinito seria que no codigo vc utilizou While(1)

	void efeito_verde() {
	int r1=0, r2;
	while (1) {
	    for (r1 = 0; r1 <= 255; r1++) {
			analogWrite(VERDE, r1);
			delay(10);
		}
		for (r2 = 255; r2 >= 0; r2–) {
				analogWrite(VERDE, r2);
				delay(10);
		}
	}
}

O ideal seria vc estabelecer uma condição de parada. Por exemplo vc incluir uma variável Contadora de execuções e ai quando chegar um numero x de execuções ela ira sair da função. Com a Condição atual While(1) ele nunca sairá do While.
Para melhor exemplificar minha sugestão vou transcrever em código

	void efeito_verde() {
	int r1=0, r2, cont=0;
	while (cont < 10) {
	    for (r1 = 0; r1 <= 255; r1++) {
			analogWrite(VERDE, r1);
			delay(10);
	    }
		for (r2 = 255; r2 >= 0; r2–) {
			analogWrite(VERDE, r2);
			delay(10);
		}
         cont = cont+1;
	}
}