/*Librerias*/
#include <Arduino.h>
#include <RCSwitch.h> //Libreria para control remoto.
/*Definiciones Entradas y Salidas */
const int sirena = 13,
          abrirBaul = 12,
          luzCortecia = 11,
          alertaIluminacion = 10,
          cerrarSeguros = 9,
          abrirSeguros = 8,
          ignicion = 7,
          velocidad = 6,
          botonValet = 5,
          pulsadorCapo = 4,
          pulsadorPuertas = 3,
          controlRadio = 2,
          subirVentanas = A4,
          bajarVentanas = A5;
RCSwitch mySwitch = RCSwitch();
/*Variables y Constantes*/
char comandos;
bool estadoIgnicion = 0,            // 0(Apagado) / 1(Prendido)
    estadobotonValed = 0,
    estadopulsadorCapo = 0,         // 0(Abierto) / 1(Cerrado)
    estadopulsadorPuertas = 0,      // 0(Abierto) / 1(Cerrado)
    armadoAutomatico = 0,
    armadoAlarma = 0,
    flagAlarma = 0,
    flagIluminacion = 0,
    flagSirena = 0,
    flagSeguros = 0,
    flagArmado = 0,
    estadoSirena = LOW;
long estadoControl = 0;
int estadoVelocidad = 0,
    contSirena = 0,
    blinkSirena = 0;
