Arduinoのmillis()関数とは?使い方と注意点をわかりやすく解説

Arduinoを使ったプログラミングでよく登場するのが、millis()という関数です。初心者の方にとっては、「何をする関数なのか」「どのように使えばよいのか」が分かりにくいこともあるかもしれません。

この記事では、millis()関数の基本的な使い方や仕組み、実際の使用例、さらには注意点までをわかりやすく解説します。


millis()関数とは?

millis()関数は、Arduinoプログラムが開始されてからの経過時間をミリ秒(1/1000秒)単位で返す関数です。戻り値の型はunsigned longで、0から始まり、プログラムの起動とともに時間が加算されていきます。

この関数はArduino特有のものであり、C++の標準関数ではありません。


millis()関数の特徴

  • ミリ秒単位の精度:1秒 = 1000ミリ秒として時間をカウント。
  • 非同期処理に最適delay()と異なり、処理を停止せずに時間の経過を確認できます。
  • オーバーフローする仕様:おおよそ49.7日(2^32ミリ秒)で数値が0に戻りますが、差分をとる形で使用すれば影響はありません。

基本的な使い方

unsigned long previousMillis = 0;
const long interval = 1000; // 1000ミリ秒(=1秒)

void setup() {
  Serial.begin(9600);
}

void loop() {
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    Serial.println("1秒が経過しました");
  }
}

このように、現在時刻(currentMillis)と前回記録した時刻(previousMillis)の差分を使って、一定の間隔で処理を実行することができます。


millis()を使うメリット

1. delay()との違い

delay()関数はその時間中すべての処理を停止しますが、millis()を使えば、時間の計測中も他の処理を並行して実行することが可能です。

2. タイマーの代替として使える

例えば「3秒後にLEDを点灯させたい」といった制御が、簡単かつ柔軟に実装できます。


注意点:オーバーフローとその対処法

millis()の値は約49.7日で最大値に達し、**0に戻る(オーバーフロー)**という仕様があります。

しかし、次のように「差分」で時間を扱えば、オーバーフローしても問題なく動作します。

if ((millis() - previousMillis) >= interval) {
  // この方法ならオーバーフローにも強い
}

millis()関数が活躍する場面

  • 一定間隔でセンサーデータを読み取る
  • LEDの点滅やモーター制御
  • ポンプやアラームの時間管理
  • タイマーやストップウォッチの実装

まとめ

Arduinoで時間を扱う上で、millis()関数は非常に重要な役割を果たします。特に非同期処理タイマー制御を実装する際には欠かせない存在です。

オーバーフローの扱い方さえ理解しておけば、安定したタイミング制御が実現できます。delay()よりも高度な時間制御が可能になるので、Arduino初心者の方もぜひ積極的に使ってみてください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次