ESP32独自ガイド · 更新
ESP32 ボタン入力|ESP32での設計・実装・動作確認
ESP32でボタンを読み取る基本から、プル抵抗、チャタリング対策、短押し・長押しの判定、異常時の試験までをやさしく解説します。
対応するテーマ: ESP32 - Button
この記事はAI支援で作成したオリジナルの編集ドラフトです。実機での検証は行っていません。配線や実装の前に、対象ボード・部品の公式仕様を照合してください。
基板の型番やESP32の派生品で使える端子・機能が異なります。配線前に使用するボードと部品の公式仕様を確認してください。
ボタン入力で確認する三つの状態
ボタンのプログラムでは、未押下、押下中、押した瞬間を区別します。単にGPIOの値を読むだけだと、押し続けている間に何度も同じ処理が走ることがあります。まず「押したとき一度だけ反応する」のか「押している間だけ出力を変える」のかを決めましょう。目的が決まると、入力回路、状態管理、確認すべき試験が整理できます。
配線する前にボードとGPIOの制約を調べる
ESP32の端子はすべて同じ用途に使えるわけではありません。ボードのピン配置図でGPIO番号と基板上の端子を照合し、起動時に使われる端子、入力専用端子、周辺回路と共有される端子を確認します。ボタンを接続するGPIOは、対象チップと開発ボードで利用可能なものから選びます。番号を推測したり、別のESP32製品の配線例をそのまま使ったりしないでください。
入力が浮かない回路にする
スイッチが開いているときGPIOが電源にもGNDにもつながらない回路では、入力が不安定になり、押していないのに値が変わることがあります。内部プルアップまたは外付けのプル抵抗を使い、ボタンを押したときの論理状態を決めます。内部プルアップを選ぶ場合も、対象端子とフレームワークが対応するか確認してください。回路図を先に描き、電源とGNDの短絡がないことを確かめます。
押下と未押下の論理を確かめる
プルアップ回路では、ボタンを押すと入力がLOWになる構成が一般的ですが、配線方式によって論理は変わります。プログラムを書く前に、未押下時と押下時の実際の読み取り値をシリアル出力で確認しましょう。「HIGHなら押下」と決めつけると、反転した動きに見えることがあります。変数名も pressed のような意味で扱い、電気レベルと操作状態を分けて考えると読みやすくなります。
機械スイッチのチャタリングを抑える
機械式ボタンは一度押したつもりでも、接点が短時間に複数回つながったり離れたりすることがあります。この現象をそのまま数えると、一回の操作が複数イベントになります。簡単な対策は、状態変化を検知した後、短い時間が経っても状態が安定していることを確認してから確定する方法です。必要な待ち時間はスイッチと用途で異なるため、実機で押下ログを見ながら調整します。
押した瞬間を一度だけイベントにする
押下中の状態と、前回の状態を保存して比較すると、未押下から押下へ変わったタイミングだけをイベントとして扱えます。デバウンス後の安定状態を使えば、接点の細かな揺れによる重複も減らせます。イベントが発生したら、カウンター更新や画面表示などの処理を一度だけ実行します。入力読み取りとイベント処理を分けておくと、後から長押しや複数ボタンを加えやすくなります。
長押しや連打は別の仕様として加える
短押しと長押しを区別したい場合は、押下開始時刻を保存し、解放時に経過時間を判定します。押下中に何度も長押しイベントを発生させないよう、判定済みの状態も管理します。連打を許すか、一定時間内の二度押しを別操作にするかも先に決めましょう。時間の単位やカウンターのオーバーフローを含め、採用するフレームワークの時間計測方法を公式資料で確認してください。
割り込みを使うのは必要性を確かめてから
通常の操作ボタンは、一定周期で状態を読む方法でも十分なことが多く、処理を追いやすい利点があります。割り込みは素早い変化を見逃せない場合に検討できますが、割り込み関数の中で画面更新、通信、長い待ち時間を実行するのは避けます。割り込みでは最小限の情報だけ記録し、重い処理は通常のループやタスクへ渡します。まずポーリング方式で仕様を確かめてから判断しましょう。
操作の境界条件を試験する
通常の一回押しだけでなく、ゆっくり押す、素早く連打する、押しっぱなしで起動する、入力線が外れた状態などを確認します。各操作に対してイベントが何回発生したかをログに記録し、設計した結果と比較してください。複数のボタンを使う場合は、同時押しや順序も試します。ボタンでモーターやロックなどを動かす場合は、入力だけを安全機能とせず、独立した停止手段と安全な初期状態を設けてください。
不安定な入力は回路とコードを分けて調べる
値がランダムに変わるなら、プル抵抗、配線長、GND接続、ノイズ源、GPIO選択を確認します。常に同じ値なら、ボタンの接続先、論理の反転、端子番号の取り違えを調べてください。まずシリアルモニターで生の入力を観察し、その後デバウンスやイベント判定を加えます。配線とコードを同時に変更せず、一つずつ変えて結果を残すと原因を切り分けやすくなります。試験では、一回押し、短い間隔の連打、長押し、解放後の再押下をそれぞれ複数回行い、押下回数とイベント回数を表に記録します。成功条件は「一回の操作で一回だけイベントが出る」のように書き、デバウンス時間を変えるときは、誤検出が減ったかだけでなく、意図した操作への反応が遅くなっていないかも確認しましょう。入力が外れた場合や起動時に押されている場合の状態も決めておけば、通常の操作だけでは見つからない不具合に気付きやすくなります。押下ログには生のGPIO値と確定後の操作状態を区別して出すと、回路の揺れなのか判定処理の誤りなのかを読み取りやすくなります。