
ドアベルのように、ボタンを押している間は点灯し、離すと消灯します。ESP32はボタンの状態を常に読み取り、押している間はLEDを点灯させ、離した瞬間に消灯させます。ボードが外部からの操作をどう検知するかを、シンプルな仕組みで学べます。
動画
回路図

ソースコード
Arduino (C++)
1// ─────────────────────────────────────────
2// BlueGrays · bluegrays.com
3// ESP32 LED Control with Push Button (Push)
4// ─────────────────────────────────────────
5// The LED stays on while the button is held down and turns off when it is
6// released. The button pin uses the internal pull-up (INPUT_PULLUP), so no
7// external resistor is needed.
8//
9// Pins:
10// GPIO 5 -> Red LED (with a 220 ohm resistor)
11// GPIO 4 -> Button (other leg to GND)
12
13const int LED_PIN = 5; // LED output
14const int BUTTON_PIN = 4; // Button input
15
16void setup() {
17 pinMode(LED_PIN, OUTPUT);
18 pinMode(BUTTON_PIN, INPUT_PULLUP); // Reads HIGH when not pressed
19}
20
21void loop() {
22 // A pressed button pulls the pin to GND: LOW = pressed
23 if (digitalRead(BUTTON_PIN) == LOW) {
24 digitalWrite(LED_PIN, HIGH);
25 } else {
26 digitalWrite(LED_PIN, LOW);
27 }
28}
29
よくある質問
INPUT_PULLUPを使う場合、ボタンはどう接続しますか?▾
ボタンの片方の端子をGPIOピンに、もう片方をGNDに接続します。内蔵プルアップ抵抗がピンをHIGHに保ちます。ボタンを押すとピンがGNDに接続され、LOWとして読み取られます。外付け抵抗は不要です。
論理が逆になるのはなぜですか?▾
プルアップ抵抗を使うと、ボタンを押していないときはHIGH、押しているときはLOWと読み取られます。そのため、コード内の「if (digitalRead(button) == LOW)」という条件は、ボタンが押されたことを示します。
プルアップ抵抗を内蔵していないピンはどれですか?▾
GPIO 34、35、36、39は入力専用で、プルアップ抵抗もプルダウン抵抗も内蔵していません。これらのピンでボタンを使う場合は、外付けの10 kΩ抵抗を追加してください。
ボタンをタッチセンサーに置き換えられますか?▾
はい。ESP32にはタッチ検出に対応したピン(GPIO 4、13、14、15、27など)があります。`touchRead()`を使うと、ワイヤーや金属板へのタッチをボタンのように検知できます。
