
これまでのボタンは、「押している間だけON」になるものでした。
今回は少し改造して、「押すたびにONとOFFが切り替わる」ボタンを作ってみましょう。
このような動きをするボタンを「トグルボタン」といいます。
トグルボタンはどんなところで使われている?
トグルボタンは、押すたびにONとOFFが切り替わるしくみなので、いろいろな場面で使われています。
- 部屋の電気のスイッチ(押すとつく・もう一度押すと消える)
- テレビの電源ボタン
- ゲームの設定(音のON/OFFなど)
- スマホの設定(Wi-FiのON/OFFなど)
「状態を切り替える」操作にぴったりのしくみです。
トグルボタンに改造しよう
ボタンが押されたらLEDを光らせるプログラムを改造してみましょう。
- 改造前:押してる間だけON
- 改造後:押すたびにON / OFF切り替え
押すたびにON/OFFが切り替わるボタンを「トグルボタン」といいます。
- 2番ピンにLED
- 3番ピンにボタン
をつないで、図のようにします。
変数を使おう
「変数」を使って、LEDやボタンの状態を保存しておきましょう。
・bool型は「true(1)/false(0)」のどちらか
・int型は整数
YES・NOを保存するのがbool型
数字を保存するのがint型です
ワンポイント
変数は、値を覚えておくための箱のようなものです。
前の状態を覚えておくことで、「変化」を見つけられるようになります。
プログラムを書こう
前回のプルアップボタンのプログラムを変更してみます。
#define LED 2
#define BUTTON 3
bool ledState = false; // LEDの状態(ON/OFF)
int lastButton = HIGH; // 1回前のボタンの状態
void setup() {
pinMode(LED, OUTPUT);
pinMode(BUTTON, INPUT_PULLUP); // プルアップ
}
void loop() {
int nowButton = digitalRead(BUTTON); // 今の状態を読む
// 「押された瞬間」を見つける(HIGH → LOW)
if (lastButton == HIGH && nowButton == LOW) {
ledState = !ledState; // ON/OFFを反転
delay(50); // チャタリングを防ぐ
}
digitalWrite(LED, ledState);
lastButton = nowButton; // 状態を保存
}
トグルの仕組み
プルアップ回路なので、通常はHIGH、ボタンが押されたときだけLOWになります。
- ボタンがおされているとき → LOW
- ボタンがはなされているとき → HIGH
ループの最後でボタンの状態を保存しています。
lastButton = nowButton;
この仕組みによって、「押した瞬間」だけを検出しています。
- 前のループ → HIGH(押していない)
- 次のループ → LOW(押された)
そのため、押しっぱなし(LOW → LOW)や、離したまま(HIGH → HIGH)には反応しません。
!マークで逆の意味になる
ledState = !ledState; と書くと、状態が反転します。
true → false
false → true
ボタンを押すたびにON/OFFが切り替わる仕組みです。
チャタリング対策
delay(50) は、ボタンの細かい振動(チャタリング)による誤動作を防ぐために入れています。
これまでのプログラムでは、
digitalWrite(LED, HIGH);
digitalWrite(LED, LOW);
のように、LEDの状態を直接書いていました。
今回のプログラムでは、LEDの状態を ledState という変数で管理しています。
digitalWrite(LED, ledState);
と書くことで、「いまの状態に合わせてLEDを制御する」ことができます。
LEDを光らせるか消すかは別の場所で決めておき、ここではそれを反映するだけ、という役割分担になっています。
動作確認
これで、ボタンが押されたときだけLEDが反転するプログラムができました。
マイコンに書き込んで、うまく動いているか確認してみましょう。

コメント