Un método que he utilizado aprovecha la naturaleza capacitiva de las entradas CMOS.
simular este circuito : esquema creado usando CircuitLab
En el circuito sobre el interruptor, cuando está cerrado, permite que la resistencia desplegable cargue / descargue las capacidades de entrada del GPIO hasta el nivel del suelo.
El truco con este circuito es usar la naturaleza bidireccional de un GPIO para mantener la entrada cargada a un nivel lógico alto cuando el interruptor está abierto.
La rutina de control periódicamente gira el pin como un nivel alto, o habilita brevemente el pull-up, el tiempo suficiente para mantener una carga en las tapas. El pin de entrada actúa como un bit de memoria dinámica y, con la mayoría de los dispositivos, mantendrá esa carga durante un período de tiempo considerable y utilizable.
Cuando se configura correctamente, si se presiona el botón, la carga en el pin se descargará más rápido que la frecuencia de actualización. Esa condición se puede detectar como parte del algoritmo de actualización como una operación de lectura antes de la actualización, o se puede usar para provocar una interrupción.
La energía se utiliza brevemente durante el impulso de actualización, tanto para recargar los condensadores como a través de la resistencia y el interruptor si está cerrado. Sin embargo, la duración del pulso de actualización es corta y la frecuencia de sondeo hace que la corriente de actualización sea relativamente insignificante.
Obviamente este método es activo. Si el micro se pone en suspensión, el estado del interruptor será indeterminado al despertar. El primer ciclo de actualización después de la activación debe ignorar la lectura del pin. Además, este método no debe utilizarse para despertar el micro. Antes de acostarse, también es aconsejable habilitar el pin como una salida baja para estacionarlo en un estado de corriente cero.
Para leer más interruptores estáticos, como la configuración de interruptores DIP, se puede usar una rutina dedicada en lugar de un ciclo de actualización continuo. Después de la lectura, los pines GPIO deberían "estacionarse" en un estado de baja salida activa (corriente cero) para evitar el problema de las entradas flotantes.
NOTA: esta técnica sufre un poco de sensibilidad al ruido si las trazas son largas y viajan a través de un área ruidosa. Como tal, R1 debe estar cerca del pin de entrada. Sin embargo, no lo recomendaría para conectar un interruptor a cierta distancia en algún panel frontal a menos que agregue una capacidad adicional cerca del pin.