こんにちは、メカ旦那です!
Arduinoのvoid loopって永遠に繰り返しますよね。何か終了させる関数はあるんでしょうか…
ありますよ!繰り返し回数に応じて何通りかあるので解説します!
void loopの終了方法
以下の説明では7ピンに接続したLEDが1秒ごとに点灯するコードを用います。
各関数の意味はこちらのブログで解説しています。
void setup() {
pinMode(7, OUTPUT);
}
void loop() {
digitalWrite(7, HIGH);
delay(1000);
digitalWrite(7,LOW);
delay(1000);
}
1回で終了する時はexit(0)を最後に記載しよう
void setup() {
pinMode(7, OUTPUT);
}
void loop() {
digitalWrite(7, HIGH);
delay(1000);
digitalWrite(7,LOW);
delay(1000);
exit(0);
}
void loopを1回だけ実行する際は、exit(0)を最後に記載しましょう。例えば上記のコードで2回目のdelay(1000) を実行した後、exit(0)でプログラムを終了することができます。つまり、LEDが1回だけ点灯して終了します。このexit(0)で終了させる方法はC言語でもよく使われます。
何回か繰り返す場合はwhile、forもしくは無限ループを使おう
exit(0)だけだとvoid loop内を1回実行して終了します。そのため、先ほどのコードだとLEDが1回だけ点灯して終わります。正直あっという間ですよね。
何回か実行した後終了する場合はwhile、for、もしくは無限ループを使いましょう。
while文の場合
/* LEDが5回点灯して終了 */
/* while文を使う */
int i = 0;
void setup() {
pinMode(7,OUTPUT);
}
void loop() {
while(i<5){
digitalWrite(7,HIGH);
delay(1000);
digitalWrite(7,LOW);
delay(1000);
i++;
}
exit(0);
}
whileの()の条件が成立する間は{}の処理が実行されます。
まず、冒頭で変数iを宣言し、初期値0を代入します。
その後void setupを実行し、void loopに移ります。i = 0 < 5で()内の条件を満たしているため、{}内の処理を実行します。そして、i++でiの値が1増加します。
そしてwhile冒頭に戻ります。i = 1 < 5で()内の条件を満たすため、先ほどと同様の処理を繰り返します。
iが5になった後、条件 i < 5 を満たさなくなるので、whileの外に出ます。そしてexit(0)を実行するのでプログラムが終了します。
このように、whileとexit(0)を使うことでvoid loop内を任意の回数繰り返すことができます。
for文の場合
/* LEDが5回点灯して終了 */
/* for文を使う */
void setup() {
pinMode(7,OUTPUT);
}
void loop() {
for(int i=0; i<5; i=i+1){
digitalWrite(7,HIGH);
delay(1000);
digitalWrite(7,LOW);
delay(1000);
}
exit(0);
}
forの()内の条件が成立する間は{}内の処理を実行します。
()内では
を記入します。
この場合ならまず変数iに初期値0を代入し、{}内を実行した後、iに1加えて再度同じ処理を繰り返します。i = 5になった時点で条件式(i < 5)を満たさなくなるのでfor文の外に出ます。そしてexit(0)を実行しプログラムが終了します。
このように、forとexit(0)を使うことでvoid loop内を任意の回数繰り返すことができます。
ちなみに i = i + 1 は i++でも同じ意味になります。1減少させるならi–と書きます。
無限ループの場合
/* LEDが5回点灯して終了 */
/* 無限ループ(while(1)とif)を使う */
int i = 0;
void setup() {
pinMode(7,OUTPUT);
}
void loop() {
digitalWrite(7,HIGH);
delay(1000);
digitalWrite(7,LOW);
delay(1000);
i++;
if(i>=5){
while(1){
}
}
}
無限ループとはwhileの()内に1を入力することで、{}内の処理を永遠に実行する関数です。
この場合、 {} 内を空白にし、何も実行しない状態を繰り返すことで、停止させたように見せかけます。何も実行しない状態でも一応Arduino は起動したままなので、電力を消費し続けます。
また、if内に無限ループを入れて、iが5以上になったら実行するようにします。
iが5以下の場合はdigitalWrite(7,HIGH) ~ i++を繰り返します。
好きな時に終了する場合は白紙のコードを転送する
関数を使わず、好きな時に終了する場合は、白紙のコードを転送しましょう。
またこの方法はArduinoを遊び終わる際にも役立ちます。
遊び終わる際、みなさんはUSBケーブルを抜きますよね。Arduinoは最後に転送されたコードを記憶するため、別日にUSBケーブルを繋いだ瞬間、接続された部品に関係なく、最後のコードを即座に実行します。「Upload」ボタンを押さなくてもです。
そのため、コードに合わない部品が接続されると、最悪の場合部品が故障します。
そのため、遊び終わる際は白紙のコードを転送し、Arduinoの記憶を削除しましょう。次回USBケーブルを接続した際に何も実行されないので、故障がおきません。
まとめ
void loop の終了方法をまとめると、
になります。場合に応じて使い分けてくださいね!
コメント