Hola y buenas a todos!
Soy nuevo en el foro y vengo a pediros algo de ayuda en un problema que por ahora no encuentro solución.
Estoy llevando a cabo un contador de vueltas, o laptimer, que es disparado por la interrupción 0 del Arduino (estoy probando con el UNO). El caso es que quiero que haya un tiempo "oscuro" en el que el laptimer no cuente la vuelta (en el código de ejemplo si el tiempo es menor de 10 segundos, desactivo la interrupción y no dispara el contador).
El problema que encuentro es que si en el "tiempo oscuro" hay un flanco de bajada en el pin de la interrupción, lo que me hace es que me lo guarda, y justo en cuanto ha pasado el "tiempo oscuro", que en el ejemplo son 10 segundos, me dispara otra vez la interrupción, de manera que cuenta otra vuelta con el tiempo exacto del tiempo oscuro.
Os dejo el código a ver si vosotros veis que es lo que estoy haciendo mal:
volatile int minutos = 0;
volatile int segundos = 0;
volatile int decimas = 0;
long milisegundos = 0;
int boton = 2;
volatile int i = 0;
volatile int minutosvr= 59;
volatile int segundosvr = 59;
volatile int decimasvr=999;
unsigned int t_oscuro = 10000; //Tiempo de oscuridad de 10 segundos
unsigned long lastmillis = 0;
boolean interrupt_activ;
void setup(){
Serial.begin(9600);
pinMode(boton, INPUT);
digitalWrite(boton, HIGH);
}
//Restart button
void reinicio(){
i = i++;
if(minutos<minutosvr || minutos==minutosvr && segundos<segundosvr || minutos==minutosvr && segundos==segundosvr && decimas<decimasvr){
minutosvr= minutos;
segundosvr = segundos;
decimasvr= decimas;
}
minutos=0;
segundos=0;
decimas=0;
lastmillis = millis();
}
void loop(){
if (millis()-lastmillis > t_oscuro){ //Si ya ha pasado el tiempo de oscuridad
if (interrupt_activ == false){ //Volvemos a activar la interrupción
attachInterrupt(0, reinicio, FALLING);
interrupt_activ = true;
}else if (interrupt_activ == true){ //Si la interrupción está activada esperamos a que salte
}
}else if (millis()-lastmillis <= t_oscuro){ //Si no ha pasado el tiempo de oscuridad
if (interrupt_activ == true){
detachInterrupt(0); //Desactivamos la interrupción
interrupt_activ = false;
}else if(interrupt_activ == false){}
}
milisegundos = millis();
if(milisegundos % 100 == 0){ //Only enter if it has passed tenth of a second
decimas++;
if(decimas == 10){ //When it has passed 10 tenths of a second it count one second
decimas = 0;
segundos++;
}
if(segundos == 60){ //When it has passed 60 seconds it count one minute
segundos = 0;
minutos++;
}
//Imprimir por pantalla
if(minutos < 10){
Serial.print("0");
}
Serial.print(minutos);
Serial.print(":");
if(segundos < 10){
Serial.print("0");
}
Serial.print(segundos);
Serial.print(":");
Serial.print(decimas);
Serial.print(" ");
if(minutosvr < 10){
Serial.print("0");
}
Serial.print(minutosvr);
Serial.print(":");
if(segundosvr < 10){ //tiempo vuelta rápida
Serial.print("0"); //tiempo vuelta rápida
} //tiempo vuelta rápida
Serial.print(segundosvr); //tiempo vuelta rápida
Serial.print(":"); //tiempo vuelta rápida
Serial.print(decimasvr); //tiempo vuelta rápida
Serial.print(" "); //tiempo vuelta rápida
Serial.print(i); //número de vueltas completadas
Serial.print(" ");
Serial.print(milisegundos);
Serial.print(" ");
Serial.println(interrupt_activ);
}
}
Muchas gracias por la ayuda!