Un método que he usado aprovecha la naturaleza capacitiva de las entradas CMOS.
simular este circuito : esquema creado con 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 saca el pasador como un nivel alto, o habilita brevemente el pull-up, el tiempo suficiente para mantener una carga de 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 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 puede detectarse como parte del algoritmo de actualización como una lectura antes de la operación de actualización, o usarse para generar una interrupción.
La energía se usa brevemente durante el pulso de actualización, tanto para recargar los condensadores como a través de la resistencia y cambiar si está cerrado. Sin embargo, la duración del pulso de actualización es corta y la frecuencia de sondeo da como resultado 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 del despertar debe ignorar la lectura del pin. Además, este método no debe usarse para despertar al micro. Antes de acostarse, también es aconsejable habilitar el pin como salida baja para estacionarlo en un estado de corriente cero.
Para leer más interruptores estáticos, como configurar interruptores DIP, se puede usar una rutina dedicada en lugar de un ciclo de actualización continuo. Después de leer, los pines GPIO deben "estacionarse" en un estado activo de salida baja (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 atraviesan 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 un panel frontal en algún lugar, a menos que agregue capacitancia adicional cerca del pin.