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