/* Temporizador (Millis) */
unsigned long tiempoInicial1;                         //Tiempo desactivacion de seguros
const unsigned long tiempoFuncional1 = 700;           //Tiempo desactivacion de seguros
unsigned long tiempoInicial2;                         // Tiempo Alerta iluminacion
const unsigned long tiempoFuncional2 = 1200;          // Tiempo Alerta iluminacion
unsigned long tiempoInicial3;                         // Tiempo Sirena
const unsigned long tiempoFuncional3 = 100;           // Tiempo Sirena
unsigned long tiempoInicial4;                         // Armado Automatico Alarma
const unsigned long tiempoFuncional4 = 10000;         // Armado Automatico alarma
unsigned long tiempoInicial5;                         // Activacion de Sirena y luces
const unsigned long tiempoFuncional5 = 10000;         // Activacion de Sirena y luces
void setup()
{
  Serial.begin(115200);
  pinMode(sirena, OUTPUT);
  pinMode(abrirBaul, OUTPUT);
  pinMode(luzCortecia, OUTPUT);
  pinMode(alertaIluminacion, OUTPUT);
  pinMode(cerrarSeguros, OUTPUT);
  pinMode(abrirSeguros, OUTPUT);
  pinMode(subirVentanas, OUTPUT);
  pinMode(bajarVentanas, OUTPUT);
  pinMode(ignicion, INPUT);
  pinMode(velocidad, INPUT);                        // Comprobar si es posible incluirlo
  pinMode(botonValet, INPUT);                       // Posiblemente NO
  pinMode(pulsadorCapo, INPUT);
  pinMode(pulsadorPuertas, INPUT);
  pinMode(controlRadio, INPUT);
  mySwitch.enableReceive(0);                        // pin 2 para control
}
void lecturaDatos()
{
  if (Serial.available() > 0)
  {
    comandos = Serial.read();
  }
  if (mySwitch.available())
  {
    estadoControl = mySwitch.getReceivedValue();
    if (estadoControl == 0)
    {
      Serial.println("error de codigo");
    }
    {
      Serial.print("codigo Recibido ");
      Serial.println(estadoControl);
    }
    mySwitch.resetAvailable();
  }
}
void pulsadores()
{
  estadoIgnicion = digitalRead(ignicion);
  estadoVelocidad = digitalRead(velocidad);
  estadobotonValed = digitalRead(botonValet);
  estadopulsadorCapo = digitalRead(pulsadorCapo);
  estadopulsadorPuertas = digitalRead(pulsadorPuertas);
}
void estadoSeguros(int estadoPuertas)
{
  digitalWrite(estadoPuertas, HIGH);

  tiempoInicial1 = millis();
  tiempoInicial2 = millis();
  flagSeguros = 1;
  if (estadoIgnicion == 0)
  {
    digitalWrite(alertaIluminacion, HIGH); // En caso de utilizar señal negativa para encender relay como alternativa utilizar un blink
    flagIluminacion = 1;
    flagSirena = 1;
  }
}
void loop()
{
  lecturaDatos();
  pulsadores();

  /*Control Automatico*/
  /*Armado Automatico 30 segundo */
  if ((estadoIgnicion == 0) && (estadoIgnicion == 0) && (armadoAutomatico == 0) && (estadopulsadorPuertas == 1) && (estadopulsadorCapo == 1))
  {
    if (millis() - tiempoInicial4 >= tiempoFuncional4)
    {
      estadoSeguros(cerrarSeguros);
      armadoAutomatico = 1; // Para evitar que se vuelva armar la alrma cada cierto tiempo.
      flagSirena = 3;       // Sonidos Armado de la Alarma.
      contSirena = 0;
    }
  }
  if ((estadopulsadorPuertas == 0) || (estadopulsadorCapo == 0) || (estadoIgnicion == 1)) // Mientras las puertas esten abiertas o el vehiculo encendido
  {
    tiempoInicial4 = millis();
  }
  if ((armadoAutomatico == 1) && ((estadopulsadorPuertas == 0) || (estadopulsadorCapo == 0)||(estadoIgnicion == 1))) // Alarma por apertura de puertas o capo
  {
    digitalWrite(sirena, HIGH);
    digitalWrite(alertaIluminacion, HIGH);
    flagAlarma = 1;
    tiempoInicial5 = millis();
  }
  /*Control Manual */
  // Radio control y comando bluetooth
  if (((estadoControl == 34) || comandos == 't') && (flagSeguros == 0)) // Comando y codigo para abir puertas
  {
    estadoSeguros(abrirSeguros);
    if (estadoIgnicion == 0)
    {
      armadoAutomatico = 0;
      blinkSirena = 3;
      contSirena = 0;
      tiempoInicial4 = millis();
    }
  }
  if (((estadoControl == 11227986) || comandos == 'c') && (flagSeguros == 0)) // Comando y codigo para cerrar puertas
  {
    estadoSeguros(cerrarSeguros);
    if (estadoIgnicion == 0)
    {
      blinkSirena = 2;
      contSirena = 0;
      armadoAutomatico = 1;
    } 
  }
  if (((estadoControl == 11227988) || comandos == 'b') && (flagSeguros == 0)) // Comando y codigo para abir el baul
  {
    estadoSeguros(abrirBaul);
    if (estadoIgnicion == 0)
    {
      blinkSirena = 4;
      contSirena = 0;
    }
  }
  if ((flagSeguros == 1) && (millis() - tiempoInicial1 >= tiempoFuncional1)) // Desactivacion pines de seguros
  {
    digitalWrite(abrirSeguros, LOW);
    digitalWrite(cerrarSeguros, LOW);
    digitalWrite(abrirBaul, LOW);
    flagSeguros = 0;
  }
  if ((flagIluminacion == 1) && (millis() - tiempoInicial2 >= tiempoFuncional2)) // Desactivacion pines de alerta iluminacion
  {
    digitalWrite(alertaIluminacion, LOW);
    flagIluminacion = 0;
  }
  if ((flagSirena == 1) && (contSirena < blinkSirena)) // Blink Sirena (Optimizar si se puede)
  {
    if (millis() - tiempoInicial3 >= tiempoFuncional3)
    {
      tiempoInicial3 = millis();

      if (estadoSirena == LOW)
      {
        estadoSirena = HIGH;
      }
      else
      {
        estadoSirena = LOW;
        contSirena++;
      }
    }
    digitalWrite(sirena, estadoSirena);
  }
  if ((flagAlarma == 1) && (millis() - tiempoInicial5 >= tiempoFuncional5))
  {
    digitalWrite(sirena, LOW);
    digitalWrite(alertaIluminacion, LOW);
    flagAlarma = 0;
  }
  estadoControl = 0; // Limpieza de variables
  comandos = ' ';    // Limpieza de variables
}
/*
Azul Amarillo = 12v
Blanco Negro = GND
Rosado verde = Sirena (+)
Rojo blanco = Detector de puertas y luz de cortecia
Morado amarillo = Pulsador de capo (-)
Azul rojo = Abre seguros (-)
Verde amarillo = Cierra seguros (-)
Amarillo verde = Señal de parada (-)
Negro amarillo = Ignición (+)
Verde rojo = Horn (-)
Rojo blanco = Luz de cortecia baúl (-)
Azul negro = Detector de llave (-)
Violeta blanco Velocidad ECU (+)
*/
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module