Diferenciar entre señal intermitente y señal permanente

Hola Foreros

Buenas tardes, quiero agradecer esto del foro, ya que he podido solucionar bastante cosas y me han salvado jejejje.

ahora necesito de una ayuda especifica y no la he podido encontrar aquí ni en ningún otro foro.

el punto es que necesito diferenciar entre una señal intermitente y una señal permanente, lo interesante es que esta señal viene en un mismo cable.

lo que necesito es que cuando la señal sea intermitente debo tener un led amarrillo encendido y cuando la señal sea permanente debo tener un led rojo encendido y apagar el amarillo

la señal intermitente tiene una frecuencia de 0.5 Hz que varia entre 0 - 5v y la señal queda permanente en 5V

adjunto un pequeño esquema para entender mejor

les agradezco el poder ayudarme

saludos

Posible solución: implentar una máquina de estados. Para ello primero es aconsejable identificar los posibles estados. Yo "veo" seis estados posibles:

Nada: cuando no hay nada y no se ha detectado nada aún, o lo que había "ha desaparecido".

Algo desconocido a nivel alto: cuando de no haber nada la señal de entrada pasa a nivel alto. En ese momento no sabemos aún si es una señal intermitente o si es una señal fija, así que habría que esperar a ver qué sucede.

Algo desconocido a nivel bajo: cuando teníamos una señal alta y aún no sabíamos qué era y ésta pasa a nivel bajo. En principio debería de ser una señal intermitente, pero tal vez fue una fija que se paró o un pulso anómalo. Así que, hasta que no llegue el siguiente pulso y veamos si el periodo era el correcto, no lo damos por bueno.

Señal intermitente a nivel alto: cuando la señal está a nivel alto y ya hemos confirmado que el periodo es el correcto, ni muy corto ni muy largo.

Señal intermitente a nivel bajo: cuando la señal está a nivel bajo y ya hemos confirmado que el periodo es el correcto, ni muy corto ni muy largo.

Señal permanente: cuando detectamos que la señal está a nivel alto más tiempo que el periodo de la señal intermitente.

Hay que diferenciar individualmente los niveles bajo y alto en los casos de "desconocido" y "señal intermitente" porque tendremos que realizar diferentes acciones según la transición de la señal sea en un sentido u otro y según la situación en que nos encontremos.

Para controlar el tiempo de las señales usamos millis(), nada de delay() que nos bloqueen el programa.

Para los estados de la máquina de estados nos valemos un tipo enumerado (enum) por los motivos que explico en esta respuesta del foro Para qué sirve un enum? - #3 by IgnoranteAbsoluto - Software - Arduino Forum

Los pines de entrada y salidas se deben de adaptar al circuito. Por lo pronto los he definido como:

const byte PIN_ENTRADA = 3;
const byte PIN_LED_INTERMITENTE = 4;
const byte PIN_LED_PERMANENTE = 5;

Como soy algo paranoico limito y me cercioro que los pulsos están dentro del periodo que debería dando cierto margen y lo controlo con las dos constantes:

const unsigned long PERIODO_MINIMO = 1900; // Periodo mínimo, en milisegundos, de la señal intermitente a detectar
const unsigned long PERIODO_MAXIMO = 2100; // Periodo máximo, en milisegundos, de la señal intermitente a detectar

... que da para detectar una frecuencia de un rango de entre 0.4756 y 0.5263 Hz. Se pueden cambiar los valores y ajustar según necesidades.

Si se quiere poner un pulsador y hacer las pruebas manualmente, aparte de ampliar el rango del periodo a detectar ya que manualmente es difícil ser tan exactos, para evitar los posibles rebotes del pulsador y que no de "falsos pulsos" que haría que no detectase las señale adecuadamente, recomiendo descomentar la línea:

   // if (instanteActual < 200) return;

Hay que tener en cuenta que no reconoce un único pulso ya que calcula el periodo entre pulsos para saber si está dentro de los límites permitidos detectar. Así que el LED, que indica que hay una señal intermitente, se activa al comienzo del segundo pulso. Y el que detecta una señal permanente lo hace una vez transcurrido el tiempo máximo que puede durar el periodo permitido detectar... Vamos, que los LEDs se activan con "cierto retardo".

El LED de "intermitente" se apaga si el periodo es inferior al permitido o si se supera el periodo máximo.

El LED de "permanente" se apaga en cuanto la entrada pasa a nivel bajo.

Adjunto el programa con la implementación de lo explicado (más o menos). Espero que esto te sirva.

foro_pulso.ino (9.92 KB)

IgnoranteAbsoluto muchas gracias por tu ayuda

lo implementare y editare según necesidad, iré comentando mis avances

saludos