toguru


これまでのボタンは、「押している間だけON」になるものでした。

今回は少し改造して、「押すたびにONとOFFが切り替わる」ボタンを作ってみましょう。

このような動きをするボタンを「トグルボタン」といいます。

トグルボタンはどんなところで使われている?

トグルボタンは、押すたびにONとOFFが切り替わるしくみなので、いろいろな場面で使われています。

  • 部屋の電気のスイッチ(押すとつく・もう一度押すと消える)
  • テレビの電源ボタン
  • ゲームの設定(音のON/OFFなど)
  • スマホの設定(Wi-FiのON/OFFなど)

「状態を切り替える」操作にぴったりのしくみです。


トグルボタンに改造しよう

ボタンが押されたらLEDを光らせるプログラムを改造してみましょう。

  • 改造前:押してる間だけON
  • 改造後:押すたびにON / OFF切り替え

押すたびにON/OFFが切り替わるボタンを「トグルボタン」といいます。

前回のプルアップ回路をそのまま使います。

image5

  • 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が反転するプログラムができました。

マイコンに書き込んで、うまく動いているか確認してみましょう。