Problema con Gatillo y DfPlayer Mini

Buenas tardes a todos, estoy teniendo problemas tratando de hacer un tipico “Gatilleo” en el que al pulsar el boton y mantenerlo, este mantiene la musica mientras lo apriete y se acabe cuando lo suelte.

Pero en lugar de eso consigo un Loop ya sea de silencio que al soltar el boton permite reproducir el audio probando este codigo:

int pulsador=0; //almacena el estado del botón
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>

//** Programa **//
void setup() {
pinMode(2, OUTPUT); //declaramos el pin 2 como salida
pinMode(4, INPUT); //declaramos el pin 4 como entrada
Serial.begin (9600);
mp3_set_serial (Serial); //set Serial for DFPlayer-mini mp3 module
delay(1); // delay 1ms to set volume
mp3_set_volume (30); // value 0~30
}

void loop() {
pulsador = digitalRead(4); //lee el estado del botón
if(pulsador==HIGH) { //si el estado es pulsado
mp3_play (1);
}
else{ //si el estado es no pulsado
}

}

O Un Loop de la musica repitiendo una y otra y otra mientras mantengo pero sigue por mas que suelte el boton hasta que termine la musica:

int pulsador=0; //almacena el estado del botón
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>

//** Programa **//
void setup() {
pinMode(2, OUTPUT); //declaramos el pin 2 como salida
pinMode(4, INPUT); //declaramos el pin 4 como entrada
Serial.begin (9600);
mp3_set_serial (Serial); //set Serial for DFPlayer-mini mp3 module
delay(1); // delay 1ms to set volume
mp3_set_volume (30); // value 0~30
}

void loop() {
pulsador = digitalRead(4); //lee el estado del botón
if(pulsador==HIGH) { //si el estado es pulsado
mp3_play (1);
delay (7000);
}
else{ //si el estado es no pulsado
}

}

Estoy haciendo algo mal?

PD: Esta es la Pagina del DFPlayer en todo caso:
http://www.dfrobot.com/wiki/index.php/DFPlayer_Mini_SKU:DFR0299

if(pulsador==HIGH) {          //si el estado es pulsado
    mp3_play (1);
  }

Solo para probar, elimina todo lo que tienes con else. Debería sin entiendo bien como funciona, ejecutar mp3_play(1) porque estaba en high y demora hasta terminar de tocar y como mantienese presionado el pulsador, vuelve a hacerlo. A ver si estoy en lo correcto?

surbyte: if(pulsador==HIGH) {          //si el estado es pulsado    mp3_play (1);  }

Solo para probar, elimina todo lo que tienes con else. Debería sin entiendo bien como funciona, ejecutar mp3_play(1) porque estaba en high y demora hasta terminar de tocar y como mantienese presionado el pulsador, vuelve a hacerlo. A ver si estoy en lo correcto?

Algo funciono pero no, Al mantener pulsado ocurre ese Loop que se esta activando una y otra vez y no suena, Pero cuando suelto el boton, El sonido sale normalmente. Eso si, Ahora si lo vuelvo a presionar este se interrumpe y ocurre 1 de 2, O mantiene el Loop si se mantiene apretado o si lo suelto suena de vuelta... Una pequeña mejora si vamos al caso por que interrumpe :) pero no mantiene :confused:

La solución está en algo que no tiene la librería que es el comando 0x11 Repeat play [1:start repeat play][0:stop play] Que te permite repetir un sonido. Deberías implementarlo, agregándoselo a la librería. entonces si presionas el boton lo disparas una vez pero luego si lo mantienes presionado le envias repetir con este comando 0x11 y el 1 lo detienes con 0. en el archivo DFPlayer_mini_mp3.cpp agregas

//0x11 repeat play 1 repeat 0 stop
void mp3_repeat_play (boolean state) {
    mp3_send_cmd (0x11, state);
}

y en DFPlayer_mini_mp3.h

void mp3_repeat_play (boolean state);

void mp3_single_loop (boolean state);

surbyte: La solución está en algo que no tiene la librería que es el comando 0x11 Repeat play [1:start repeat play][0:stop play] Que te permite repetir un sonido. Deberías implementarlo, agregándoselo a la librería. entonces si presionas el boton lo disparas una vez pero luego si lo mantienes presionado le envias repetir con este comando 0x11 y el 1 lo detienes con 0. en el archivo DFPlayer_mini_mp3.cpp agregas

//0x11 repeat play 1 repeat 0 stop
void mp3_repeat_play (boolean state) {
    mp3_send_cmd (0x11, state);
}

y en DFPlayer_mini_mp3.h

void mp3_repeat_play (boolean state);

void mp3_single_loop (boolean state);

Gracias, lo hje integrado a los archivos y lo probare pero como iria en mi codigo por ejemplo? Aun soy algo noob en eso de programar jaja

Prueba-error, mejora la prueba, disminuye el error. intenta usandolo como si fuera mp3_play(1) dentro de la opción que se ejecuta cuando presionas el pulsador y si dejas de presionarlo ejecuta mp3_repeat_play(0) pero hazlo una vez. usa una variable bool que se ponga en true cuando se inicia la repetición y luego cuando dejas de pulsar e intenta ejecutar la opción else, preguntas si esa variable esta en 1, y si lo esta envias el comando para que deje de repetir y seguidamente pones la variable bool en false y dejará de ejecutarse. tal vez debas hacer lo mismo cuando presionas.