Problema al unir dos códigos

Hola buenas tardes. Escribo por aquí, para ver si alguien me puede ayudar con el problema que tengo. Estoy montando una mini ciudad, la cual lleva dos semáforos automatizados y 30 leds, controlados por un mando a distancia.(poseo Arduino UNO R3)
La programación de los semáforos los cuales van cambiando de color esta hecha, la de los leds igual.
Lo que quiero conseguir es unir las dos programaciones en una solo, para insertarla en la placa y que cuando esta se encienda, automáticamente comienzo la secuencia de los semáforos, y cuando yo quiera darle al un botón del mando y se encienda la luz que este programada con ese botón.

Los códigos por separado son estos (los he intentado unir de todas las maneras y no lo he conseguido). Agradecería que alguien me ayudara. Un saludo y gracias

[code]

//Secuencia de semáforos
//cuando se conecta la placa comienza la secuencia

int LEDROJOSEMAFORO = 12;
int LEDVERDESEMAFORO = 10;
int LEDAMARILLOSEMAFORO = 11;
 
void setup() {
 
  pinMode(LEDROJOSEMAFORO, OUTPUT);
  pinMode(LEDVERDESEMAFORO, OUTPUT);
  pinMode(LEDAMARILLOSEMAFORO, OUTPUT); 
}

void loop() {

 digitalWrite(LEDROJOSEMAFORO,LOW);
 digitalWrite(LEDAMARILLOSEMAFORO,LOW);
 digitalWrite(LEDVERDESEMAFORO,HIGH);
 delay(5000);
 digitalWrite(LEDROJOSEMAFORO,LOW);
 digitalWrite(LEDAMARILLOSEMAFORO,HIGH);
 digitalWrite(LEDVERDESEMAFORO,LOW);
 delay(2500);
 digitalWrite(LEDROJOSEMAFORO,HIGH);
 digitalWrite(LEDAMARILLOSEMAFORO,LOW);
 digitalWrite(LEDVERDESEMAFORO,LOW);
 delay(5000);
}

------------------------------------------------------------------------------------

//encendido de las luces a control remoto
// cuando le doy al botón 0 se enciende una luz o se apaga.
//si esta encendida la luz del parque o las de la cafetería, o le doy a sus correspondientes teclas o le doy a el power y se apagan

#include <IRremote.h>
#define Boton_power 0xFFA25D
#define Boton_0 0xFF6897
#define Boton_1 0xFF30CF
#define Boton_2 0xFF18E7


int SENSOR = 8;
IRrecv irrecv (SENSOR);
decode_results codigo;
int LEDEXTERIORCAFETERIA = 5;
int LEDFAROLAS = 6;
int LEDLUZPARQUE = 7;

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode(LEDEXTERIORCAFETERIA, OUTPUT);
  pinMode(LEDFAROLAS, OUTPUT);
   pinMode(LEDLUZPARQUE, OUTPUT);
}

void loop() {
  
  if (irrecv.decode(&codigo)) {
    Serial.println(codigo.value, HEX);
    
    if (codigo.value == Boton_0)
    digitalWrite(LEDEXTERIORCAFETERIA, !digitalRead(LEDEXTERIORCAFETERIA));

      if (codigo.value == Boton_1)
    digitalWrite(LEDFAROLAS, !digitalRead(LEDFAROLAS));

     if (codigo.value == Boton_2)
    digitalWrite(LEDLUZPARQUE, !digitalRead(LEDLUZPARQUE));

   if (codigo.value == Boton_power)
     digitalWrite(LEDEXTERIORCAFETERIA,LOW); 
    
     if (codigo.value == Boton_power)
     digitalWrite(LEDFAROLAS,LOW); 

     if (codigo.value == Boton_power)
     digitalWrite(LEDLUZPARQUE,LOW); 
    
    
    irrecv.resume();
  }
  delay (100);
}

[/code]

El problema que yo le veo es la orden delay(5000). El programa está parado en esa línea 5 segundos, por tanto es imposible que pueda responder a otras cosas que hagas.

Lo primero sería cambiar los delays por Millis(), mira en el foro de Español > documentación, en concreto en este: Indice de temas Tutoriales

Al no usar delays, permites que Arduino haga la función loop miles de veces por segundos y así permite responder a pulsaciones de pulsadores en cualquier momento. Si está parado 5 segundos, en esos 5 seg. no responderá a tus pulsadores.

Nunca jamás de los jamases podrás unir dos códigos que tengan delay por la razón explicada por @lepes.
Debes hacer un cambio mental y olvidar el uso del delay o restringirlo a situaciones en las que solo se hace eso.
Si estas empezando lo mejor que puedes hacer es aprender a usar millis() y máquina de estados. Además de una programación mas fluída, lograrás códigos mas claros.

error

Me salta este fallo y no se el motivo. He remplazado el delay, por millis.
A parte de eso tengo una duda: Necesito encender mas de 30 leds con un único mando el cual tiene botones limitados, como podría hacerlo. Me explico. tengo programado el botón power, y los numéricos, pero me gastaría darle al botón EQ+0 y que este encienda otra luz, EQ+1 y que encienda otra, etc. ¿Eso se podría hacer?. Gracias por todo.

//Secuencia de semaforos
//cuando se conecta la placa comienza la secuencia

//encendido de las luces a control remoto
// cuando le diy al boton 0 se enciende una luz o se apaga.
//si esta ancendida la luz del parque o las de la cafeteria, o le doy a sus correspondientes teclas o le doy a el power y se apagan
----------------------------------------------------------
int LEDROJOSEMAFORO = 12;
int LEDVERDESEMAFORO = 10;
int LEDAMARILLOSEMAFORO = 11;

#include <IRremote.h>
#define Boton_power 0xFFA25D
#define Boton_0 0xFF6897
#define Boton_1 0xFF30CF
#define Boton_2 0xFF18E7

int SENSOR = 8;
IRrecv irrecv (SENSOR);
decode_results codigo;
int LEDEXTERIORCAFETERIA = 5;
int LEDFAROLAS = 6;
int LEDLUZPARQUE = 7;
 
void setup() {
 
  pinMode(LEDROJOSEMAFORO, OUTPUT);
  pinMode(LEDVERDESEMAFORO, OUTPUT);
  pinMode(LEDAMARILLOSEMAFORO, OUTPUT); 

    Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode(LEDEXTERIORCAFETERIA, OUTPUT);
  pinMode(LEDFAROLAS, OUTPUT);
   pinMode(LEDLUZPARQUE, OUTPUT);
}

