Problema con pulsaciones de boton

Buenas tardes a todos

Soy muy nuevo en esto y en mi condicion de tal me voy encontrando con diferentes problemas que , con mayor o menor dificultad, voy sorteando

Me he encotrado actualmente con un problema al que no le encuentro la solucion y queria pedirles su ayuda a ver si pueden orientarme

Lo que necesito hacer es que cuando presiono 5 veces seguidas el boton (5 pulsos de 0,5s de duracion y con un lapso entre pulsos de otros 0,5s) se ejecute un determinado codigo (poner un pin en alta)

Pero con ese mismo pulsador, si se presiona de manera constante por mas de medio segundo se ejecute otro codigo (eviar PWM por un pin)

Y si vuelvo a presionar 5 veces seguidas el pulsador se ejecute otro codigo (poner el pin en baja)

Entiendo que esto deberia hacerlo con pulseIn, pero realmente no puedo encontrar la logica para hacerlo.

Todo el resto del codigo lo tngo resueslto, pero sigo dando vueltas con este tema

Si alguien seria tan amable de tirarme una soga estaria agradecido

Buenas:

¿Puedes poner tu código sobre lo que haz hecho hasta ahora?

Saludos.

Por supuesto

Espero se entienda, cualquier critica o comentarios sobre el resto del codigo tambien es bienvenida

int pulsador = 0;
unsigned long t;
void setup()
{
  pinMode(2, INPUT);
  pinMode(A1, INPUT);
  pinMode(5, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(A0, INPUT);
  t = millis();
}

void loop()
{
  
  while (digitalRead(2) == HIGH) {
   
    if ( millis() - t <= 1000 ) {
      if (analogRead(A1) * (0.0048895 / 0.2485) < 6.4) {
        do {
          digitalWrite(5, LOW);
          digitalWrite(7, LOW);
          digitalWrite(4, HIGH);
          
        } while (digitalRead(2) == HIGH);
      } else {
        analogWrite(5, map(analogRead(A0), 0, 1023, 0, 255));
        digitalWrite(7, HIGH);
        
      }
    }  else {
       digitalWrite(7, LOW);
       digitalWrite(5, LOW);
       digitalWrite(4, HIGH);
       delay(500);
       digitalWrite(4, LOW);
       delay(500);
    }
   
   
    }
    t = millis();
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(7, LOW);
    
 }

Hola:

Solo te falta corregir o codear la parte de los antirrebotes de los pulsadores o botones en el programa.

Pulsadores y antirrebote con Arduino

Saludos.

@etileno, dónde cuentas con tu código 5 veces?

Perdon, lo que puse es el codigo de la parte donde se mantiene el pulsador presionado. Me falta todo el resto. No puse nada porque mis intentos dueron inutiles

He encontrado este codigo, que si bien cuenta los pulsos a la perfeccion, cuando intento usarlo junto con mi codigo no funciona y la verdad es que no termino de entenderlo tampoco

#define PIN_IR  2
#define INTERVALO    500         

bool estado, estado_ant = false; 
bool flag = false;
byte contador = 0;   
int start;
bool estadoOn = false;
void setup(){
    Serial.begin(9600);
}

void loop() {

  
  
    estado = digitalRead(PIN_IR);
    if (estado && !estado_ant) { 
       contador +=1;
       start = millis();                
       flag = true;
    }
    estado_ant = estado;          
    if (millis() - start > INTERVALO) {
       
        if (flag) {
            
          if (contador==5) {
            estadoOn = !estadoOn;
           
            
          }
            flag = false;                 
          
            
          
          
        }
        contador = 0;                     
    }
  
  if (estadoOn) {
    goto marca2;
  } else {
    goto marca1;
  }
  marca1:;
  Serial.println("Disparo");
  goto Hecho;
  marca2:;
  Serial.println("No Disparo");
  Hecho:;

Con este codigo que encontre creo que puede estar la solucion. Trate de reemplazar el serial print que dice "Disparo" con mi codigo, pero no funciono

Espero alguno pueda indicarme si estoy en el buen camino

Gracias