Arduino入門 第7回 残り時間目安の表示

目次

YouTube動画

要点まとめ

残り時間目安の表示

ブレッドボード回路製作

残り時間をLEDで表現するために、Arduinoボードの8番、6番、4番端子に次のようにLEDを接続します。

if文

残り時間に応じて、LEDの点灯状態を変える必要があります。

プログラミングでは、このように「ある条件の時に特定の処理をする」ことができるように「if文」が用意されています。

特定の残り時間でLEDの点灯状態を変える方法

例えば、残り時間が10秒になったときにLEDの点灯状態を変えるには、次のようなスケッチになります。

if( 残り時間==10 ) {
  // LEDの点灯状態を変える
}

現在のスケッチでは、for文で「1秒間でピカッと点滅」という処理をタイマー時間分繰り返しています。

そこでこのfor文の処理の中で、残り時間を調べて、残り時間に応じた処理をif文で書けばうまく動作します。

次のスケッチは、残り時間に応じて点灯させるLEDを次のように変えていく内容になります。

 /*
  Arduino入門 第7回 残り時間目安をLEDで表示
    ステップ1: 残り時間に応じて、LEDの点灯状態を変更する
*/

#define TIMER 20      // タイマー時間(秒)
#define HALF_TIMER 10 // 「残り時間が半分」の時間(秒)
#define SOON_TIMER 3  // 「もうすぐ」の時間(秒)

#define SW_PIN A5 // スイッチ接続端子
#define SW_OFF 1  // スイッチOFFのdigitalReadの値

#define LED_PIN 12 // 1秒ごとに点滅するLEDの接続端子
#define LED_ON_INTERVAL   50 // LEDを点灯する時間
#define LED_OFF_INTERVAL 950 // LEDを消灯する時間

#define FULL_PIN 8 // 「残り時間十分」LEDの接続端子
#define HALF_PIN 6 // 「残り時間半分」LEDの接続端子
#define SOON_PIN 4 // 「もうすぐ」LEDの接続端子

#define SPEAKER_PIN A0  // スピーカー接続端子
#define ALARM_TONE 1760 // アラーム音の周波数


void setup() {
  // LED接続端子を出力制御にする
  pinMode(LED_PIN,  OUTPUT);
  pinMode(FULL_PIN, OUTPUT);
  pinMode(HALF_PIN, OUTPUT);
  pinMode(SOON_PIN, OUTPUT);

  // スイッチ接続端子をプルアップ機能有効にする
  pinMode(SW_PIN, INPUT_PULLUP);
}

void loop() {
  // スイッチが押されるまで待つ
  while( digitalRead(SW_PIN) == SW_OFF ) {
  }

  // 「残り時間十分」LEDをON
  digitalWrite(FULL_PIN, HIGH);

  // 指定した時間、LEDを点滅する
  // 処理中は残り時間に応じてLEDの点灯状態を変える
  for(int i=0; i<TIMER; i++) {
    // 残り時間を計算
    int nokori = TIMER - i;

    // 残り時間が半分の時のLED制御
    if(nokori == HALF_TIMER){
      digitalWrite(FULL_PIN, LOW);  // 「残り時間十分」LEDをOFF
      digitalWrite(HALF_PIN, HIGH); // 「残り時間半分」LEDをON
    }

    // もうすぐの時のLED制御
    if(nokori == SOON_TIMER) {
      digitalWrite(HALF_PIN, LOW);  // 「残り時間半分」LEDをOFF
      digitalWrite(SOON_PIN, HIGH); // 「もうすぐ」LEDをON
    }

    // LEDをピカッと1秒間で点滅
    digitalWrite(LED_PIN, HIGH);
    delay(LED_ON_INTERVAL);
    digitalWrite(LED_PIN, LOW);
    delay(LED_OFF_INTERVAL);
  }

  // アラームを鳴らす
  tone(SPEAKER_PIN, ALARM_TONE);
  delay(60);
  noTone(SPEAKER_PIN);
  delay(60);

  tone(SPEAKER_PIN, ALARM_TONE);
  delay(60);
  noTone(SPEAKER_PIN);
  delay(60);
  
  tone(SPEAKER_PIN, ALARM_TONE);
  delay(120);
  noTone(SPEAKER_PIN);

  // LEDを消灯
  digitalWrite(SOON_PIN, LOW);
}

また、1色のLEDを残り時間に応じて点灯個数を減らしていくスケッチは次のようになります。

 /*
  Arduino入門 第7回 残り時間目安をLEDで表示
    ステップ1: 残り時間に応じて、LEDの点灯状態を変更する
              LEDが1色のとき、残り時間に応じて点灯個数を減らすバージョン
*/