void loop() {

 digitalWrite(LEDROJOSEMAFORO,LOW);
 digitalWrite(LEDAMARILLOSEMAFORO,LOW);
 digitalWrite(LEDVERDESEMAFORO,HIGH);
 millis(5000);
 digitalWrite(LEDROJOSEMAFORO,LOW);
 digitalWrite(LEDAMARILLOSEMAFORO,HIGH);
 digitalWrite(LEDVERDESEMAFORO,LOW);
 millis(2500);
 digitalWrite(LEDROJOSEMAFORO,HIGH);
 digitalWrite(LEDAMARILLOSEMAFORO,LOW);
 digitalWrite(LEDVERDESEMAFORO,LOW);
 millis(5000);

   if (irrecv.decode(&codigo)) {
    Serial.println(codigo.value, HEX);
    
    if (codigo.value == Boton_0)
    digitalWrite(LEDEXTERIORCAFETERIA, !digitalRead(LEDEXTERIORCAFETERIA));

      if (codigo.value == Boton_1)
    digitalWrite(LEDFAROLAS, !digitalRead(LEDFAROLAS));

     if (codigo.value == Boton_2)
    digitalWrite(LEDLUZPARQUE, !digitalRead(LEDLUZPARQUE));

   if (codigo.value == Boton_power)
     digitalWrite(LEDEXTERIORCAFETERIA,LOW); 
    
     if (codigo.value == Boton_power)
     digitalWrite(LEDFAROLAS,LOW); 

     if (codigo.value == Boton_power)
     digitalWrite(LEDLUZPARQUE,LOW); 
    
    
    irrecv.resume();
  }
  millis (100);
}

Vamos a ver, que veo que no has leido nada sobre millis.
La funcion millis no admite nigun parametro como ocurre con la funcion delay. Millis devuelve un numero unsigned long que contiene el numero de milisegundos desde que se encendio el arduino. El propio error te lo dice " muchos argumentos para la funcion millis " , porque la llamas mal en tres ocasiones:

millis(5000);
millis(2500);
millis(5000);

Millis es un numero y solo puedes hacer asignaciones:

unsigned long tiempo = millis();

O operaciones aritmetico/logicas con ella:

