Esta es una respuesta muy general, pero creo que se aplica a su situación. Lo que estás describiendo es bastante similar a deshacer contactos, ¿verdad? Por supuesto, no mencionó si le importa la entrada que necesita permanecer BAJA durante 2 segundos también, pero llegaré a eso en un momento. Lo bueno de lidiar con los microcontroladores es que muchas de las tareas que usted describe se pueden manejar solo con software.
Permite asumir el caso simple de un entorno de un solo subproceso, lo que significa que todas tus tareas son llamadas en algún punto de un gran ciclo. Esto generalmente se denomina enfoque 'round robin ". Bueno, estoy seguro de que su controlador tiene un método para verificar un sistema de tiempo de milisegundos. Por lo tanto, dentro de una de sus tareas de" round robin ", llamémoslo checkInput (), debe configurar algunas variables "estáticas" (lo que significa que conservan su valor cuando la función regresa y se vuelve a llamar). Una de esas variables se puede llamar "lastState", y se puede establecer inicialmente en 0. También desea otra variable llamada "lastTime" , que por simplicidad también se puede establecer inicialmente en cero.
Entonces, cuando tu programa llama a checkContacts, quieres hacer algo como esto ...
- Lea el estado actual de la entrada GPIO y compárelo con "lastState". Si el estado actual es igual a "lastState", usted "devuelve" el valor de lastState de la función sin hacer nada.
- Suponiendo que el estado actual haya cambiado, a continuación, desea leer el temporizador de milisegundos del sistema en una variable temporal y restar el valor almacenado en lastTime. Usted dijo que quería dos segundos, por lo que si se encuentra que la diferencia es menor a 2000 (2000mS == 2 segundos), nuevamente devuelve 'lastState' y no hace nada.
- si de hecho la diferencia ha alcanzado o sobrepasado los 2000, entonces almacena el valor actual de la entrada GPIO en "lastState", Y almacena el valor actual del temporizador de milisegundos en LastTime. De nuevo, devuelva el valor de "lastState".
Así que ahora, checkInput () siempre devuelve el estado de entrada calificado por el tiempo. Solo querrás asegurarte de que se llame con la frecuencia suficiente para el nivel de precisión que consideres aceptable.
Hay varias cosas buenas acerca de este arreglo. Además de que no requiere hardware adicional, su temporizador de 2000 mS es fácil de modificar y puede ajustarlo para que funcione de manera diferente dependiendo de la transición. Por ejemplo, usted dijo que desea que la entrada solo registre "ALTO" cuando ha sido así durante 2 segundos, pero puede tener fácilmente un tiempo diferente para el caso inverso (tal vez no desee ninguna repetición a menos que la entrada haya sido baja durante 20 segundos!). Otra cosa buena es que el pin GPIO no siempre tiene que ser una entrada. Por ejemplo, tengo un sistema donde cada botón tiene un LED que indica que se presionó el último botón, y ese LED se alimenta con las mismas líneas GPIO que utilizo para detectar las presiones de los botones. Todo lo que tengo que hacer es configurar los pines GPIO como "entradas" cuando entro en mi función, reviso mis estados y luego restauro los GPIO para que sean salidas antes de que regrese. En pocas palabras, una solución de software únicamente le ofrecerá la máxima flexibilidad y el menor número de piezas.