Arduinoの基礎 - 待機と時間計測
ナビゲーションに移動
検索に移動
概要
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
関数を使用することが推奨される。