unsigned long Lapso = tiempo - millis;
//o
if ( tiempo - millis() < 10000){//lo que se tenga que hacer}

Por poner unos ejemplos.

Veamos esto en tu codigo, quieres hacer un delay de 5000, pues con millis seria, (habiendo definido la variable start antes del setup como unsigned long):

start = millis;
while (millis() - start < 5000);

Esto es igual a un " delay (5000); ".Pero esto tambien detiene esos 5 segundos tu codigo y durante esos 5 segundos no lees el IR como te indico @lepes .Una solucion, (para no tocar mucho lo que has hecho), seria crear una funcion que contenga todo lo referente a la decodificacion del receptor IR:

void decodificador_IR () {
if (irrecv.decode(&codigo)) {
    Serial.println(codigo.value, HEX);
    
    if (codigo.value == Boton_0)
    digitalWrite(LEDEXTERIORCAFETERIA, !digitalRead(LEDEXTERIORCAFETERIA));

      if (codigo.value == Boton_1)
    digitalWrite(LEDFAROLAS, !digitalRead(LEDFAROLAS));

     if (codigo.value == Boton_2)
    digitalWrite(LEDLUZPARQUE, !digitalRead(LEDLUZPARQUE));

   if (codigo.value == Boton_power)
     digitalWrite(LEDEXTERIORCAFETERIA,LOW); 
    
     if (codigo.value == Boton_power)
     digitalWrite(LEDFAROLAS,LOW); 

     if (codigo.value == Boton_power)
     digitalWrite(LEDLUZPARQUE,LOW);    
    
    irrecv.resume();
  }
}

Y tu nuevo loop quedaria de la siguiente forma:

void loop() {
 digitalWrite(LEDROJOSEMAFORO,LOW);
 digitalWrite(LEDAMARILLOSEMAFORO,LOW);
 digitalWrite(LEDVERDESEMAFORO,HIGH);
 start = millis;
 while (millis() - start < 5000) {
  decodificador_IR ();
 }
 digitalWrite(LEDROJOSEMAFORO,LOW);
 digitalWrite(LEDAMARILLOSEMAFORO,HIGH);
 digitalWrite(LEDVERDESEMAFORO,LOW);
 start = millis;
 while (millis() - start < 2500) {
  decodificador_IR ();
 }
 digitalWrite(LEDROJOSEMAFORO,HIGH);
 digitalWrite(LEDAMARILLOSEMAFORO,LOW);
 digitalWrite(LEDVERDESEMAFORO,LOW);
 start = millis;
 while (millis() - start < 5000) {
  decodificador_IR ();
 }
}

De esta forma en los periodos muertos de espera no esta quieto , esta llamando a la funcion para leer el receptor Ir y obrar en consecuencia.

Facil Al principio has otro define al boton EQ y en la nueva funcion creada "decodificador_IR ();" añades otro If que mas o menos diga:

If (codigo.value == EQ) {
while (! irrecv.decode(&codigo)) // Espera otra lectura valida del sensor
// añade los if correspondientes a los botones 0,1,2 y 3 y sus acciones a realizar.
}

PD: No he comprobado tu codigo ante fallos menores, error en nombres de variable, falte algun parentesis, etc...
Saludos.

Siento ser un plasta., pero soy nuevo en esto y me he metido en un proyecto difícil. Así es como lo he dejado pero me saltan errores.
Agradezco enormemente lo que me estáis ayudando.

int LEDROJOSEMAFORO = 12;
int LEDVERDESEMAFORO = 10;
int LEDAMARILLOSEMAFORO = 11;

#include <IRremote.h>
#define Boton_power 0xFFA25D
#define Boton_0 0xFF6897
#define Boton_1 0xFF30CF
#define Boton_2 0xFF18E7
#define Boton_EQ 0xFF9867


int SENSOR = 8;
IRrecv irrecv (SENSOR);
decode_results codigo;
int LEDEXTERIORCAFETERIA = 5;
int LEDFAROLAS = 6;
int LEDLUZPARQUE = 7;
int tiempo=0;

int Lapso = tiempo - millis;

  start = millis;
while (millis() - start < 5000);

 
void setup() {
 
  pinMode(LEDROJOSEMAFORO, OUTPUT);
  pinMode(LEDVERDESEMAFORO, OUTPUT);
  pinMode(LEDAMARILLOSEMAFORO, OUTPUT); 

    Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode(LEDEXTERIORCAFETERIA, OUTPUT);
  pinMode(LEDFAROLAS, OUTPUT);
   pinMode(LEDLUZPARQUE, OUTPUT);
}

void decodificador_IR () {
if (irrecv.decode(&codigo)) {
    Serial.println(codigo.value, HEX);
 
}
    if (codigo.value == Boton_0)
    digitalWrite(LEDEXTERIORCAFETERIA, !digitalRead(LEDEXTERIORCAFETERIA));

      if (codigo.value == Boton_1)
    digitalWrite(LEDFAROLAS, !digitalRead(LEDFAROLAS));

     if (codigo.value == Boton_2)
    digitalWrite(LEDLUZPARQUE, !digitalRead(LEDLUZPARQUE));

   if (codigo.value == Boton_power)
     digitalWrite(LEDEXTERIORCAFETERIA,LOW); 
    
     if (codigo.value == Boton_power)
     digitalWrite(LEDFAROLAS,LOW); 

     if (codigo.value == Boton_power)
     digitalWrite(LEDLUZPARQUE,LOW);    
    
    irrecv.resume();
  }

void loop() {
  digitalWrite(LEDROJOSEMAFORO,LOW);
 digitalWrite(LEDAMARILLOSEMAFORO,LOW);
 digitalWrite(LEDVERDESEMAFORO,HIGH);
 start = millis;
 while (millis() - start < 5000) {
  decodificador_IR ();
 }
 digitalWrite(LEDROJOSEMAFORO,LOW);
 digitalWrite(LEDAMARILLOSEMAFORO,HIGH);
 digitalWrite(LEDVERDESEMAFORO,LOW);
 start = millis;
 while (millis() - start < 2500) {
  decodificador_IR ();
 }
 digitalWrite(LEDROJOSEMAFORO,HIGH);
 digitalWrite(LEDAMARILLOSEMAFORO,LOW);
 digitalWrite(LEDVERDESEMAFORO,LOW);
 start = millis;

 while (millis() - start < 5000) {
  decodificador_IR ();

     If (codigo.value == EQ) {
while (! irrecv.decode(&codigo)) // Espera otra lectura valida del sensor
// añade los if correspondientes a los botones 0,1,2 y 3 y sus acciones a realizar.
 }
}

Analicemos por partes. En este trozo de codigo tienes varias cosillas.

#define Boton_EQ 0xFF9867

int SENSOR = 8;
IRrecv irrecv (SENSOR);
decode_results codigo;
int LEDEXTERIORCAFETERIA = 5;
int LEDFAROLAS = 6;
int LEDLUZPARQUE = 7;
int tiempo = 0;

int Lapso = tiempo - millis;

start = millis;
while (millis() - start < 5000);

1º- millis a secas no es nada siempre millis(), no le deben faltar los parentesis. Error que cometes tambien en el loop cuado declaras:

start = millis;

Corrigelo en todo el codigo y no te fies de lo que pongamos que tambien nos equivocamos y yo me equivoque al darte ese loop asi.
.
2º- No fui claro antes pero toda variable que valla a contener un numero dado por millis() a de ser del tipo unsigned long , por lo tanto tiempo, lapso y start, (no definida), no pueden ser " int " han de ser " unsigned long ".
¿Y para que declaras lapso y tiempo si luego no lo usas para nada?

3º- Estas en la zona de declaraciones, no puedes usar ese while ni nada semejante for, if, etc.. siempre te dara error, estos solo puedes usarlos dentro de un " void ". ¿Que intentabas hacer, una parada de 5 segundos? , pues pon un " delay (5000); " al principio del setup, si un delay si no vas a hacer nada no hace falta usar millis().
Para mi ese trozo de codigo bastaria con:

#define Boton_EQ 0xFF9867
int SENSOR = 8;
IRrecv irrecv (SENSOR);
decode_results codigo;
int LEDEXTERIORCAFETERIA = 5;
int LEDFAROLAS = 6;
int LEDLUZPARQUE = 7;
unsigned long start;

void setup() {
  delay (5000);// si es lo que querias.

Ojo con la definicion

#define Boton_EQ 0xFF9867

Que luego haces el if solo con EQ. Y en donde lo has puesto no haces nada quitalo de loop y ponlo en la funcion "decodificador_IR ()" como te dije, quedaria algo asi:

void decodificador_IR () {
  // lo que tenias
  
  if (codigo.value == Boton_EQ) {
    while (! irrecv.decode(&codigo)) // Espera otra lectura valida del sensor
      if (codigo.value == Boton_0)
      // Haces lo que sea
      if (codigo.value == Boton_1)
      // Haces lo que sea
      // ETC
   }

  irrecv.resume();
}

Cuando conecto la placa inicia correctamente la secuencia de los semáforos sin ningún problema pero, el remoto no funciona como debería( en otra pestaña con solo la programación del remoto, si funciona instantáneamente cuando le doy al botón, pero en esta no, le tengo que dar como 6 veces para que encienda(creo que es por el millis) ) y cuando le doy a apagar las luces cambia sin sentido las intensidades de las bombillas o no se apagan.
Sobre el mando: no ve va lo de las combinaciones de teclas que me dijiste.

int LEDROJOSEMAFORO = 12;
int LEDVERDESEMAFORO = 10;
int LEDAMARILLOSEMAFORO = 11;

#include <IRremote.h>
#define Boton_power 0xFFA25D
#define Boton_0 0xFF6897
#define Boton_1 0xFF30CF
#define Boton_2 0xFF18E7
#define Boton_EQ 0xFF9867


int SENSOR = 8;
IRrecv irrecv (SENSOR);
decode_results codigo;
int LEDEXTERIORCAFETERIA = 5;
int LEDFAROLAS = 6;
int LEDLUZPARQUE = 7;
int LEDCASA = 4;
unsigned long start;

 
void setup() {
 
  pinMode(LEDROJOSEMAFORO, OUTPUT);
  pinMode(LEDVERDESEMAFORO, OUTPUT);
  pinMode(LEDAMARILLOSEMAFORO, OUTPUT); 

    Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode(LEDEXTERIORCAFETERIA, OUTPUT);
  pinMode(LEDFAROLAS, OUTPUT);
   pinMode(LEDLUZPARQUE, OUTPUT);
}

void decodificador_IR () {
if (irrecv.decode(&codigo)) {
  Serial.println(codigo.value, HEX);
  
    if (codigo.value == Boton_EQ)
    digitalWrite(LEDCASA, !digitalRead(LEDCASA));
     while (! irrecv.decode(&codigo))
     if (codigo.value == Boton_0)
    digitalWrite(LEDCASA, !digitalRead(LEDCASA));
}
 
    if (codigo.value == Boton_0)
    digitalWrite(LEDEXTERIORCAFETERIA, !digitalRead(LEDEXTERIORCAFETERIA));

      if (codigo.value == Boton_1)
    digitalWrite(LEDFAROLAS, !digitalRead(LEDFAROLAS));

     if (codigo.value == Boton_2)
    digitalWrite(LEDLUZPARQUE, !digitalRead(LEDLUZPARQUE));

   if (codigo.value == Boton_power)
     digitalWrite(LEDEXTERIORCAFETERIA,LOW); 
    
     if (codigo.value == Boton_power)
     digitalWrite(LEDFAROLAS,LOW); 

     if (codigo.value == Boton_power)
     digitalWrite(LEDLUZPARQUE,LOW);    
    
    irrecv.resume();
    }
  

void loop() {
  digitalWrite(LEDROJOSEMAFORO,LOW);
 digitalWrite(LEDAMARILLOSEMAFORO,LOW);
 digitalWrite(LEDVERDESEMAFORO,HIGH);
 start = millis();
 while (millis() - start < 5000) {
  decodificador_IR ();
 }
 digitalWrite(LEDROJOSEMAFORO,LOW);
 digitalWrite(LEDAMARILLOSEMAFORO,HIGH);
 digitalWrite(LEDVERDESEMAFORO,LOW);
 start = millis();
 while (millis() - start < 2500) {
  decodificador_IR ();
 }
 digitalWrite(LEDROJOSEMAFORO,HIGH);
 digitalWrite(LEDAMARILLOSEMAFORO,LOW);
 digitalWrite(LEDVERDESEMAFORO,LOW);
 start = millis();

 while (millis() - start < 5000) {
  decodificador_IR ();
}
}

A ver si entendí el problema...

Confío en que, como dijiste en #1, el manejo de las luces por C/R funciona bien así que solo agregué la secuencia de los semáforos

//Secuencia de semáforos
//cuando se conecta la placa comienza la secuencia
// y
//encendido de las luces a control remoto
// cuando le doy al botón 0 se enciende una luz o se apaga.
//si esta encendida la luz del parque o las de la cafetería, o le doy a sus correspondientes teclas o le doy a el power y se apagan

#include <IRremote.h>
#define Boton_power 0xFFA25D
#define Boton_0 0xFF6897
#define Boton_1 0xFF30CF
#define Boton_2 0xFF18E7


int SENSOR = 8;
IRrecv irrecv (SENSOR);
decode_results codigo;
int LEDEXTERIORCAFETERIA = 5;
int LEDFAROLAS = 6;
int LEDLUZPARQUE = 7;

int LEDROJOSEMAFORO = 12;
int LEDVERDESEMAFORO = 10;
int LEDAMARILLOSEMAFORO = 11;

unsigned long oldTime;

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();
  
  pinMode(LEDROJOSEMAFORO, OUTPUT);
  pinMode(LEDVERDESEMAFORO, OUTPUT);
  pinMode(LEDAMARILLOSEMAFORO, OUTPUT); 

  pinMode(LEDEXTERIORCAFETERIA, OUTPUT);
  pinMode(LEDFAROLAS, OUTPUT);
  pinMode(LEDLUZPARQUE, OUTPUT);

// --- Inicia con semáforo verde ---
  digitalWrite(LEDROJOSEMAFORO,LOW);
  digitalWrite(LEDAMARILLOSEMAFORO,LOW);
  digitalWrite(LEDVERDESEMAFORO,HIGH);
  oldTime = millis();
}

void loop() {
// --- Secuencia semáforos ---  
  if (millis() - oldTime >= 12500UL) {   // verde
    digitalWrite(LEDROJOSEMAFORO,LOW);
    digitalWrite(LEDAMARILLOSEMAFORO,LOW);
    digitalWrite(LEDVERDESEMAFORO,HIGH);
    oldTime = millis();
  }
  else if (millis() - oldTime >= 7500UL) {  // rojo
    digitalWrite(LEDROJOSEMAFORO,HIGH);
    digitalWrite(LEDAMARILLOSEMAFORO,LOW);
    digitalWrite(LEDVERDESEMAFORO,LOW);
  }
  else if (millis() - oldTime >= 5000UL) {  // amarillo
    digitalWrite(LEDROJOSEMAFORO,LOW);
    digitalWrite(LEDAMARILLOSEMAFORO,HIGH);
    digitalWrite(LEDVERDESEMAFORO,LOW);
  }
// --- Fin secuencia semáforos ---

  if (irrecv.decode(&codigo)) {
    Serial.println(codigo.value, HEX);
    
    if (codigo.value == Boton_0) digitalWrite(LEDEXTERIORCAFETERIA, !digitalRead(LEDEXTERIORCAFETERIA));
    if (codigo.value == Boton_1)  digitalWrite(LEDFAROLAS, !digitalRead(LEDFAROLAS));
    if (codigo.value == Boton_2) digitalWrite(LEDLUZPARQUE, !digitalRead(LEDLUZPARQUE));
    if (codigo.value == Boton_power) digitalWrite(LEDEXTERIORCAFETERIA,LOW); 
    if (codigo.value == Boton_power) digitalWrite(LEDFAROLAS,LOW); 
    if (codigo.value == Boton_power) digitalWrite(LEDLUZPARQUE,LOW); 
    
    irrecv.resume();
  }
  delay (100);
}

El delay() del final lo dejé porque no sería una gran molestia, eventualmente puedes quitarlo.

La secuencia de los semáforos, tal como lo tenías programado, inicia en verde durante 5 segundos.
A los 5 seg. cambia a amarillo durante 2.5 seg.
A los 7.5 seg. cambia a rojo durante 5 seg.
A los 12.5 seg. vuelve a verde y actualiza oldTime con el tiempo actual para reiniciar el ciclo.

Saludos

PD: No quise renombrar las variables pero por reglas de estilo y para que sea más conveniente a la hora de revisar el código, en mayúsculas se nombran las constantes, las variables deberían estar en minúsculas, por ej,
LEDEXTERIORCAFETERIA debería ser ledExteriorCafeteria.
Tenlo en cuenta.

No pude con mi genio, agregué unas constantes para que facilitarte cambiar los tiempos del semáforo, si acaso quisieras hacerlo, y definí los pines de forma más adecuada. :wink:

//Secuencia de semáforos
//cuando se conecta la placa comienza la secuencia
// y
//encendido de las luces a control remoto
// cuando le doy al botón 0 se enciende una luz o se apaga.
//si esta encendida la luz del parque o las de la cafetería, o le doy a sus correspondientes teclas o le doy a el power y se apagan

#include <IRremote.h>
#define Boton_power 0xFFA25D
#define Boton_0 0xFF6897
#define Boton_1 0xFF30CF
#define Boton_2 0xFF18E7


const byte SENSOR = 8;

const byte LED_EXTERIOR_CAFETERIA = 5;
const byte LED_FAROLAS = 6;
const byte LED_LUZ_PARQUE = 7;

const byte LED_ROJO_SEMAFORO = 12;
const byte LED_VERDE_SEMAFORO = 10;
const byte LED_AMARILLO_SEMAFORO = 11;

const unsigned long DELAY_VERDE = 5000; // tiempo verde
const unsigned long DELAY_AMARILLO = 2500; // tiempo amarillo
const unsigned long DELAY_ROJO = 5000; // tiempo rojo
const unsigned long DELAY_VEAM = DELAY_VERDE + DELAY_AMARILLO;
const unsigned long DELAY_VEAMRO = DELAY_VEAM + DELAY_ROJO;

unsigned long oldTime;

IRrecv irrecv (SENSOR);
decode_results codigo;

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();
  
  pinMode(LED_ROJO_SEMAFORO, OUTPUT);
  pinMode(LED_VERDE_SEMAFORO, OUTPUT);
  pinMode(LED_AMARILLO_SEMAFORO, OUTPUT); 

  pinMode(LED_EXTERIOR_CAFETERIA, OUTPUT);
  pinMode(LED_FAROLAS, OUTPUT);
  pinMode(LED_LUZ_PARQUE, OUTPUT);

// --- Inicia con semáforo verde ---
  digitalWrite(LED_ROJO_SEMAFORO,LOW);
  digitalWrite(LED_AMARILLO_SEMAFORO,LOW);
  digitalWrite(LED_VERDE_SEMAFORO,HIGH);
  oldTime = millis();
}

void loop() {
// --- Secuencia semáforos ---  
  if (millis() - oldTime >= DELAY_VEAMRO) {   // cambia a verde
    digitalWrite(LED_ROJO_SEMAFORO,LOW);
    digitalWrite(LED_AMARILLO_SEMAFORO,LOW);
    digitalWrite(LED_VERDE_SEMAFORO,HIGH);
    oldTime = millis();
  }
  else if (millis() - oldTime >= DELAY_VEAM) {  // cambia a rojo
    digitalWrite(LED_ROJO_SEMAFORO,HIGH);
    digitalWrite(LED_AMARILLO_SEMAFORO,LOW);
    digitalWrite(LED_VERDE_SEMAFORO,LOW);
  }
  else if (millis() - oldTime >= DELAY_VERDE) {  // cambia a amarillo
    digitalWrite(LED_ROJO_SEMAFORO,LOW);
    digitalWrite(LED_AMARILLO_SEMAFORO,HIGH);
    digitalWrite(LED_VERDE_SEMAFORO,LOW);
  }
// --- Fin secuencia semáforos ---

  if (irrecv.decode(&codigo)) {
    Serial.println(codigo.value, HEX);
    
    if (codigo.value == Boton_0) digitalWrite(LED_EXTERIOR_CAFETERIA, !digitalRead(LED_EXTERIOR_CAFETERIA));
    if (codigo.value == Boton_1) digitalWrite(LED_FAROLAS, !digitalRead(LED_FAROLAS));
    if (codigo.value == Boton_2) digitalWrite(LED_LUZ_PARQUE, !digitalRead(LED_LUZ_PARQUE));
    if (codigo.value == Boton_power) {
     digitalWrite(LED_EXTERIOR_CAFETERIA,LOW); 
     digitalWrite(LED_FAROLAS,LOW); 
     digitalWrite(LED_LUZ_PARQUE,LOW); 
    }
    irrecv.resume();
  }
  delay (100);
}

Edito
No me había percatado del tema de Boton_power, corrijo algo que para mi no tiene sentido (3 if() cuando lo lógico es que sea 1)
Lo corrijo.

Saludos

Otro magnifico ejemplo de @anon90500195 de como manejar millis y no morir en el intento, pero yo voy a seguir por el enfoque que teniamos ya que el error no estaba en la gestion de los semafos, ese funcionaba correctamente.
El error estaba en funcion de de codificacion, y mas concretamente en la linea:

 while (! irrecv.decode(&codigo))

Veras cuando pulsas una tecla, no solo se manda el valor de la tecla, se manda una trama compleja de varios datos y esa linea y posteriores no funcionaba.
En lugar de usar eso una alternativa podria ser crear una variable booleana por ejemplo "flag" que cabia al pulsar el boton " Boton_EQ " cambie y posteriormente en cada boton hacer una u otra cosa.
La funcion "void decodificador_IR ()" quedaria asi:

void decodificador_IR () {
  if (irrecv.decode(&codigo)) {
    Serial.println(codigo.value, HEX);

    if (codigo.value == Boton_EQ) {
      flag = !flag;
    }

    // luego para cada tecla cambias a

    if (codigo.value == Boton_0) {
      switch (flag) {
        case 0:
          //lo que hacias
          digitalWrite(LEDEXTERIORCAFETERIA, !digitalRead(LEDEXTERIORCAFETERIA));
          break;
        case 1:
          // Haces la otra opcion
          flag = false;
          break;
      }
    }

    if (codigo.value == Boton_1) {
      switch (flag) {
        case 0:
          //lo que hacias
          digitalWrite(LEDFAROLAS, !digitalRead(LEDFAROLAS));
          break;
        case 1:
          // Haces la otra opcion
          flag = false;
          break;
      }
    }

    if (codigo.value == Boton_2) {
      switch (flag) {
        case 0:
          //lo que hacias
          digitalWrite(LEDLUZPARQUE, !digitalRead(LEDLUZPARQUE));
          break;
        case 1:
          // Haces la otra opcion
          flag = false;
          break;
      }
    }

    if (codigo.value == Boton_power) {
      digitalWrite(LEDEXTERIORCAFETERIA, LOW);
      digitalWrite(LEDFAROLAS, LOW);
      digitalWrite(LEDLUZPARQUE, LOW);
    }
    irrecv.resume();
  }
}

Si te gusta mas el codigo de @anon90500195 cambia sus if de decodificacion por estos nuevos, ambos codigos funcionaran igual.
Saludos.

No son mios, es el código original del PO y que dijo que funcionaba bien y me parece correcto, ¿para qué cambiarlo?.

Por otro lado no coincido con el uso que haces de los while() pero cada uno tiene su estilo de programar, eso es lo lindo de esto, la variedad de enfoques.

Saludos

Queria decir los que pones en tu codigo sin importar quien los creo.

Porque ahora quiere que cada boton tengan dos funciones dependiendo si se ha pulsado o no otro boton especifico.
Saludos.

No, no, puse el código consciente de que era el código que subió el PO.

Saludos

Ahora mi versión adaptada a la pulsación de EQ+

//Secuencia de semáforos
//cuando se conecta la placa comienza la secuencia
// y
//encendido de las luces a control remoto
// cuando le doy al botón 0 se enciende una luz o se apaga.
//si esta encendida la luz del parque o las de la cafetería, o le doy a sus correspondientes teclas o le doy a el power y se apagan

#include <IRremote.h>
#define Boton_power 0xFFA25D
#define Boton_0 0xFF6897
#define Boton_1 0xFF30CF
#define Boton_2 0xFF18E7
#define Boton_EQ 0xFF9867

const byte SENSOR = 8;

const byte LED_EXTERIOR_CAFETERIA = 5;
const byte LED_FAROLAS = 6;
const byte LED_LUZ_PARQUE = 7;

const byte LED_ROJO_SEMAFORO = 12;
const byte LED_VERDE_SEMAFORO = 10;
const byte LED_AMARILLO_SEMAFORO = 11;

const unsigned long DELAY_VERDE = 5000; // tiempo verde
const unsigned long DELAY_AMARILLO = 2500; // tiempo amarillo
const unsigned long DELAY_ROJO = 5000; // tiempo rojo
const unsigned long DELAY_VEAM = DELAY_VERDE + DELAY_AMARILLO;
const unsigned long DELAY_VEAMRO = DELAY_VEAM + DELAY_ROJO;
const unsigned long EQKEY_EXP = 5000; // tiempo espera dd 2da tecla

unsigned long oldTime;
unsigned long oldEqTime;

bool eqPressed = false;

IRrecv irrecv (SENSOR);
decode_results codigo;

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();
  
  pinMode(LED_ROJO_SEMAFORO, OUTPUT);
  pinMode(LED_VERDE_SEMAFORO, OUTPUT);
  pinMode(LED_AMARILLO_SEMAFORO, OUTPUT); 

  pinMode(LED_EXTERIOR_CAFETERIA, OUTPUT);
  pinMode(LED_FAROLAS, OUTPUT);
  pinMode(LED_LUZ_PARQUE, OUTPUT);

// --- Inicia con semáforo verde ---
  digitalWrite(LED_ROJO_SEMAFORO,LOW);
  digitalWrite(LED_AMARILLO_SEMAFORO,LOW);
  digitalWrite(LED_VERDE_SEMAFORO,HIGH);
  oldTime = millis();
}

