unsigned longで時間を扱う
CoddyのArduinoジャーニー「delayを使わないタイミング制御」セクションの一部。レッスン 2/18。
変数に格納できる数値の大きさは、その型によって決まります。Uno の int は -32768 から 32767 までを保持します。32.8 秒後には millis() の値がその範囲を超え、それを保持しようとする int はオーバーフローして負の数になります。
unsigned 型には負の数がないため、2 倍の大きさまで扱えます。unsigned int は 0 から 65535 までを保持し、ミリ秒で約 65 秒分です。それでもまだ足りません。
unsigned long は 0 から 4,294,967,295 までを保持します。ミリ秒に換算すると 49 日以上で、millis() 自体が返す型です。時刻はすべてこの型で保存しましょう。
unsigned long now = millis();
unsigned long startTime = 0;型を間違えたスケッチは、最初の 30 秒ほどは動作してから誤動作するため、バグを見落としやすくなります。
チャレンジ
簡単このスケッチは1秒ごとに時刻を出力しますが、32秒後には負の数を出力します。nowの型を変更して、何日経っても時刻が正しく表示されるようにしてください。
Runを押して33秒を過ぎるまで待ち、バグを確認してから修正し、Checkを押してください。
自分で試してみよう
void setup() {
Serial.begin(9600);
}
void loop() {
int now = millis(); // この型では時間の値を扱うには小さすぎるので、変更する
Serial.println(now);
delay(1000);
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
delayを使わないタイミング制御のすべてのレッスン
自分で練習してみよう: Arduinoプレイグラウンド