//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 0x5DA2FF00
#define Boton_0 0x9768FF00
#define Boton_1 0xCF30FF00
#define Boton_2 0xE718FF00
#define Boton_EQ 0xFD02FF00


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_SEMAFORO1 = 12;
const byte LED_VERDE_SEMAFORO1 = 10;
const byte LED_AMARILLO_SEMAFORO1 = 11;
const byte LED_ROJO_SEMAFORO2 = A2;
const byte LED_VERDE_SEMAFORO2 = A0;
const byte LED_AMARILLO_SEMAFORO2 = A1;

const unsigned long DELAY_SOLAP = 2000; // tiempo rojo + amarillo
const unsigned long DELAY_VERDE = 40000; // tiempo verde
const unsigned long DELAY_AMARILLO = 3000; // tiempo amarillo
const unsigned long DELAY_ROJO = DELAY_VERDE + DELAY_AMARILLO + DELAY_SOLAP; // tiempo rojo
const unsigned long T1 = DELAY_SOLAP;
const unsigned long T2 = T1 + DELAY_VERDE;
const unsigned long T3 = DELAY_ROJO;
const unsigned long T4 = T3 + T1;
const unsigned long T5 = T3 + T2;
const unsigned long T6 = T3 + T3;
const unsigned long EQKEY_EXP = 5000; // tiempo espera de 2da tecla

unsigned long oldTime;
unsigned long oldEqTime;

bool eqPressed = false;

IRrecv irrecv (SENSOR);
decode_results codigo;

void luz_x() {
  digitalWrite(LED_VERDE_SEMAFORO1, 0);
  digitalWrite(LED_AMARILLO_SEMAFORO1, 1);
  digitalWrite(LED_ROJO_SEMAFORO1, 1);

  digitalWrite(LED_VERDE_SEMAFORO2, 0);
  digitalWrite(LED_AMARILLO_SEMAFORO2, 0);
  digitalWrite(LED_ROJO_SEMAFORO2, 1);
 
  oldTime = millis();
}


void semaforos() {
  // --- Secuencia semáforos ---
  if (millis() - oldTime >= T6) {   // cambia 1 a verde
    luz_x();
  }
  else if (millis() - oldTime >= T5) {  // cambia 2 a amarillo
    digitalWrite(LED_VERDE_SEMAFORO1, 0);
    digitalWrite(LED_AMARILLO_SEMAFORO1, 0);
    digitalWrite(LED_ROJO_SEMAFORO1, 1);

    digitalWrite(LED_VERDE_SEMAFORO2, 0);
    digitalWrite(LED_ROJO_SEMAFORO2, 0);
    digitalWrite(LED_AMARILLO_SEMAFORO2, 1);
  }
  else if (millis() - oldTime >= T4) {  // cambia 1 a rojo
    digitalWrite(LED_AMARILLO_SEMAFORO1, 0);
    digitalWrite(LED_VERDE_SEMAFORO1, 0);
    digitalWrite(LED_ROJO_SEMAFORO1, 1);

    digitalWrite(LED_AMARILLO_SEMAFORO2, 0);
    digitalWrite(LED_ROJO_SEMAFORO2, 0);
    digitalWrite(LED_VERDE_SEMAFORO2, 1);
}
  else if (millis() - oldTime >= T3) {  // cambia 1 a amarillo
    digitalWrite(LED_VERDE_SEMAFORO1, 0);
    digitalWrite(LED_AMARILLO_SEMAFORO1, 0);
    digitalWrite(LED_ROJO_SEMAFORO1, 1);
 
    digitalWrite(LED_VERDE_SEMAFORO2, 0);
    digitalWrite(LED_AMARILLO_SEMAFORO2, 1);
    digitalWrite(LED_ROJO_SEMAFORO2, 1);
 }
  else if (millis() - oldTime >= T2) {  // cambia 1 a amarillo
    digitalWrite(LED_VERDE_SEMAFORO1, 0);
    digitalWrite(LED_ROJO_SEMAFORO1, 0);
    digitalWrite(LED_AMARILLO_SEMAFORO1, 1);
 
    digitalWrite(LED_VERDE_SEMAFORO2, 0);
    digitalWrite(LED_AMARILLO_SEMAFORO2, 0);
    digitalWrite(LED_ROJO_SEMAFORO2, 1);
 }
  else if (millis() - oldTime >= T1) {  // cambia 1 a amarillo
    digitalWrite(LED_AMARILLO_SEMAFORO1, 0);
    digitalWrite(LED_ROJO_SEMAFORO1, 0);
    digitalWrite(LED_VERDE_SEMAFORO1, 1);
 
    digitalWrite(LED_VERDE_SEMAFORO2, 0);
    digitalWrite(LED_AMARILLO_SEMAFORO2, 0);
    digitalWrite(LED_ROJO_SEMAFORO2, 1);
 }
  // --- Fin secuencia semáforos ---
}

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode(LED_ROJO_SEMAFORO1, OUTPUT);
  pinMode(LED_VERDE_SEMAFORO1, OUTPUT);
  pinMode(LED_AMARILLO_SEMAFORO1, OUTPUT); 
  pinMode(LED_ROJO_SEMAFORO2, OUTPUT);
  pinMode(LED_VERDE_SEMAFORO2, OUTPUT);
  pinMode(LED_AMARILLO_SEMAFORO2, OUTPUT); 

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

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

void loop(){
  semaforos();
 
  if (irrecv.decode()) {
    Serial.println(irrecv.decodedIRData.decodedRawData, HEX);
    if (irrecv.decodedIRData.decodedRawData == Boton_EQ) {
      eqPressed = true;
      digitalWrite(13,eqPressed);
      oldEqTime = millis();
    }
    else {
      if (eqPressed) {
        eqPressed = false;
        digitalWrite(13,eqPressed);
        switch (irrecv.decodedIRData.decodedRawData) {
          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 (irrecv.decodedIRData.decodedRawData) {
          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); 
            break;
        }
      }
    }
    irrecv.resume();
  }
  if (eqPressed && (millis() - oldEqTime >= EQKEY_EXP)) {
    eqPressed = false; // expiró tiempo espera 2da tecla
    digitalWrite(13,eqPressed);
  }
  //delay (100);
}