void loop() {
// --- Secuencia semáforos ---  
  if (millis() - oldTime >= DELAY_VEAMRO) {   // cambia a verde
    digitalWrite(LED_ROJO_SEMAFORO,LOW);
    digitalWrite(LED_AMARILLO_SEMAFORO,LOW);
    digitalWrite(LED_VERDE_SEMAFORO,HIGH);
    oldTime = millis();
  }
  else if (millis() - oldTime >= DELAY_VEAM) {  // cambia a rojo
    digitalWrite(LED_ROJO_SEMAFORO,HIGH);
    digitalWrite(LED_AMARILLO_SEMAFORO,LOW);
    digitalWrite(LED_VERDE_SEMAFORO,LOW);
  }
  else if (millis() - oldTime >= DELAY_VERDE) {  // cambia a amarillo
    digitalWrite(LED_ROJO_SEMAFORO,LOW);
    digitalWrite(LED_AMARILLO_SEMAFORO,HIGH);
    digitalWrite(LED_VERDE_SEMAFORO,LOW);
  }
// --- Fin secuencia semáforos ---

  if (irrecv.decode(&codigo)) {
    Serial.println(codigo.value, HEX);
    if (codigo.value == Boton_EQ) {
      eqPressed = true;
      oldEqTime = millis();
    }
    else {
      if (eqPressed) {
        eqPressed = false;
        switch (codigo.value) {
          case Boton_0:
            // tarea alternativa
            break;
          case Boton_1:
            // tarea alternativa
            break;
          case Boton_2:
            // tarea alternativa
            break;
          default: 
            eqPressed = true;
            break;
        }
      }
      else {
        switch (codigo.value) {
          case Boton_0:
            digitalWrite(LED_EXTERIOR_CAFETERIA, !digitalRead(LED_EXTERIOR_CAFETERIA));
            break;
          case Boton_1:
            digitalWrite(LED_FAROLAS, !digitalRead(LED_FAROLAS));
            break;
          case Boton_2:
            digitalWrite(LED_LUZ_PARQUE, !digitalRead(LED_LUZ_PARQUE));
            break;
          case Boton_power: 
            digitalWrite(LED_EXTERIOR_CAFETERIA,LOW); 
            digitalWrite(LED_FAROLAS,LOW); 
            digitalWrite(LED_LUZ_PARQUE,LOW); 
            break;
        }
      }
    }
    irrecv.resume();
  }
  if (eqPressed && (millis() - oldEqTime >= EQKEY_EXP)) {
    eqPressed = false; // expiró tiempo espera 2da tecla
  }
  delay (100);
}

