//*****************************************
//********* _6_Puerta_Codificada **********
//*****************************************
// Original code by canalplc
// http://canalplc.blogspot.com.es/
// Version 1.0
// July 2016
//*****************************************
//
#include <PC_SIMU.h>
PC_SIMU PLC;
char CODIGO[6] = {"     "};
char CLAVE[6]={"54321"};
int CONTADOR = 0;
int TIEMPO_CLAVE = 0;
bool PUL_1 = 0;
bool PUL_1_ANT = 0;
bool PUL_2 = 0;
bool PUL_2_ANT = 0;
bool PUL_3 = 0;
bool PUL_3_ANT = 0;
bool PUL_4 = 0;
bool PUL_4_ANT = 0;
bool PUL_5 = 0;
bool PUL_5_ANT = 0;
bool CIERRA_PUERTA = 0;
bool FIN = 0;
bool INICIO = 0;
void setup() {
  pinMode(2, INPUT); // Pulsador 1
  pinMode(3, INPUT); // Pulsador 2
  pinMode(4, INPUT); // Pulsador 3
  pinMode(5, INPUT); // Pulsador 4
  pinMode(6, INPUT); // Pulsador 5
  pinMode(7, INPUT); // FC Puerta cerrada
  pinMode(8, INPUT); // FC puerta abierta
  pinMode(9, OUTPUT); // Abrir puerta.
  pinMode(10, OUTPUT); // Cerrar puerta.
  pinMode(11, OUTPUT); // LED Verde
  pinMode(12, OUTPUT); // LED Rojo
  digitalWrite(9, 0);
  digitalWrite(10, 0);
  digitalWrite(11, 0);
  digitalWrite(12, 0);
  //
  PLC.INI(); 
  CONTADOR = 0;
}
void loop() {
  PUL_1 = digitalRead(2);
  if(PUL_1 == 1 && PUL_1_ANT == 0)
  {
    LEER_CODIGO(); 
  }
  PUL_1_ANT = PUL_1;
  PUL_2 = digitalRead(3);
  if(PUL_2 == 1 && PUL_2_ANT == 0)  
  {
    LEER_CODIGO(); 
  }
  PUL_2_ANT = PUL_2;
  PUL_3 = digitalRead(4);
  if(PUL_3 == 1 && PUL_3_ANT == 0)
  {
    LEER_CODIGO(); 
  }
  PUL_3_ANT = PUL_3;
  PUL_4 = digitalRead(5);
  if(PUL_4 == 1 && PUL_4_ANT == 0)
  {
    LEER_CODIGO(); 
  }
  PUL_4_ANT = PUL_4;
  PUL_5 = digitalRead(6);
  if(PUL_5 == 1 && PUL_5_ANT == 0)
  {
    LEER_CODIGO(); 
  }
  PUL_5_ANT = PUL_5;
  if(CONTADOR >= 5)
  {
    if(CODIGO[0] == CLAVE[0] && CODIGO[1] == CLAVE[1] && CODIGO[2] == CLAVE[2] && CODIGO[3] == CLAVE[3] && CODIGO[4] == CLAVE[4])
    {
      // Clave valida
      if(FIN == 0) PUERTA();
      else RESET();
    }
    else NO_VALIDA();
  }
  else
  {
    if(INICIO == 1)
    {
      TIEMPO_CLAVE++;
      if(TIEMPO_CLAVE >= 15000) NO_VALIDA();
    }
  }
}
void LEER_CODIGO(){
  if(CONTADOR == 0)
  {
   if(digitalRead(2) == 1)CODIGO[0] = '1';  
   if(digitalRead(3) == 1)CODIGO[0] = '2'; 
   if(digitalRead(4) == 1)CODIGO[0] = '3'; 
   if(digitalRead(5) == 1)CODIGO[0] = '4'; 
   if(digitalRead(6) == 1)CODIGO[0] = '5'; 
  }
  if(CONTADOR == 1)
  {
   if(digitalRead(2) == 1)CODIGO[1] = '1';  
   if(digitalRead(3) == 1)CODIGO[1] = '2'; 
   if(digitalRead(4) == 1)CODIGO[1] = '3'; 
   if(digitalRead(5) == 1)CODIGO[1] = '4'; 
   if(digitalRead(6) == 1)CODIGO[1] = '5'; 
  }
  if(CONTADOR == 2)
  {
   if(digitalRead(2) == 1)CODIGO[2] = '1';  
   if(digitalRead(3) == 1)CODIGO[2] = '2'; 
   if(digitalRead(4) == 1)CODIGO[2] = '3'; 
   if(digitalRead(5) == 1)CODIGO[2] = '4'; 
   if(digitalRead(6) == 1)CODIGO[2] = '5'; 
  }
  if(CONTADOR == 3)
  {
   if(digitalRead(2) == 1)CODIGO[3] = '1';  
   if(digitalRead(3) == 1)CODIGO[3] = '2'; 
   if(digitalRead(4) == 1)CODIGO[3] = '3'; 
   if(digitalRead(5) == 1)CODIGO[3] = '4'; 
   if(digitalRead(6) == 1)CODIGO[3] = '5'; 
  }
  if(CONTADOR == 4)
  {
   if(digitalRead(2) == 1)CODIGO[4] = '1';  
   if(digitalRead(3) == 1)CODIGO[4] = '2'; 
   if(digitalRead(4) == 1)CODIGO[4] = '3'; 
   if(digitalRead(5) == 1)CODIGO[4] = '4'; 
   if(digitalRead(6) == 1)CODIGO[4] = '5'; 
  }
  INICIO = 1;
  CONTADOR++;
}
void PUERTA(){
  // Abre puerta
  if(digitalRead(8) == 0 && CIERRA_PUERTA == 0)
  {
    digitalWrite(9, 1);  
    digitalWrite(11, 1);    
  }
  else
  {
    digitalWrite(9, 0);  
    delay(2000);
    // Cierra puerta
    digitalWrite(11,0); 
    digitalWrite(10, 1);  
    digitalWrite(12,1);  
    CIERRA_PUERTA = 1;  
  }
  if(digitalRead(7) == 1 && CIERRA_PUERTA == 1)
  {
    digitalWrite(10, 0);  
    digitalWrite(12,0); 
    CIERRA_PUERTA = 0; 
    FIN = 1; 
  }
}
void NO_VALIDA(){
      digitalWrite(12, 1);
      delay(800);
      digitalWrite(12, 0);
      delay(800);
      digitalWrite(12, 1);
      delay(800);
      digitalWrite(12, 0);
      RESET();
}
void RESET(){
  CODIGO[0] = ' ';
  CODIGO[1] = ' ';
  CODIGO[2] = ' ';
  CODIGO[3] = ' ';
  CODIGO[4] = ' ';
  TIEMPO_CLAVE = 0;
  CONTADOR = 0;
  INICIO = 0;
  FIN = 0;
}

    
