Dudas con mantener una función sin pausar el loop

cas6678:
a) Si hay contacto debes guardar la hora, si no lo hay nada. De esta manera siempre tendras la hora del ultimo contacto.

Lo que dice cas6678 es la solución para saber cuando dejar de soplar.

Se puede estar a la espera de que “aparezca” una pieza. Una vez aparezca se guarda ese instante y puede esperar un tiempo a que avance antes de activar el soplador para así no expulsar algunas de las piezas que la preceden (piezas 2 y 3 de la imagen que has puesto). La pieza 5 sería expulsada por seguridad (dependería del tiempo de espera que se le ponga).

A la vez hacemos lo que propone cas6678 y guardamos en qué instante se ha detectado una pieza siempre que se detecte. Mientras se esté detectando se estará actualizando ese tiempo. Si se está soplando, se esperará a que transcurra, desde la última detección, el tiempo de espera de inicio de soplado y el tiempo mínimo que ha de estar soplando. Una vez transcurrido todo ese tiempo se deja de soplar y vuelve a la espera de detectar una nueva pieza.

Si mientras está soplando se vuelve a detectar una pieza, se vuelve a tomar como referencia ese instante hasta que deje de detectarla. Entonces ha de transcurrir todo el tiempo de espera a partir de ese último instante para que pare de soplar. Esto significa que se descartan las piezas buenas que estén entre dos piezas malas que aparezcan muy juntas.

Para implementarlo he usado dos máquinas de estado. Una para detectar la pieza “con seguridad” y evitar los falsos positivos de los que hablas. Para ello controla el “antirebote” de la señal del sensor.

La otra máquina de estados controla el soplador, según se detecte o no una pieza por la otra máquina de estados y acorde a los tiempos deseados.

Para “afinar y poner a punto” el sistema, se han de configurar tres constantes que definen tres tiempos.

TIEMPO_ANTIREBOTE

define cual es el tiempo mínimo que ha de estar la señal de entrada sin cambiar para dar por bueno que hay una pieza a descartar. Si el tiempo es muy corto puede dar muchos falso positivos, pero si es muy grande puede no detectar ninguna pieza. Yo he puesto 50 milisegundos.

TIEMPO_ESPERA_INICIO_SOPLADO

define cuánto tiempo ha de esperar entre que detecta inicialmente una pieza para empezar a soplar (para descartar la menor cantidad posible de piezas buenas). Le he puesto 2 segundos.

TIEMPO_DURACION_SOPLADO

define cual es tiempo mínimo que ha de estar soplando. Este tiempo se suma al

TIEMPO_ESPERA_INICIO_SOPLADO

y el total es el tiempo que ha de transcurrir entre que se deja de detectar la última pieza y se procede a apagar el soplador. Le he puesto 3 segundos.

Debido a que el código no me cabe junto con estos comentarios, lo adjunto.

El código está comentado. Cualquier duda, no dudes en preguntar.

foro_soplador.ino (7.09 KB)