Le puse un tiempo de expiración de 5 segundos (modificable) a la tecla EQ+ por si se pulsa por error.

Saludos

muchas gracias por ayudarme.

El tema de el semáforo y el remoto funciona perfectamente.
Ahora, el código de EQ+(0), enciende, pero no se apaga cuando le doy a las mismas teclas o al botón power.
Y cuando enciendo el led ilumina muy poco(como se puede ver en la imagen, el led rojo), siendo la misma resistencia que las demás, 220ohm, y sin ser problema del led. ¿a que se debe esto?
placa

//Secuencia de semáforos
//cuando se conecta la placa comienza la secuencia
// y
//encendido de las luces a control remoto
// cuando le doy al botón 0 se enciende una luz o se apaga.
//si esta encendida la luz del parque o las de la cafetería, o le doy a sus correspondientes teclas o le doy a el power y se apagan

#include <IRremote.h>
#define Boton_power 0xFFA25D
#define Boton_0 0xFF6897
#define Boton_1 0xFF30CF
#define Boton_2 0xFF18E7
#define Boton_EQ 0xFF9867

const byte SENSOR = 8;

const byte LED_EXTERIOR_CAFETERIA = 5;
const byte LED_FAROLAS = 6;
const byte LED_LUZ_PARQUE = 7;
const byte LED_CASA = 4;

