私が使用した1つの方法は、CMOS入力の容量性を利用しています。
この回路のシミュレーション – CircuitLabを使用して作成された回路図
スイッチの上の回路では、閉じたときに、プルダウン抵抗がGPIOの入力容量をグランドレベルまで充電/放電できます。
この回路のコツは、GPIOの双方向性を使用して、スイッチが開いているときに入力をロジックハイレベルに充電し続けることです。
制御ルーチンは、定期的にピンをハイレベルにするか、またはプルアップを一時的に有効にします。これは、キャップの充電を維持するのに十分な時間です。入力ピンはダイナミックメモリビットのように機能し、ほとんどのデバイスで、かなりの使用可能な時間にわたってその電荷を保持します。
適切に設定されている場合、ボタンが押されると、ピンの電荷はリフレッシュレートよりも速く放電します。その状態は、リフレッシュ操作の前の読み取りとしてリフレッシュアルゴリズムの一部として検出されるか、割り込みの駆動に使用されます。
リフレッシュパルスの間、コンデンサを再充電するためと抵抗を介して電力が短時間使用され、抵抗が閉じている場合は切り替えます。ただし、リフレッシュパルスの長さは短く、ポーリング頻度により、リフレッシュ電流は比較的重要ではなくなります。
明らかに、このメソッドはアクティブなメソッドです。マイクロがスリープ状態になると、スイッチの状態はスリープ解除時に不定になります。ウェイクアップ後の最初のリフレッシュサイクルでは、ピンの読み取りを無視する必要があります。また、このメソッドを使用してマイクロをウェイクアップしないでください。就寝する前に、ピンを低出力として有効にして、電流がゼロの状態で待機させることも賢明です。
セットアップディップスイッチなど、より静的なスイッチを読み取るには、連続的な更新サイクルではなく、専用のルーチンを使用できます。読み取り後、GPIOピンはアクティブな低出力状態(ゼロ電流)で「パーク」され、フローティング入力の問題を回避する必要があります。
注:トレースの長さが長く、ノイズの多い領域を通過する場合、この手法はノイズ感度の影響を受けます。そのため、R1は入力ピンの近くに配置する必要があります。ただし、ピンの近くに余分な容量を追加しない限り、前面パネルのどこかにスイッチを接続することはお勧めしません。