Quiero leer el estado de un sensor de interruptor (contacto magnético). Estoy pensando en conectar el interruptor entre un pin de interrupción de mi micro y tierra, escuchando el estado de CAMBIO. De esta manera tengo problemas de rebote, así que me pregunto cuál es la mejor manera de lidiar con este problema:
1 - Deshabilite la escucha de interrupción cuando se dispara y habilítela después de que el programa haya leído el valor (0 ->tierra->interruptor cerrado O 1->flotante->interruptor abierto) No creo que un estado flotante pueda ser bueno, pero si configuro el pin de entrada de interrupción como INPUT_PULLUP, ya no flota y podría ser bueno, ¿verdad?
2 - Conectar el interruptor a un pin de interrupción y también a un pin de entrada digital a través de un transistor como interruptor. De esta manera, cuando se dispara la interrupción, leo el valor del pin de entrada digital. Por otro lado, de esta manera complico el circuito.
3 - Para usar un circuito antirrebote de hardware
¿Son válidas estas tres soluciones? ¿Hay alguno mejor que estos?
MÁS CONTEXTO: estoy usando estos interruptores como interruptor de límite para una puerta de garaje. En mi código, estoy usando un temporizador para levantar la puerta del garaje durante diez segundos O hasta que se active la interrupción del interruptor de límite
EDITAR: con un cambio en mi código resolví el problema usando interrupciones. Sin embargo, sugiere usar el sondeo ya que no es una aplicación en tiempo real, así que me pregunto: ¿no es mejor usar interrupciones para que pueda usar un modo seguro de energía para mi micro y despertarlo solo cuando una interrupción de hardware? se desencadena? Si uso una solución de sondeo, el sistema no sería adecuado para el suministro de energía de la batería; ¿no es así?
La verdadera respuesta es que no deberías usar interrupciones para esto en absoluto. Debe conectar el interruptor a un pin de entrada y sondear el pin periódicamente. El período de sondeo debe ser mayor que el intervalo de tiempo durante el cual disminuye el transitorio de conmutación (rebote).
Además, debe levantar su pin con una resistencia pull-up. Simplemente conectar el interruptor entre GND y el pin no es suficiente; Algunos microcontroladores tienen resistencias pull-up internas que puede activar desde el software, por lo que no necesita usar una externa.
Estoy usando estos interruptores como interruptor de límite para una puerta de garaje. En mi código, estoy usando un temporizador para levantar la puerta del garaje durante diez segundos O hasta que se active la interrupción del interruptor de límite.
Esta es una aplicación de baja velocidad y no se requiere una interrupción para dar una parada adecuada. El tiempo de desaceleración del motor será cientos de veces más largo de lo que un simple circuito de sondeo de entrada y antirrebote podría manejar cómodamente.
Coloque los interruptores de límite un poco hacia atrás desde el final del recorrido y ajústelos para que la puerta se detenga en las posiciones correctas de apertura y cierre.
Pienso en estos pocos puntos
El filtro RC con pull up externo y antirrebote de software es la mejor opción aquí. Si lee el mismo valor después de 20 ms, puede estar seguro de que es correcto
Volviendo a tus preguntas:
De todos modos, ganas experiencia al fallar. Eso es, después de todo, lo que cuenta.
broma