const byte LED_ROJO_SEMAFORO = 12;
const byte LED_VERDE_SEMAFORO = 10;
const byte LED_AMARILLO_SEMAFORO = 11;

const unsigned long DELAY_VERDE = 5000; // tiempo verde
const unsigned long DELAY_AMARILLO = 2500; // tiempo amarillo
const unsigned long DELAY_ROJO = 5000; // tiempo rojo
const unsigned long DELAY_VEAM = DELAY_VERDE + DELAY_AMARILLO;
const unsigned long DELAY_VEAMRO = DELAY_VEAM + DELAY_ROJO;
const unsigned long EQKEY_EXP = 5000; // tiempo espera dd 2da tecla

unsigned long oldTime;
unsigned long oldEqTime;

bool eqPressed = false;

IRrecv irrecv (SENSOR);
decode_results codigo;

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();
  
  pinMode(LED_ROJO_SEMAFORO, OUTPUT);
  pinMode(LED_VERDE_SEMAFORO, OUTPUT);
  pinMode(LED_AMARILLO_SEMAFORO, OUTPUT); 

  pinMode(LED_EXTERIOR_CAFETERIA, OUTPUT);
  pinMode(LED_FAROLAS, OUTPUT);
  pinMode(LED_LUZ_PARQUE, OUTPUT);

// --- Inicia con semáforo verde ---
  digitalWrite(LED_ROJO_SEMAFORO,LOW);
  digitalWrite(LED_AMARILLO_SEMAFORO,LOW);
  digitalWrite(LED_VERDE_SEMAFORO,HIGH);
  oldTime = millis();
}

void loop() {
// --- Secuencia semáforos ---  
  if (millis() - oldTime >= DELAY_VEAMRO) {   // cambia a verde
    digitalWrite(LED_ROJO_SEMAFORO,LOW);
    digitalWrite(LED_AMARILLO_SEMAFORO,LOW);
    digitalWrite(LED_VERDE_SEMAFORO,HIGH);
    oldTime = millis();
  }
  else if (millis() - oldTime >= DELAY_VEAM) {  // cambia a rojo
    digitalWrite(LED_ROJO_SEMAFORO,HIGH);
    digitalWrite(LED_AMARILLO_SEMAFORO,LOW);
    digitalWrite(LED_VERDE_SEMAFORO,LOW);
  }
  else if (millis() - oldTime >= DELAY_VERDE) {  // cambia a amarillo
    digitalWrite(LED_ROJO_SEMAFORO,LOW);
    digitalWrite(LED_AMARILLO_SEMAFORO,HIGH);
    digitalWrite(LED_VERDE_SEMAFORO,LOW);
  }
// --- Fin secuencia semáforos ---

  if (irrecv.decode(&codigo)) {
    Serial.println(codigo.value, HEX);
    if (codigo.value == Boton_EQ) {
      eqPressed = true;
      oldEqTime = millis();
    }
    else {
      if (eqPressed) {
        eqPressed = false;
        switch (codigo.value) {
          case Boton_0:
            // tarea alternativa
             digitalWrite(LED_CASA, !digitalRead(LED_CASA));
            break;
          case Boton_1:
            // tarea alternativa
            break;
          case Boton_2:
            // tarea alternativa
            break;
          default: 
            eqPressed = true;
            break;

             case Boton_power: 
            digitalWrite(LED_CASA,LOW); 
        }
      }
      else {
        switch (codigo.value) {
          case Boton_0:
            digitalWrite(LED_EXTERIOR_CAFETERIA, !digitalRead(LED_EXTERIOR_CAFETERIA));
            break;
          case Boton_1:
            digitalWrite(LED_FAROLAS, !digitalRead(LED_FAROLAS));
            break;
          case Boton_2:
            digitalWrite(LED_LUZ_PARQUE, !digitalRead(LED_LUZ_PARQUE));
            break;
          case Boton_power: 
            digitalWrite(LED_EXTERIOR_CAFETERIA,LOW); 
            digitalWrite(LED_FAROLAS,LOW); 
            digitalWrite(LED_LUZ_PARQUE,LOW); 
            break;
        }
      }
    }
    irrecv.resume();
  }
  if (eqPressed && (millis() - oldEqTime >= EQKEY_EXP)) {
    eqPressed = false; // expiró tiempo espera 2da tecla
  }
  delay (100);
}

