Arduinoでは処理をモジュール化して分かりやすく記述することが出来ます。
このモジュールを関数(function)といいます。
スケッチの中で何度も行われる処理を一つにまとめることが出来ます。
関数をコールすると関数の処理が実行され、その処理が終わるとコールされたところへ戻ってきます。
コードを関数化するメリットは沢山あります。
- コードの可読性が上がり分かりやすいプログラムになる
- 同じ処理をまとめる事でデバックがしやすくなる
- 不具合のリスクが減少する
- スケッチサイズが小さくなり、メモリの使用効率が良くなる
今回はそんな関数について学んでみましょう。
前回はこちら
関数の使い方
以下のプログラムは0.5秒おきに13番ポートのLEDが点滅するプログラムです。
#define LED 13
void setup(){
pinMode(LED,OUTPUT);
}
void loop(){
digitalWrite(LED,!digitalRead(LED));
delay(500);
}
6行目がLEDの状態を反転させる処理をしています。
この6行目の処理を関数にする場合には以下のように示します。
#define LED 13
void setup() {
pinMode(LED,OUTPUT);
}
void hanten(){
digitalWrite(LED,!digitalRead(LED));
}
void loop(){
hanten();
delay(500);
}
5行目:hantenが関数名を示しており、8行目でhanten();を実行する事でこの関数が実行されます。
実行された後は再びloop関数の中に戻ります。
このプログラムでは行数が増えており、あまり恩恵を感じられませんが、プログラムが複雑になると可読性が高くなります。
続いて、複数のLEDを点滅させるプログラムを考えてみます。
9番、10番ポートに接続されたLEDをそれぞれ交互に反転させるプログラムです。
#define LED1 9
#define LED2 10
void setup(){
pinMode(LED1,OUTPUT);
pinMode(LED2,OUTPUT);
digitalWrite(LED1,LOW);
digitalWrite(LED2,HIGH);
}
void loop(){
digitalWrite(LED1,!digitalRead(LED1));
digitalWrite(LED2,!digitalRead(LED2));
delay(500);
}
これを関数で表すと以下のようになります。
#define LED1 9
#define LED2 10
void setup(){
pinMode(LED1,OUTPUT);
pinMode(LED2,OUTPUT);
digitalWrite(LED1,LOW);
digitalWrite(LED2,HIGH);
}
void hanten(byte n){
digitalWrite(n,!digitalRead(n));
}
void loop(){
hanten(LED1);
hanten(LED2);
delay(500);
}
関数では引数(ひきすう)を使って数字の受け渡しも行うことが出来ます。
11行目:hantenが関数の名前です。その後のbyte nで引き渡す引数の型を設定しています。
15行目から関数が呼び出されたときには変数nの中にはLED1(defineで定義しているので9)が格納されます。
digitalWrite(n,!digitalRead(n));
は
digitalWrite(9,!digitalRead(9));
として実行されるわけです。
Arduino 実験⑨
上記で作成したhanten関数を使って4つのLEDを0.5秒おきに順番に点灯させ、消灯させるプログラムを作成せよ。