CCCPaste

Detonador_Benja

/* Programador: Benja Berterreix
 * Ejercicio: Detonador.
 * Objetivo: Activar la salida luego de cierto tiempo de detectado el flanco descendente en la entrada. Desactivar la salida al detectar el flanco ascendente.
https://pastebin.com/0yFDVZgs
 */

//Led Test
#define PIN_LED             13
#define CONFIGURAR_LED      pinMode(PIN_LED, OUTPUT)
#define ENCENDER_LED        digitalWrite(PIN_LED, HIGH)
#define APAGAR_LED          digitalWrite(PIN_LED, LOW)

//Salida
#define PIN_SALIDA          12
#define CONFIGURAR_SALIDA   pinMode(PIN_SALIDA, OUTPUT)
#define ACTIVAR_SALIDA      digitalWrite(PIN_SALIDA, HIGH)
#define DESACTIVAR_SALIDA   digitalWrite(PIN_SALIDA, LOW)

//Entrada
#define PIN_ENTRADA         7
#define CONFIGURAR_ENTRADA  pinMode(PIN_ENTRADA, INPUT)
#define ENTRADA_ACTIVADA    digitalRead(PIN_ENTRADA)

void setup() {
  CONFIGURAR_LED;
  CONFIGURAR_SALIDA;
  CONFIGURAR_ENTRADA;
  Serial.begin(9600);
}

void loop() {
  LedTest();
  Detonador();
  delay(1);
}

void Detonador(void){
  static unsigned long t_ini, millis_cont=0;
  static bool salida = 0, entrada_ant = 0, armada = 0;
  const static int countdown = 3;
  static unsigned long cont = 0;

  // cuando la cuenta termina, activa la salida
  if(armada){
    if( millis()- millis_cont > 1000)
      {
      millis_cont=millis();
      Serial.println(cont--); //3...2...1.
      }
    //Queremos que muestre la cuenta regresiva countdown - 
    if(millis() - t_ini < countdown*1000)  return;
 
    ACTIVAR_SALIDA;
    armada = 0;
  }
    
  // si no apreto nada, me voy
  if(ENTRADA_ACTIVADA == entrada_ant) return;
  entrada_ant = ENTRADA_ACTIVADA;
  
  // cuando se suelta el boton, comienza la cuenta regresiva
  if(!ENTRADA_ACTIVADA){
    t_ini = millis();
    armada = 1;
    cont=countdown;
    return;
  }
  
  // si se apreta el boton, desactiva la salida
  if(ENTRADA_ACTIVADA){
    armada = 0;
    DESACTIVAR_SALIDA;
    Serial.println(armada? "- Armada -" : "- Desarmada -");
  }
}

void LedTest(void){
  static bool encender_led=0;
  static unsigned long millis_ant=0;
 
  if(millis()-millis_ant < 500) return;
  millis_ant=millis();
 
  //Invertir el estado del led
  encender_led = !encender_led;
 
  if(encender_led)  ENCENDER_LED;
  else              APAGAR_LED;
}