Hay dos problemas.
1- Olvidaste definir LED_CASA como salida.
2- Los case que agregues para EQ deben ir antes de default y siempre terminar con break (salvo que quieras que se ejecuten varios case consecutivos)

Entonces, prueba

//Secuencia de semáforos
//cuando se conecta la placa comienza la secuencia
// y
//encendido de las luces a control remoto
// cuando le doy al botón 0 se enciende una luz o se apaga.
//si esta encendida la luz del parque o las de la cafetería, o le doy a sus correspondientes teclas o le doy a el power y se apagan

#include <IRremote.h>
#define Boton_power 0xFFA25D
#define Boton_0 0xFF6897
#define Boton_1 0xFF30CF
#define Boton_2 0xFF18E7
#define Boton_EQ 0xFF9867

const byte SENSOR = 8;

const byte LED_EXTERIOR_CAFETERIA = 5;
const byte LED_FAROLAS = 6;
const byte LED_LUZ_PARQUE = 7;
const byte LED_CASA = 4;

const byte LED_ROJO_SEMAFORO = 12;
const byte LED_VERDE_SEMAFORO = 10;
const byte LED_AMARILLO_SEMAFORO = 11;

const unsigned long DELAY_VERDE = 5000; // tiempo verde
const unsigned long DELAY_AMARILLO = 2500; // tiempo amarillo
const unsigned long DELAY_ROJO = 5000; // tiempo rojo
const unsigned long DELAY_VEAM = DELAY_VERDE + DELAY_AMARILLO;
const unsigned long DELAY_VEAMRO = DELAY_VEAM + DELAY_ROJO;
const unsigned long EQKEY_EXP = 5000; // tiempo espera dd 2da tecla

unsigned long oldTime;
unsigned long oldEqTime;

bool eqPressed = false;

IRrecv irrecv (SENSOR);
decode_results codigo;

void luz_verde() {
  digitalWrite(LED_ROJO_SEMAFORO, LOW);
  digitalWrite(LED_AMARILLO_SEMAFORO, LOW);
  digitalWrite(LED_VERDE_SEMAFORO, HIGH);
  oldTime = millis();
}


void semaforos() {
  // --- Secuencia semáforos ---
  if (millis() - oldTime >= DELAY_VEAMRO) {   // cambia a verde
    luz_verde();
  }
  else if (millis() - oldTime >= DELAY_VEAM) {  // cambia a rojo
    digitalWrite(LED_ROJO_SEMAFORO, HIGH);
    digitalWrite(LED_AMARILLO_SEMAFORO, LOW);
    digitalWrite(LED_VERDE_SEMAFORO, LOW);
  }
  else if (millis() - oldTime >= DELAY_VERDE) {  // cambia a amarillo
    digitalWrite(LED_ROJO_SEMAFORO, LOW);
    digitalWrite(LED_AMARILLO_SEMAFORO, HIGH);
    digitalWrite(LED_VERDE_SEMAFORO, LOW);
  }
  // --- Fin secuencia semáforos ---
}

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();
  
  pinMode(LED_ROJO_SEMAFORO, OUTPUT);
  pinMode(LED_VERDE_SEMAFORO, OUTPUT);
  pinMode(LED_AMARILLO_SEMAFORO, OUTPUT); 

  pinMode(LED_CASA, OUTPUT);
  pinMode(LED_EXTERIOR_CAFETERIA, OUTPUT);
  pinMode(LED_FAROLAS, OUTPUT);
  pinMode(LED_LUZ_PARQUE, OUTPUT);

// --- Inicia con semáforo verde ---
  luz_verde();
}

void loop(){
  semaforos();

  if (irrecv.decode(&codigo)) {
    Serial.println(codigo.value, HEX);
    if (codigo.value == Boton_EQ) {
      eqPressed = true;
      oldEqTime = millis();
    }
    else {
      if (eqPressed) {
        eqPressed = false;
        switch (codigo.value) {
          case Boton_0:
            // tarea alternativa
             digitalWrite(LED_CASA, !digitalRead(LED_CASA));
            break;
          case Boton_1:
            // tarea alternativa
            break;
          case Boton_2:
            // tarea alternativa
            break;
          case Boton_power: 
             digitalWrite(LED_CASA,LOW); 
             break;
          default: 
            eqPressed = true;
            break;
        }
      }
      else {
        switch (codigo.value) {
          case Boton_0:
            digitalWrite(LED_EXTERIOR_CAFETERIA, !digitalRead(LED_EXTERIOR_CAFETERIA));
            break;
          case Boton_1:
            digitalWrite(LED_FAROLAS, !digitalRead(LED_FAROLAS));
            break;
          case Boton_2:
            digitalWrite(LED_LUZ_PARQUE, !digitalRead(LED_LUZ_PARQUE));
            break;
          case Boton_power: 
            digitalWrite(LED_EXTERIOR_CAFETERIA,LOW); 
            digitalWrite(LED_FAROLAS,LOW); 
            digitalWrite(LED_LUZ_PARQUE,LOW); 
            break;
        }
      }
    }
    irrecv.resume();
  }
  if (eqPressed && (millis() - oldEqTime >= EQKEY_EXP)) {
    eqPressed = false; // expiró tiempo espera 2da tecla
  }
  delay (100);
}

Nota: Separé la secuencia de los semáforos en una función para ser más prolijo.

Mil millones de gracias a @anon90500195, @gonpezzi, @lepes y a @Surbyte por todo. Mil millones de gracias.
Funciona correctamente todo.

PD: por simple curiosidad si quiero añadir mas combinaciones con el mando, ¿Cómo sería?
He intentado hacerlo pero no lo he conseguido. (Boton_ST)

//Secuencia de semáforos
//cuando se conecta la placa comienza la secuencia
// y
//encendido de las luces a control remoto
// cuando le doy al botón 0 se enciende una luz o se apaga.
//si esta encendida la luz del parque o las de la cafetería, o le doy a sus correspondientes teclas o le doy a el power y se apagan

#include <IRremote.h>
#define Boton_power 0xFFA25D
#define Boton_0 0xFF6897
#define Boton_1 0xFF30CF
#define Boton_2 0xFF18E7
#define Boton_EQ 0xFF9867
#define Boton_ST 0xFFB04F

const byte SENSOR = 8;

const byte LED_EXTERIOR_CAFETERIA = 5;
const byte LED_FAROLAS = 6;
const byte LED_LUZ_PARQUE = 7;
const byte LED_CASA = 4;
const byte LED_CASA_DOS = 3;

const byte LED_ROJO_SEMAFORO = 12;
const byte LED_VERDE_SEMAFORO = 10;
const byte LED_AMARILLO_SEMAFORO = 11;

