3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Arduino] delayの使い方を考える。

Last updated at Posted at 2020-04-06

#効率の良いdelayの使い方。
とても簡単なことではあるが、自分にとってはとても大切なことだと思うのでまとめておく。delayで長時間動作を止めない方が良いという内容。

##点滅のプログラム

void setup() {
  pinMode(13, OUTPUT);
}

void loop() {
  digitalWrite(13, HIGH);
  delay(1000);
  digitalWrite(13, LOW);
  delay(1000);
}

これはArduinoのLチカのプログラムである。1秒ごとに点滅を繰り返す。
ここでは**delay(1000)**を用いて1秒間動作を停止させることで点滅動作を行っている。しかし他の動作も組み合わせたいとき(例えばセンサーの読み取りなど)、1秒間動作を止めると不都合が生じる場合がある。delayの時間を細かくする手法を取ると改善できる。

##点滅のプログラム2

int i = 0;
int state = 0;

void setup() {
  pinMode(13, OUTPUT);
}

void loop() {
  if (i >= 1000) {
    i = 0;
    if (state == 0) {
      state = 1;
      digitalWrite(13, HIGH);
    }
    else {
      state = 0;
      digitalWrite(13, LOW);
    }
  }
  i++;
  delay(1);
}

先ほどのプログラムに比べて長くなってしまったが、同様の点滅の動作を行う。今回はdelay(1)を使っており、1ループにつき1ミリ秒しか動作を止めていない。この場合他の動作を行うときにも問題が生じない。プログラミング原理は1ミリ秒のdelayを1000回実行することで、1秒間を測っている。処理の量によっては1秒以上になってしまう場合もありそうなので、その場合は調整が必要かもしれない。このほかタイマー割込みなどでdelay中に処理する方法もあるようだが、難しそうなので自分はこの方法をよく使っている。

##ローカル変数とグローバル変数
2つ目のコードではグローバル変数で宣言を行っているが、関数内に宣言したい場合はstatic int i = 0のように書く。staticをつけないとループする毎に初期化されてしまうので注意。

##まとめ
・delayの時間は短い方が他の動作に影響しない。
・ローカル変数に宣言するときはstaticをつける。

簡単な内容だが、自分にとってはこれでできることが大きく広がったのでまとめてみた。

3
1
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?