Menu
CoddyTech

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 秒ほどは動作してから誤動作するため、バグを見落としやすくなります。

challenge icon

チャレンジ

簡単

このスケッチは1秒ごとに時刻を出力しますが、32秒後には負の数を出力します。nowの型を変更して、何日経っても時刻が正しく表示されるようにしてください。

Runを押して33秒を過ぎるまで待ち、バグを確認してから修正し、Checkを押してください。

自分で試してみよう

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

void loop() {
  int now = millis();   // この型では時間の値を扱うには小さすぎるので、変更する
  Serial.println(now);
  delay(1000);
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

delayを使わないタイミング制御のすべてのレッスン

自分で練習してみよう: Arduinoプレイグラウンド