Contador de pulsos y tiempo

¡Gracias por leer mi post!

Hola a todos, he estado metido en un proyecto, pero me surge un problema; necesito hacer un contador de pulsos, pero que a su vez detecte el tiempo que lleva sin presionarse, en mi codigo principal necesito poner eso en un bucle externo, pues en ese momento no hace parte del bucle loop, la variable conta no suma, asi pulse muchas veces, no suma, luego termina el tiempo y sale, dejo el codigo que tengo.

int conta = 0; 
int tiempo_corrido=0; int tiempo_necesario= 5000;
int PGM=HIGH; 

void setup() 
{
  Serial.begin(9600);   
  pinMode(2,INPUT);     
}
 
//------------------------------------
//Funcion ciclicla
//------------------------------------

void loop() 
{           
 while(PGM==HIGH) // bucle adicional, este es llamado por otra funcion externa
 {
    delay(1);
    // Si el pulsador esta oprimido
    if(digitalRead(2) == HIGH) 
    {
        // Si el pulsador no esta oprimido, flanco de bajada
        if(digitalRead(2) == LOW)
        {
           conta++;
           Serial.print("Se presion ");//Incrementa el contador
           Serial.println(conta); //Imprime el valor por consola
           delay (100);           // Retardo
           tiempo_corrido =0;
        }
    }
    if(tiempo_corrido == tiempo_necesario)
    {
      Serial.print(conta);
      PGM=LOW;
      break;
    }
    tiempo_corrido++;
 }
 Serial.print("SALIO DEL BUCLE \n");
 delay(1000);
}

Quedo en espera de alguna buena respuesta, gracias

A ver si esto funciona?

int conta            = 0; 
int tiempo_corrido   = 0; 
int tiempo_necesario = 5000;
int PGM              = HIGH; 
bool pulsa;
bool pulsaAnt= false;

void setup() {
  Serial.begin(9600);   
  pinMode(2,INPUT);     
}
 
//------------------------------------
//Funcion ciclicla
//------------------------------------

void loop() {           

 while (PGM) {   // bucle adicional, este es llamado por otra funcion externa
        delay(1);

        // Tomo el valor del pulsador
        pulsa = digitalRead(2);
        if (!pulsa && pulsaAnt) { // SI estoy en flanco de bajada sumo
            conta++;
            Serial.print("Se presion ");//Incrementa el contador
            Serial.println(conta); //Imprime el valor por consola
            // delay (100);           // Retardo 
            tiempo_corrido = 0;
        }
        if (tiempo_corrido >= tiempo_necesario) {
            Serial.print(conta);
            PGM = LOW;
            // tiempo_corrido = 0;  // no debería ponerse a 0?
            break;
        }
        tiempo_corrido++;
 }
 Serial.print("SALIO DEL BUCLE \n");
 delay(1000);
}

Hola, gracias por reponder, te informo que no funcionó, estuve cambiando algunas cosas y cada vez que quito el delay, puedo contar los pulsos, pero no el tiempo, no sé cómo hacerlo, tal vez con millis() pero no sé como funciona, sigo en espera, ¡Gracias!

Explicate un poco mejor.
QUe es lo que ingresa por el pin 2?

Estoy haciendo una programación de un temporizador para un led, es decir, por el pin 2 ingresa el pulsador, por el cual cada vez que yo lo pulse, suma uno, y asi infinitamente, hasta que pasen 5 o 10 segundos sin presionar nada y en ese momento, se salga del bucle, guardando obviamente el dato de las pulsaciones.

Olvidé algo
corrige

void loop() {           

 while (PGM) {   // bucle adicional, este es llamado por otra funcion externa
        delay(1);

        // Tomo el valor del pulsador
        pulsa = digitalRead(2);
        if (!pulsa && pulsaAnt) { // SI estoy en flanco de bajada sumo
            conta++;
            Serial.print("Se presion ");//Incrementa el contador
            Serial.println(conta); //Imprime el valor por consola
            // delay (100);           // Retardo 
            tiempo_corrido = 0;
        }
        pulsaAnt = pulsa;
        if (tiempo_corrido >= tiempo_necesario) {
            Serial.print(conta);
            PGM = LOW;
            tiempo_corrido = 0;  // no debería ponerse a 0?
            break;
        }
        tiempo_corrido++;
 }
 Serial.print("SALIO DEL BUCLE \n");
 delay(1000);
}

surbyte:
Olvidé algo
corrige

void loop() {           

while (PGM) {  // bucle adicional, este es llamado por otra funcion externa
        delay(1);

// Tomo el valor del pulsador
        pulsa = digitalRead(2);
        if (!pulsa && pulsaAnt) { // SI estoy en flanco de bajada sumo
            conta++;
            Serial.print("Se presion ");//Incrementa el contador
            Serial.println(conta); //Imprime el valor por consola
            // delay (100);          // Retardo
            tiempo_corrido = 0;
        }
        pulsaAnt = pulsa;
        if (tiempo_corrido >= tiempo_necesario) {
            Serial.print(conta);
            PGM = LOW;
            tiempo_corrido = 0;  // no debería ponerse a 0?
            break;
        }
        tiempo_corrido++;
}
Serial.print("SALIO DEL BUCLE \n");
delay(1000);
}

Muchas gracias amigo, ya lo probé y funcionó a la perfección muchas gracias por la ayuda, SOLUCIONADO.

GRACIAS<3