Lectura tiempo boton (Solucionado)

Voy a intentar ser conciso... Estoy con un proyecto de mp3 que necesita cuatro botones, tres que al ser presionados realizan una funcion y el cuarto que cuente el tiempo que está presionado para realizar una funcion u otra... el problema es que al introducir el cuarto botón con pulse in, los demás botones no funcionan correctamente, quiero decir si a pulsein le añades el timeout 400000, el resto de los botones solo funcionan dejandoles presionados durante mas de ese tiempo...

Alguien sabe indicarme por donde van los tiros?

Hago copy paste de la parte importante del codigo por que pegarlo todo sería muy largo.

const int button4Pin = 4;
const int button5Pin = 5;
const int button14Pin = 14;


//int button3State = 0;
int button4State = 0;
int button5State = 0;
int button14State = 0;


int vol = 20;

//Declaramos valores tiempo para opcion de boton presionado bajar volumen a 0 pasar pista 
int button3Pin = 3;
unsigned long time;

char count = 0;

void setup() {


  //Inicializa el buttonpin como entrada
  pinMode(button3Pin, INPUT); 
  pinMode(button4Pin, INPUT); 
  pinMode(button5Pin, INPUT); 
  pinMode(button14Pin, INPUT);

// button3State = digitalRead(button3Pin);
 
 time = pulseIn(3,HIGH,500000);  //entiendo que el numero que se indica al lado del high, es lo que espera la placa para responder... Se queda bloqueada, buscaremos solucion.
  
  if (time >0)
    {
      Serial.println(time);
    MP3player.stopTrack();
  
  (count = count + 1);
  
    MP3player.playTrack(count);
  delay (50);
  Serial.print(F("Pista siguiente"));
}
  
 

    
  
 
 
  //si esta presionado mas de tres segundos entonces fade out al sonido, next y sube volumen
//    else {
//      while(vol>=150){
//      MP3player.setVolume(vol = vol +2, vol = vol +2);
//      }
//    }
//       (count = count + 1);
  
//    MP3player.playTrack(count);
//    MP3player.stopTrack();
//    MP3player.setVolume(20);
   
      
    
  
  //comprueba el estado del boton
  button4State = digitalRead(button4Pin);
  
//pasar pista mediante boton
if (button4State == HIGH){
  
 MP3player.stopTrack();
  {
  (count = count - 1);
  
    MP3player.playTrack(count);
  delay (500);
  Serial.print(F("Pista anterior"));
  }
}
   //bajar volumen por boton
    //comprueba el estado del boton
  button5State = digitalRead(button5Pin);
  
  if (button5State == HIGH){
    if (vol<=150){
     // push byte[1] into both left and right assuming equal balance.
     MP3player.setVolume(vol = vol +2, vol = vol +2); // commit new volume
    
      delay (100);
    Serial.print(F("Volume changed to -"));

     Serial.println(F("[dB]"));
   }
    }
   
   button14State = digitalRead(button14Pin);
    if (button14State == HIGH){
      if (vol>=2){
     // push byte[1] into both left and right assuming equal balance.
    MP3player.setVolume(vol = vol -2, vol = vol -2); // commit new volume
  
    Serial.print(F("Volume changed to +"));

     Serial.println(F("[dB]"));
     }
    }
  }

Edito:
He probado a añadir
if button3State == HIGH
A cambiar el button pint de int a cont in... etc... me tiene un poco loco la funcion la verdad... no se si hay algo que se pueda hacer para que solo mida el tiempo del pulso cuando presione el boton 3.

Porque PULSEIN es una función boba, tonta.. hace lo que le pides pero funciona como delay para que veas la analogía.
Si ejecutas delay se detiene tu programa. Si ejecutas PULSEIN con un timeout como el que dices, todo lo demás se queda detenido.
No es el camino apropiado a seguir.
Son herramientas utiles si no existe nada mas.

Yo lo haría con un timer. Ejecuto un timer a 1mseg y le pido que cada vez que se active pregunte el estado de la entrada digital. Si esta en 1 cuento ticks (cuentas del timer)
Digamos que tu pulsador esta presionado 123 mseg pues debería contar mas o menos 122 o 123 ticks. Se ve?

El resto de tu programa lo haces normalmente porque no estas esperando que termine ninguna funcion como pulsein o delay. Olvida usar delay, okay?

delay es para hacer un semáforo.. siempre hace lo mismo. Ahora si haces un semáforo y le pones un botón o pulsador para un no vidente entonces no deberías usar delay.

Aca esta la librería de TimerOne tiene precisión en microsegundos como para leer un boton

#include <TimerOne.h>

volatile unsigned int ticks, AnchoPulso;

void setup(void)
{
  pinMode(button3Pin, INPUT);
  Timer1.initialize(100);                  // inicializado a 100 useg
  Timer1.attachInterrupt(cuentoPulsos); // cuentoPulsos es la rutina que hace el trabajo
  Serial.begin(9600);
  AnchoPulso = 0;
  ticks = 0;
}


void cuentoPulsos(void)
{
    if digitalRead(button3Pin)) 
       ticks++;
    else {
       AnchoPulso = ticks;       
       ticks = 0;
    }
}

void loop(void)
{
  unsigned int AnchoCopy;  // Almacena el valor del Ancho del Pulso 

  // to read a variable which the interrupt code writes, we
  // must temporarily disable interrupts, to be sure it will
  // not change while we are reading.  To minimize the time
  // with interrupts off, just quickly make a copy, and then
  // use the copy while allowing the interrupt to keep working.
  noInterrupts();
  blinkCopy = AnchoPulso;
  interrupts();

  Serial.print("Ancho = ");
  Serial.println((float) AnchoPulso/10);    // expresado en mseg con 1 decimal
  delay(100);                          // no me gusta el delay pero prueba que no afecta el funcionamiento de la rutina timer1.
}

Prueba a ver si funciona mas o menos correctamente.

Gracias pruebo y te comento, me parecía a mi que funcionaba como delay, pero al ser bastante noob no quería desecharla hasta estar seguro.
Gracias!

Al final lo solucioné con un codigo que me ha pasado un amigo, paso a pegarlo a continuación por si a alguien le sirve en el futuro

const int button3Pin = 3;
   int tiempo = 0;
int tiempo2 = 0;
int tiempo3 = 0;

  int button3State = 0;   
   
void setup() {


  //Inicializa el buttonpin como entrada
  pinMode(button3Pin, INPUT); 
void setup()
Serial.begin(115200);
void loop() 
{
button3State = digitalRead(button3Pin);
  
//pasar pista mediante boton
if (button3State == HIGH){
  tiempo=millis();
  while(button3State == HIGH) {
    tiempo2=millis();
    button3State = digitalRead(button3Pin);    
  }
  tiempo3=tiempo2-tiempo;
  Serial.print(tiempo3);
  //1ª posibilidad si está presionado menos de tres segundos next
  if (tiempo3 <= 1500){
  Serial.println("pulsacion corta")
  delay (500);
  }
  if (tiempo3 >= 1501){
 //comprueba el estado del boton Codigo para diferenciar pulsacion corta ->>   pulsacion larga ->> 
   
     
       Serial.print(F("pulsación larga"));
    
   
}
  
    
  
  
  }
}
  
  
}

Para no pegar todo el codigo he puesto solo lo relativo a este problema, si lo usan revisen los cierres y aperturas sobre todo!

Gracias majos!!