Deberías usar una variable que indique si las direccionales están o no activadas. En otro punto, comprueba dicha variable. Si está activada, miras los millis y controlas si "es hora de encender o apagar". Este código no está probado, pero debería servirte de guía.
#include <IRremote.h>
const int receptor = 2; // sensor infrarrojo
const int faro = 13, freno = 12, direccionales = 11, direccionales2 = 10; // led de luz blanco,roja y naranja.
bool direccionalesOn=false, direccionalesEncendidos=false;
IRrecv irrecv(receptor);
decode_results codigo;
unsigned long millisAnterior = 0, ciclo = 500;
void setup() {
Serial.begin(9600);
irrecv.enableIRIn();
for (int i = 10; i <= 13; i++)
{
pinMode(i, OUTPUT); // declaramos el pin i como salida
}
}
void loop()
{
if (irrecv.decode(&codigo)) //Si hay una lectura recibida
{
Serial.print("0x");
Serial.println(codigo.value, HEX);
switch (codigo.value)
{
case 0xF7E01F: //Corresponde al boton W
digitalWrite(faro, !digitalRead(faro));
break;
case 0xF720DF: // corresponde al boton R
digitalWrite(freno, !digitalRead(freno));
break;
case 0xF710EF: //Corresponde al boton 1 para actvar el led
direccionalesOn=!direccionalesOn;
break;
}
delay(200);
irrecv.resume();
}
// aquí hacemos el ciclo de intermitencia con millis, si direccionalesOn es true
if (direccionalesOn) { // si están activados los direccionales, parpadeamos con millis
if(millis()-millisAnterior >= ciclo) {
direccionalesEncendidos = !direccionalesEncendidos;
digitalWrite(direccionales, direccionalesEncendidos);
digitalWrite(direccionales2, direccionalesEncendidos);
}
}
else { // si no estánn activados los direccionales y las luces direccionales están encendidas, las apagamos.
if (direccionalesEncendidos) {
direccionalesEncendidos = !direccionalesEncendidos;
digitalWrite(direccionales, direccionalesEncendidos);
digitalWrite(direccionales2, direccionalesEncendidos);
}
}
}