Arduinoの基礎 - 待機と時間計測

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
ナビゲーションに移動 検索に移動

概要

Arduinoにおいて、delay関数およびmillis関数は、以下に示すように区別される。

  • delay関数
    プログラムの実行を一時停止させる待機関数。
  • millis関数
    待機時間を計測するための時間計測関数
    ただし、millis関数は待機を行わない。



delay関数とmillis関数の違い

delay関数のデメリット

  • ブロッキング処理
    delay関数を使用する場合、その間は他の処理が一切実行できない。
    例えば、delay(1000)を実行する場合は1秒間プログラムが完全に停止する。

  • マルチタスクの困難さ
    複数のアニメーションを同時に動かす場合は対応できない。
    ボタン入力等の他の処理も受け付けられない。


millis関数のメリット

  • ノンブロッキング処理
 unsigned long previousMillis = 0;
 const long interval = 1000;  // 1秒間隔
 
 void loop()
 {
    unsigned long currentMillis = millis();
 
    if (currentMillis - previousMillis >= interval) {
       previousMillis = currentMillis;
 
       // アニメーション更新処理
       updateAnimation();
    }
 
    // 他の処理も並行して実行可能
    checkButtonPress();
    updateOtherAnimations();
 }


  • 複数のタイミング制御
 unsigned long prevMillisAnim1 = 0;
 unsigned long prevMillisAnim2 = 0;
 
 const long intervalAnim1 = 50;   // 50[ms]間隔
 const long intervalAnim2 = 100;  // 100[ms]間隔
 
 void loop()
 {
    unsigned long currentMillis = millis();
 
    // アニメーション1の更新
    if (currentMillis - prevMillisAnim1 >= intervalAnim1) {
       prevMillisAnim1 = currentMillis;
       updateAnimation1();
    }
 
    // アニメーション2の更新
    if (currentMillis - prevMillisAnim2 >= intervalAnim2) {
       prevMillisAnim2 = currentMillis;
       updateAnimation2();
    }
 }


  • 正確なタイミング制御
    delay関数は処理時間による誤差が蓄積されやすい。
    millis関数は実際の経過時間に基づいて制御することが可能。


特に、アニメーションや複数の処理を同時に行う場合は、millis関数を使用することが推奨される。