#define TIMER 10      // タイマー時間(秒)
#define HALF_TIMER 6 // 「残り時間が半分」の時間(秒)
#define SOON_TIMER 3  // 「もうすぐ」の時間(秒)

#define SW_PIN A5 // スイッチ接続端子
#define SW_OFF 1  // スイッチOFFのdigitalReadの値

#define LED_PIN 12 // 1秒ごとに点滅するLEDの接続端子
#define LED_ON_INTERVAL   50 // LEDを点灯する時間
#define LED_OFF_INTERVAL 950 // LEDを消灯する時間

#define FULL_PIN 8 // 「残り時間十分」LEDの接続端子
#define HALF_PIN 6 // 「残り時間半分」LEDの接続端子
#define SOON_PIN 4 // 「もうすぐ」LEDの接続端子

#define SPEAKER_PIN A0  // スピーカー接続端子
#define ALARM_TONE 1760 // アラーム音の周波数


void setup() {
  // LED接続端子を出力制御にする
  pinMode(LED_PIN,  OUTPUT);
  pinMode(FULL_PIN, OUTPUT);
  pinMode(HALF_PIN, OUTPUT);
  pinMode(SOON_PIN, OUTPUT);

  // スイッチ接続端子をプルアップ機能有効にする
  pinMode(SW_PIN, INPUT_PULLUP);
}

void loop() {
  // スイッチが押されるまで待つ
  while( digitalRead(SW_PIN) == SW_OFF ) {
  }

  // 「残り時間十分」LEDをON
  digitalWrite(FULL_PIN, HIGH);
  digitalWrite(HALF_PIN, HIGH);
  digitalWrite(SOON_PIN, HIGH);

  // 指定した時間、LEDを点滅する
  // 処理中は残り時間に応じてLEDの点灯状態を変える
  for(int i=0; i<TIMER; i++) {
    // 残り時間を計算
    int nokori = TIMER - i;

    // 残り時間が半分の時のLED制御
    if(nokori == HALF_TIMER){
      digitalWrite(FULL_PIN, LOW);  // 「残り時間十分」LEDをOFF
    }

    // もうすぐの時のLED制御
    if(nokori == SOON_TIMER) {
      digitalWrite(HALF_PIN, LOW); // 「もうすぐ」LEDをON
    }

    // LEDをピカッと1秒間で点滅
    digitalWrite(LED_PIN, HIGH);
    delay(LED_ON_INTERVAL);
    digitalWrite(LED_PIN, LOW);
    delay(LED_OFF_INTERVAL);
  }

  // LEDを消灯
  digitalWrite(SOON_PIN, LOW);

  // アラームを鳴らす
  tone(SPEAKER_PIN, ALARM_TONE);
  delay(60);
  noTone(SPEAKER_PIN);
  delay(60);

  tone(SPEAKER_PIN, ALARM_TONE);
  delay(60);
  noTone(SPEAKER_PIN);
  delay(60);
  
  tone(SPEAKER_PIN, ALARM_TONE);
  delay(120);
  noTone(SPEAKER_PIN);

}

残り時間目安の表示と同時にアラーム音を鳴らす

残り時間LEDの点灯状態を変えるタイミングで、同時にアラーム音を鳴らしてみたいと思います。

この場合、LEDを1秒間でピカッと点滅する部分で、同時にアラーム音を鳴らします。

このようにすると、LEDを1秒間でピカッと点滅する部分は、次の2つの処理を切り替える必要があります。

  • 残り時間LEDの点灯状態を変えるタイミングで、LEDをピカッと1秒間で点滅すると同時にアラーム音も鳴らす
  • 通常時、LEDをピカッと1秒間で点滅する処理

例えば、残り時間が10秒と3秒の時にアラーム音を鳴らしたい場合、if文を使って次のように処理を切り換えます。

if( 残り時間が10 または 3 ) {
  // LEDをピカッと点滅すると同時に、アラーム音を鳴らす
} else {
  // 通常のLEDをピカッと点滅する
}

上のif文の条件部分は、2つの条件を「または」で組み合わせています。このように複数の条件を組み合わせる書き方が用意されています。

論理演算子

複数の条件を組み合わせる場合、次の論理演算子と呼ばれる記号を使います。

例えば、nokoriという変数が10または3の場合、if文の条件部分は次のように書きます。

if( nokori==10 || nokori==3 ) 

