micros()で測定する
CoddyのArduinoジャーニー「delayを使わないタイミング制御」セクションの一部。レッスン 16/18。
millis()はミリ秒単位で数えるため、短い時間を測るには大まかすぎます。2.5 msの押下は、2または3と表示されます。micros()も同じ種類の時計ですが、マイクロ秒、つまり1秒の100万分の1単位で数えます。1ミリ秒あたり1000マイクロ秒です。
Unoでは4マイクロ秒刻みで増加し、こちらもunsigned longを返します。時間を測るには、前後で値を読み取り、差し引きます。
unsigned long start = micros();
int reading = analogRead(A0);
unsigned long took = micros() - start;
Serial.println(took); // 約110:analogRead()には約0.1 msかかる数える速度がとても速いため、micros()はmillis()よりずっと早く数値が尽きます。約70分後に0から再び始まります。短い時間の測定にはこれを使い、数分を超える時間にはmillis()を使いましょう。
チャレンジ
簡単ボタンが押されている時間をマイクロ秒単位で測定します。
- ボタンが押されたとき、
micros()をpressedAtに保存します - ボタンが離されたとき、
micros() - pressedAtを出力します
Run を押し、ボタンをタップしてから、Check を押します。
自分で試してみよう
const int buttonPin = 2;
bool wasPressed = false;
unsigned long pressedAt = 0;
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
bool pressed = digitalRead(buttonPin) == LOW;
if (pressed && !wasPressed) {
// ボタンが押されたところ:時刻を記録する
}
if (!pressed && wasPressed) {
// ボタンが離されたところ:押されていた時間をマイクロ秒単位で出力する
}
wasPressed = pressed;
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
delayを使わないタイミング制御のすべてのレッスン
自分で練習してみよう: Arduinoプレイグラウンド