Funciona sólo los primeros loops ¡¡¿¿??!!

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. 
}

Vale, solucionado.

Estuve buscando sobre pulsadores-contadores y no encontré la respuesta.

Ahora estuve buscando sobre la función 'millis()' y ya he caído en que el problema era que al declarar la variable 'tiempo' como integral ('int'), al pasar más de 32767 milisegundos, no era capaz de almacenar el valor de 'millis()'.

Entiendo que el moderador pasase a eliminar el post por repetitivo. Sorry!!