LED点灯状態切換え時にアラーム音も同時に鳴らす

論理演算子を使うと、LED点灯状態切換え時にアラーム音も同時に鳴らすスケッチは次のように書くことができます。

 /*
  Arduino入門 第7回 残り時間目安をLEDで表示
    残り時間に応じて、LEDの点灯状態を変更し、
    同時にアラーム音を1秒鳴らす
*/

#define TIMER 10      // タイマー時間(秒)
#define HALF_TIMER 5 // 「残り時間が半分」の時間(秒)
#define SOON_TIMER 3  // 「もうすぐ時間ですよ」の残り時間(秒)

#define SW_PIN A5 // スイッチ接続端子
#define SW_OFF 1  // スイッチOFFのdigitalReadの値

#define LED_PIN 12 // 1秒ごとに点滅するLEDの接続端子
#define LED_ON_INTERVAL   50 // LEDを点灯する時間
#define LED_OFF_INTERVAL 950 // LEDを消灯する時間

#define FULL_PIN 8 // 「残り時間が十分にある」LEDの接続端子
#define HALF_PIN 6 // 「残り時間が半分」LEDの接続端子
#define SOON_PIN 4 // 「もうすぐ時間ですよ」LEDの接続端子

#define SPEAKER_PIN A0  // スピーカー接続端子
#define ALARM_TONE 1760 // アラーム音の周波数


void setup() {
  // LED接続端子を出力制御にする
  pinMode(LED_PIN,  OUTPUT);
  pinMode(FULL_PIN, OUTPUT);
  pinMode(HALF_PIN, OUTPUT);
  pinMode(SOON_PIN, OUTPUT);

  // スイッチ接続端子をプルアップ機能有効にする
  pinMode(SW_PIN, INPUT_PULLUP);
}

void loop() {
  // スイッチが押されるまで待つ
  while( digitalRead(SW_PIN) == SW_OFF ) {
  }

  // 「残り時間が十分にあるLED」を点灯
  digitalWrite(FULL_PIN, HIGH);

  // 指定した時間、LEDを点滅する
  for(int i=0; i<TIMER; i++) {
    // 残り時間を計算
    int nokori = TIMER - i;

    // 残り時間が半分時のLED制御
    if(nokori == HALF_TIMER){
      digitalWrite(FULL_PIN, LOW);  // 「残り時間十分」LEDをOFF
      digitalWrite(HALF_PIN, HIGH); // 「残り時間半分」LEDをON
    }

    // もうすぐの時のLED制御
    if(nokori == SOON_TIMER) {
      digitalWrite(HALF_PIN, LOW);  // 「残り時間半分」LEDをOFF
      digitalWrite(SOON_PIN, HIGH); // 「もうすぐ」LEDをON
    }

    if(nokori==HALF_TIMER || nokori==SOON_TIMER) {
      // LEDをピカッと点滅して、同時に音で知らせる
      tone(SPEAKER_PIN, ALARM_TONE); // 最初にアラーム音を鳴らして、
      digitalWrite(LED_PIN, HIGH);   // LEDをピカッと1秒間で点滅して
      delay(LED_ON_INTERVAL);
      digitalWrite(LED_PIN, LOW);
      delay(LED_OFF_INTERVAL);
      noTone(SPEAKER_PIN);           // アラーム音を止める
    } else {
      // LEDをピカッと1秒間で点滅するだけ
      digitalWrite(LED_PIN, HIGH);
      delay(LED_ON_INTERVAL);
      digitalWrite(LED_PIN, LOW);
      delay(LED_OFF_INTERVAL);
    }
  }

  // アラームを鳴らす
  tone(SPEAKER_PIN, ALARM_TONE);
  delay(60);
  noTone(SPEAKER_PIN);
  delay(60);

  tone(SPEAKER_PIN, ALARM_TONE);
  delay(60);
  noTone(SPEAKER_PIN);
  delay(60);
  
  tone(SPEAKER_PIN, ALARM_TONE);
  delay(120);
  noTone(SPEAKER_PIN);

  // LEDを消灯
  digitalWrite(SOON_PIN, LOW);
}

チャレンジ課題解答例

「もうすぐ時間」になったら、1秒ごとにアラーム音を短く1秒ごとに鳴らします。

例えば「もうすぐ時間」の秒数を3秒とすると、処理としては「残り時間が3秒以下のとき、アラーム音を短く鳴らす。そうでければ通常の点滅をする」と考えます。