const unsigned long DELAY_VERDE = 5000; // tiempo verde
const unsigned long DELAY_AMARILLO = 2500; // tiempo amarillo
const unsigned long DELAY_ROJO = 5000; // tiempo rojo
const unsigned long DELAY_VEAM = DELAY_VERDE + DELAY_AMARILLO;
const unsigned long DELAY_VEAMRO = DELAY_VEAM + DELAY_ROJO;
const unsigned long EQKEY_EXP = 5000; // tiempo espera dd 2da tecla

unsigned long oldTime;
unsigned long oldEqTime;

bool eqPressed = false;

IRrecv irrecv (SENSOR);
decode_results codigo;

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();
  
  pinMode(LED_ROJO_SEMAFORO, OUTPUT);
  pinMode(LED_VERDE_SEMAFORO, OUTPUT);
  pinMode(LED_AMARILLO_SEMAFORO, OUTPUT); 

  pinMode(LED_CASA, OUTPUT);
  pinMode(LED_CASA_DOS, OUTPUT);
  pinMode(LED_EXTERIOR_CAFETERIA, OUTPUT);
  pinMode(LED_FAROLAS, OUTPUT);
  pinMode(LED_LUZ_PARQUE, OUTPUT);

// --- Inicia con semáforo verde ---
  digitalWrite(LED_ROJO_SEMAFORO,LOW);
  digitalWrite(LED_AMARILLO_SEMAFORO,LOW);
  digitalWrite(LED_VERDE_SEMAFORO,HIGH);
  oldTime = millis();
}

void loop() {
// --- Secuencia semáforos ---  
  if (millis() - oldTime >= DELAY_VEAMRO) {   // cambia a verde
    digitalWrite(LED_ROJO_SEMAFORO,LOW);
    digitalWrite(LED_AMARILLO_SEMAFORO,LOW);
    digitalWrite(LED_VERDE_SEMAFORO,HIGH);
    oldTime = millis();
  }
  else if (millis() - oldTime >= DELAY_VEAM) {  // cambia a rojo
    digitalWrite(LED_ROJO_SEMAFORO,HIGH);
    digitalWrite(LED_AMARILLO_SEMAFORO,LOW);
    digitalWrite(LED_VERDE_SEMAFORO,LOW);
  }
  else if (millis() - oldTime >= DELAY_VERDE) {  // cambia a amarillo
    digitalWrite(LED_ROJO_SEMAFORO,LOW);
    digitalWrite(LED_AMARILLO_SEMAFORO,HIGH);
    digitalWrite(LED_VERDE_SEMAFORO,LOW);
  }
// --- Fin secuencia semáforos ---

  if (irrecv.decode(&codigo)) {
    Serial.println(codigo.value, HEX);
    if (codigo.value == Boton_EQ) {
      eqPressed = true;
      oldEqTime = millis();
    }
    
    else {
      if (eqPressed) {
        eqPressed = false;
        switch (codigo.value) {
          case Boton_0:
            // tarea alternativa
           
            break;
          case Boton_1:
            // tarea alternativa
          
            break;
          case Boton_2:
            // tarea alternativa
            break;
          case Boton_power: 
           
             break;
          default: 
            eqPressed = true;
            break;
        }
      }
      Serial.println(codigo.value, HEX);
 if (codigo.value == Boton_ST) {
      eqPressed = true;
      oldEqTime = millis();
    }
    
    else {
      if (eqPressed) {
        eqPressed = false;
        switch (codigo.value) {
          case Boton_0:
            // tarea alternativa
             digitalWrite(LED_CASA, !digitalRead(LED_CASA));
            break;
          case Boton_1:
            // tarea alternativa
           digitalWrite(LED_CASA_DOS, !digitalRead(LED_CASA_DOS));
            break;
          case Boton_2:
            // tarea alternativa
            break;
          case Boton_power: 
           
             break;
          default: 
            eqPressed = true;
            break;
        }
      }
      
      

      else {
        switch (codigo.value) {
          case Boton_0:
            digitalWrite(LED_EXTERIOR_CAFETERIA, !digitalRead(LED_EXTERIOR_CAFETERIA));
            break;
          case Boton_1:
            digitalWrite(LED_FAROLAS, !digitalRead(LED_FAROLAS));
            break;
          case Boton_2:
            digitalWrite(LED_LUZ_PARQUE, !digitalRead(LED_LUZ_PARQUE));
            break;
          case Boton_power: 
            digitalWrite(LED_EXTERIOR_CAFETERIA,LOW); 
            digitalWrite(LED_FAROLAS,LOW); 
            digitalWrite(LED_LUZ_PARQUE,LOW); 
              digitalWrite(LED_CASA,LOW); 
                digitalWrite(LED_CASA_DOS,LOW); 
            break;
          }
        }
      }
     }
    
    irrecv.resume();
  }
  if (eqPressed && (millis() - oldEqTime >= EQKEY_EXP)) {
    eqPressed = false; // expiró tiempo espera 2da tecla
  }
  delay (100);
}

Defines el código del botón y luego agregas los case que hagan falta, si va combinado con EQ irá en el primer switch y si no va en el segundo, o en ambos si quieres que haga cosas diferentes.

  if (irrecv.decode(&codigo)) {
    Serial.println(codigo.value, HEX);
    if (codigo.value == Boton_EQ) {
      eqPressed = true;
      oldEqTime = millis();
    }
    else {
      if (eqPressed) {
        eqPressed = false;
        switch (codigo.value) {
          case Boton_0:
            // tarea alternativa
             digitalWrite(LED_CASA, !digitalRead(LED_CASA));
            break;
          case Boton_1:
            // tarea alternativa
            break;
          case Boton_2:
            // tarea alternativa
            break;
          case Boton_power: 
             digitalWrite(LED_CASA,LOW); 
             break;
//-------------------------------------------
// EQ+ Boton_ST  
          case Boton_ST:
            // tarea para EQ+ Boton_ST  
            break;
//-------------------------------------------         
          default: 
            eqPressed = true;
            break;
        }
      }
      else {
        switch (codigo.value) {
          case Boton_0:
            digitalWrite(LED_EXTERIOR_CAFETERIA, !digitalRead(LED_EXTERIOR_CAFETERIA));
            break;
          case Boton_1:
            digitalWrite(LED_FAROLAS, !digitalRead(LED_FAROLAS));
            break;
          case Boton_2:
            digitalWrite(LED_LUZ_PARQUE, !digitalRead(LED_LUZ_PARQUE));
            break;
          case Boton_power: 
            digitalWrite(LED_EXTERIOR_CAFETERIA,LOW); 
            digitalWrite(LED_FAROLAS,LOW); 
            digitalWrite(LED_LUZ_PARQUE,LOW); 
            break;
          case Boton_power: 
             digitalWrite(LED_CASA,LOW); 
             break;
//-------------------------------------------
//  Boton_ST  (sin EQ previo)
          case Boton_ST:
            // tarea para Boton_ST  
            break;
//-------------------------------------------

        }
      }
    }
    irrecv.resume();
  }
  if (eqPressed && (millis() - oldEqTime >= EQKEY_EXP)) {
    eqPressed = false; // expiró tiempo espera 2da tecla
  }
  delay (100);
}

Trata de entender el código y vas a ver que es muy fácil agregar botones.

Saludos y me alegra que te sirviese la ayuda