Un metodo che ho usato sfrutta la natura capacitiva degli ingressi CMOS.
simula questo circuito - Schema creato usando CircuitLab
Nel circuito sopra l'interruttore, quando chiuso, consente alla resistenza di pull-down di caricare / scaricare le capacità di ingresso del GPIO fino a terra.
Il trucco di questo circuito consiste nell'utilizzare la natura bidirezionale di un GPIO per mantenere alto l'ingresso logico a livello logico quando l'interruttore è aperto.
La routine di controllo trasforma periodicamente il perno di livello alto o abilita brevemente il pull-up, abbastanza a lungo da mantenere una carica dei tappi. Il pin di input si comporta quindi come un bit di memoria dinamica e, con la maggior parte dei dispositivi, mantiene tale carica per un periodo di tempo considerevole e utilizzabile.
Se configurato correttamente, se si preme il pulsante, la carica sul pin si scaricherà più velocemente della frequenza di aggiornamento. Tale condizione può quindi essere rilevata come parte dell'algoritmo di aggiornamento come operazione di lettura prima dell'aggiornamento o utilizzata per generare un interrupt.
L'alimentazione viene brevemente utilizzata durante l'impulso di aggiornamento, sia per ricaricare i condensatori che attraverso il resistore e passare se è chiuso. Tuttavia, la lunghezza dell'impulso di aggiornamento è breve e la frequenza di polling risulta nella corrente di aggiornamento relativamente insignificante.
Ovviamente questo metodo è attivo. Se il micro viene messo in sospensione, lo stato dell'interruttore sarà indeterminato al risveglio. Il primo ciclo di aggiornamento dopo il risveglio deve ignorare la lettura del pin. Inoltre, questo metodo non deve essere utilizzato per riattivare il micro. Prima di andare a letto, è anche consigliabile abilitare il pin come uscita bassa per parcheggiarlo in uno stato di corrente zero.
Per leggere più interruttori statici, come i dip-switch di impostazione, è possibile utilizzare una routine dedicata anziché un ciclo di aggiornamento continuo. Dopo la lettura, i pin GPIO dovrebbero quindi essere "parcheggiati" in uno stato di uscita basso attivo (corrente zero) per evitare il problema degli ingressi flottanti.
NOTA: questa tecnica soffre leggermente della sensibilità al rumore se le lunghezze della traccia sono lunghe e viaggiano in un'area rumorosa. Come tale R1 dovrebbe essere vicino al pin di ingresso. Tuttavia, non lo consiglierei per collegare un interruttore a una certa distanza su un pannello anteriore da qualche parte a meno che non si aggiunga capacità aggiuntiva vicino al pin.