LEDを点滅処理する部分間のスケッチを、日本語混じりのコードで考えると次のようになります。

if( nokori<=3 ) {
  // この部分は、残り時間が3秒以下の時に処理されるので
  // ここはLEDを点滅処理すると同時に、アラーム音を短く鳴らす
} else {
  // この部分は、それ以外、つまりスタートボタンを押してから残り時間4秒になるまで処理されるので
  // ここはLEDの点滅処理のみ行う
}

ステップ1のスケッチの点滅処理の部分を上のような処理に置き換えればいいので、次のようなスケッチにしてみました。

 /*
  Arduino入門 第7回 残り時間目安をLEDで表示
    チャレンジ課題解答例
*/

#define TIMER 10      // タイマー時間(秒)
#define HALF_TIMER 5 // 「残り時間が半分」の時間(秒)
#define SOON_TIMER 3  // 「もうすぐ」の時間(秒)

#define SW_PIN A5 // スイッチ接続端子
#define SW_OFF 1  // スイッチOFFのdigitalReadの値

#define LED_PIN 12 // 1秒ごとに点滅するLEDの接続端子
#define LED_ON_INTERVAL   50 // LEDを点灯する時間
#define LED_OFF_INTERVAL 950 // LEDを消灯する時間

#define FULL_PIN 8 // 「残り時間十分」LEDの接続端子
#define HALF_PIN 6 // 「残り時間半分」LEDの接続端子
#define SOON_PIN 4 // 「もうすぐ」LEDの接続端子

#define SPEAKER_PIN A0  // スピーカー接続端子
#define ALARM_TONE 1760 // アラーム音の周波数


void setup() {
  // LED接続端子を出力制御にする
  pinMode(LED_PIN,  OUTPUT);
  pinMode(FULL_PIN, OUTPUT);
  pinMode(HALF_PIN, OUTPUT);
  pinMode(SOON_PIN, OUTPUT);

  // スイッチ接続端子をプルアップ機能有効にする
  pinMode(SW_PIN, INPUT_PULLUP);
}

void loop() {
  // スイッチが押されるまで待つ
  while( digitalRead(SW_PIN) == SW_OFF ) {
  }

  // 「残り時間十分」LEDをON
  digitalWrite(FULL_PIN, HIGH);

  // 指定した時間、LEDを点滅する
  // 処理中は残り時間に応じてLEDの点灯状態を変える
  for(int i=0; i<TIMER; i++) {
    // 残り時間を計算
    int nokori = TIMER - i;

    // 残り時間が半分の時のLED制御
    if(nokori == HALF_TIMER) {
      digitalWrite(FULL_PIN, LOW);  // 「残り時間十分」LEDをOFF
      digitalWrite(HALF_PIN, HIGH); // 「残り時間半分」LEDをON
    }

    // もうすぐの時のLED制御
    if(nokori == SOON_TIMER) {
      digitalWrite(HALF_PIN, LOW);  // 「残り時間半分」LEDをOFF
      digitalWrite(SOON_PIN, HIGH); // 「もうすぐ」LEDをON
    }

    // 残り時間がもうすぐになったら、
    // つまり、「残り時間」<=「もうすぐの時間」になったら
    // 毎回音を出す
    if(nokori<=SOON_TIMER) {
      // LEDをピカッと1秒間で点滅する時に50m秒間だけ音を出す
      tone(SPEAKER_PIN, ALARM_TONE);
      digitalWrite(LED_PIN, HIGH);
      delay(LED_ON_INTERVAL);
      noTone(SPEAKER_PIN);
      digitalWrite(LED_PIN, LOW);
      delay(LED_OFF_INTERVAL);
    } else {
      // LEDをピカッと1秒間で点滅
      digitalWrite(LED_PIN, HIGH);
      delay(LED_ON_INTERVAL);
      digitalWrite(LED_PIN, LOW);
      delay(LED_OFF_INTERVAL);
    }
  }

  // アラームを鳴らす
  tone(SPEAKER_PIN, ALARM_TONE);
  delay(60);
  noTone(SPEAKER_PIN);
  delay(60);

  tone(SPEAKER_PIN, ALARM_TONE);
  delay(60);
  noTone(SPEAKER_PIN);
  delay(60);
  
  tone(SPEAKER_PIN, ALARM_TONE);
  delay(120);
  noTone(SPEAKER_PIN);

  // LEDを消灯
  digitalWrite(SOON_PIN, LOW);
}
通知の設定
通知タイミング
guest
0 コメント
本文中にフィードバック
全てのコメントを見る
目次