/* 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;
}