//Lucas Trento
//CONTADOR DE FLANCOS DESCENDENTES
//Ajustar la cantidad de destellos de un Blink multidestellos conectado a la salida,
//de modo que coincida con la cantidad de flancos descendentes procesados en la entrada.
//Los flancos deberán procesarse pasado cierto tiempo de ocurrido último.
#define LED_TEST 13
#define CONFIGURAR_LED pinMode(LED_TEST, OUTPUT)
#define ENCENDER_LED digitalWrite(LED_TEST, HIGH)
#define APAGAR_LED digitalWrite(LED_TEST, 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)==HIGH)
#define MS_ESTADO 500
void setup()
{
CONFIGURAR_LED;
CONFIGURAR_SALIDA;
CONFIGURAR_ENTRADA;
}
void loop()
{
Led_Test();
Flancos();
delay(1);
}
void Flancos(void)
{
static bool entrada_activada_ant = 0;
static bool led_encendido=0;
static unsigned long millis_ant=0,millis_tiempo_flancos=0,millis_entrada_activada=0;
static unsigned long tpo_espera=0,tpo_transcurrido=2000;
static unsigned char pulsos_restantes=0;
const unsigned int t_pulso=300, t_pausa=1000;
static int cont_pulsos=1,cont=0;
// Ajustar la cantidad de destellos de un Blink multidestellos conectado a la salida,
//de modo que coincida con la cantidad de segundos transcurridos
// entre un flanco ascendente y descendente en la entrada.
/* if(cont)
{
if(millis() - millis_tiempo_flancos > tpo_transcurrido)
{
cont_pulsos=cont;
cont=0;
}
}*/
/* if(cont)
{
if((millis()- millis_entrada_activada)%1000==0) cont++;
}*/
if(ENTRADA_ACTIVADA)
if(millis()- millis_entrada_activada > 1000)
{
cont++;
millis_entrada_activada=millis();
}
if(millis() - millis_ant > tpo_espera )
{
millis_ant = millis();
{
if(led_encendido)
{
pulsos_restantes--;
if(pulsos_restantes) tpo_espera=t_pulso;
else tpo_espera=t_pausa;
}
else
{
if(!pulsos_restantes)
{
pulsos_restantes=cont_pulsos;
}
tpo_espera=t_pulso;
}
led_encendido=!led_encendido;
if(led_encendido) ACTIVAR_SALIDA;
else DESACTIVAR_SALIDA;
}
}
// flanco ascendente
if(ENTRADA_ACTIVADA == entrada_activada_ant) return;
entrada_activada_ant = ENTRADA_ACTIVADA;
if(!ENTRADA_ACTIVADA)
{
cont_pulsos=cont;
cont=0;
return;
}
millis_entrada_activada=millis();
}
void Led_Test(void)
{
static bool estado=0;
static unsigned long millis_ant=0;
if(millis()-millis_ant < MS_ESTADO) return;
millis_ant=millis();
estado = !estado;
if(estado) ENCENDER_LED;
else APAGAR_LED;
}