Hola a todos,
He hecho este sencillo código que cuenta las pulsaciones a un pulsador durante unos cinco segundos, que se empiezan a contar desde la primera pulsación tras iniciar el loop, si no pulsamos permanecería a la espera. Al final, otorga el resultado del cuenteo por el monitor serial.
Así como, mientras permanece a la espera, se enciende un led auxiliar, y cuando comenzase a contar apaga este y enciende otro.
Hasta aquí todo bien, compila y funciona. Pero...
EL PROBLEMA:
A la 4a o 5a vez que ejecuto el cuenteo, el programa deja de funcionar y sólo se enciende el led auxiliar y, cada vez que activo el pulsador, me arroja un valor 0 por el serial sin comenzar el cuenteo. No entiendo nada, el programa funciona, ¡¡pero sólo durante un tiempo!! ¿¿Puede tener algo que ver con la función millis()??
/* Programa que cuenta las pulsaciones dadas a pulsador durante 5 segundos e imprime por el serial el resultado.
* Además cuenta con dos leds. Uno que se activa cuando comienza la cuenta atrás
* y otro led auxiliar que se queda encendido mientras que el software queda a la espera de que actives la cuenta atrás.
*/
#define LED 2 //led que se enciende durante los 5 segundos durante los que se cuentan las pulsaciones.
#define LEDaux 3 //led que queda encendido mientras el programa está a la espera de que comiences a pulsar.
#define PUL 8 //pulsador
#define PLAZO 5000 //los 5 segundos de plazo para pulsar el botón.
int tiempo; //variable auxiliar para comenzar el cronometro con millis().
int state; //estado del pulsador.
int last; //anterior estado del pulsador.
int cont; //variable para ir contando pulsaciones
void setup() {
Serial.begin (9600);
pinMode (LED, OUTPUT);
pinMode (LEDaux, OUTPUT);
pinMode (PUL, INPUT);
}
void loop() {
state = 0; //vistos los fallos, he preferido iniciar estas variable a 0 al comenzar cada loop.
last = 0;
cont = 0;
digitalWrite (LED, LOW); //dejo los leds en modo de espera.
digitalWrite (LEDaux, HIGH);
while (digitalRead (PUL) == LOW); //mientras no se pulsa, sigue en modo de espera, no hagas nada.
digitalWrite (LED, HIGH); //al abandonar el modo de espera, pon los leds en modo cronometro.
digitalWrite (LEDaux, LOW);
tiempo = millis(); //damos el valor de inicio a la variable tiempo.
while ((millis()-tiempo) < PLAZO){ //mientras que el tiempo no avance más allá del intervalo de 5000 ms:
state = digitalRead (PUL); //comprueba el estado del pulsador.
if(state != last){ //si el estado del pulsador es diferente al anterior comprobado
cont++; //suma un unidad a la variable contadora.
last = state; //actualiza el valor del último estado.
}
}
digitalWrite (LED, LOW); //al acabarse el plazo, apaga el led.
Serial.println (cont/2); //muestra el numero de pulsaciones, que será la mitad de las veces que ha cambiado el valor del pulsador, pues por cada pulsación éste cambiaría dos veces: al pulsar y al soltar.
delay (1000); //dejo un segundo para parar de dar pulsaciones antes de que el sistema vuelva al modo de espera.
}