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初心者の方もぜひ積極的に使ってみてください。