本文へ移動
「同じ処理を10回」を、
たった数行で書く方法。
Arduinoでは、LEDを何度も点滅させたり、センサーの値を何度も読み取ったりと、「同じ処理を繰り返す」場面が非常に多く登場します。その繰り返しを毎回コピペで書いていると、コードはすぐに長く読みにくくなってしまいます。この記事では、繰り返し処理の代表格であるfor文とwhile文の書き方を、専門用語ゼロの比喩と豊富なコード例を使って、初心者にもわかりやすく解説します。
| 構文 | 繰り返す条件 | 向いている場面 | 注意点 |
|---|---|---|---|
for文 |
回数があらかじめ決まっている | LEDをN回点滅、配列の全要素を処理 | 3つの部品(初期化・条件・更新)を書く |
while文 |
条件を満たしている間ずっと | ボタンが押されるまで待つ | 条件を更新し忘れると無限ループ |
繰り返し処理とは何か
「LEDを5回点滅させたい」というプログラムを、繰り返し処理を使わずに書くとどうなるでしょうか。
digitalWrite(8, HIGH); delay(300); digitalWrite(8, LOW); delay(300);
digitalWrite(8, HIGH); delay(300); digitalWrite(8, LOW); delay(300);
digitalWrite(8, HIGH); delay(300); digitalWrite(8, LOW); delay(300);
digitalWrite(8, HIGH); delay(300); digitalWrite(8, LOW); delay(300);
digitalWrite(8, HIGH); delay(300); digitalWrite(8, LOW); delay(300);
// 5回分をすべて手で書いた例。もし100回にしたくなったら…?
同じ4行を5回コピペしただけですが、これを100回にしたいと言われたら大変です。こういう「同じ処理を何度も繰り返したい」という場面で使うのが、for文とwhile文という2つの構文です。
料理のレシピに例えると分かりやすいかもしれません。「卵を5個、1個ずつ割ってボウルに入れる」という作業を、いちいち「1個目を割る」「2個目を割る」と書く代わりに、「卵を1個ずつ割ってボウルに入れる、を5回繰り返す」と1行にまとめるようなものです。
for文の書き方:3つの部品に分解する
for文は、カッコの中に「初期化」「条件」「更新」という3つの部品をセミコロン(;)で区切って書きます。この3つの役割を理解することが、for文をマスターする一番の近道です。
for (int i = 0; i < 5; i++) {
// ここに繰り返したい処理を書く
}
iという短い名前がよく使われますが、これは特別な意味を持つ単語ではなく、ただの変数名です。3つ目の「更新」を書き忘れる、あるいは書き間違えると、iの値がいつまでも条件を満たし続けてしまい、ループが永遠に終わらない「無限ループ」になってしまいます。3つの部品はセットで考える習慣をつけましょう。
基本文法の全体像を先に押さえておきたい方はArduinoのコードの書き方(コピペ可20選)もあわせてご覧ください。
for文の実践例:LEDを指定回数だけ点滅させる
先ほどコピペで5回書いていたLEDの点滅処理を、for文で書き直してみましょう。
const int LED_PIN = 8;
void setup() {
pinMode(LED_PIN, OUTPUT);
}
void loop() {
for (int i = 0; i < 5; i++) { // 0,1,2,3,4 の5回繰り返す
digitalWrite(LED_PIN, HIGH);
delay(300);
digitalWrite(LED_PIN, LOW);
delay(300);
}
delay(2000); // 5回点滅したら2秒休む
}
点滅させる回数を変えたい場合は、条件部分の5という数字を書き換えるだけです。処理の中身を何度もコピペする必要がなくなるのが、for文の大きなメリットです。
while文の書き方:条件が真の間繰り返す
while文はfor文よりもシンプルな見た目をしています。カッコの中には「条件」だけを書き、その条件がtrue(真)である間、処理が繰り返されます。
int i = 0; // カウンターは自分で外に用意しておく
while (i < 5) { // iが5未満の間繰り返す
// ここに繰り返したい処理を書く
i++; // 更新も自分でループの中に書く
}
for文が「初期化・条件・更新」を1行にまとめて書けるのに対して、while文はカッコの中に条件しか書きません。そのため、カウンター変数の用意(初期化)とその更新は、自分でループの外と中にそれぞれ書く必要があります。
while文は「回数を数える」ためだけでなく、「ボタンが押されるまで」「センサーの値がある基準に達するまで」のように、いつ終わるか分からない繰り返しを書くのが得意です。回数ではなく状況で判断したい時にこそ、while文の出番です。
while文の実践例:ボタンが押されるまで待つ
while文が最も活躍するのが、「何かが起きるまで待つ」という処理です。ボタンが押されるまでプログラムをその場で待たせる例を見てみましょう。
const int BUTTON_PIN = 2;
const int LED_PIN = 8;
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
Serial.begin(9600);
Serial.println("ボタンが押されるのを待っています…");
}
void loop() {
while (digitalRead(BUTTON_PIN) == HIGH) {
// ボタンが押されていない(HIGH)間はここでずっと足踏み
}
// ループを抜けた=ボタンが押された(LOW)
digitalWrite(LED_PIN, HIGH);
Serial.println("ボタンが押されました!");
delay(1000);
digitalWrite(LED_PIN, LOW);
}
この書き方は、while文がループしている間、他の処理(他のセンサーを読む、シリアル通信を受け取るなど)が一切できなくなります。用途を「単純に何かを待つだけ」の場面に絞って使うのがコツです。INPUT_PULLUPの仕組みについてはボタン回路の基礎から応用までで詳しく解説しています。
for文とwhile文の使い分け
ここまでの内容を整理して、どんな場面でどちらを選べばよいか、比較して確認しましょう。
for文が向いている場面
- 「何回繰り返すか」が最初から決まっている
- 配列の中身を最初から最後まで処理したい
- カウンター変数を1行にまとめてすっきり書きたい
while文が向いている場面
- 「いつ終わるか」が状況によって変わる
- ボタンが押されるまでなど、条件で待ちたい
- 回数を数える意味があまりない繰り返し
| 項目 | for文 | while文 |
|---|---|---|
| カッコの中身 | 初期化 ; 条件 ; 更新 | 条件のみ |
| 向いている繰り返し | 回数が決まっている | 条件次第で終わる |
| カウンター変数 | その場で用意できる | あらかじめ自分で用意する |
| 無限ループのリスク | 更新の書き忘れに注意 | 条件変数の更新忘れに特に注意 |
| 典型的な使用例 | LEDをN回点滅、配列の全走査 | ボタン待ち、通信の応答待ち |
「繰り返す回数を、プログラムを書いている時点で自分は知っているか?」——知っているならfor文、知らない(実行してみないと分からない)ならwhile文、というのが基本的な判断基準です。
実践コード:センサーの値をfor文で処理する
for文は、複数のセンサーやピンをまとめて処理したい時にも便利です。3つのLEDを順番に光らせる例で、配列とfor文の組み合わせを見てみましょう。
const int LED_PINS[] = {8, 9, 10}; // 3つのLEDピンをまとめて管理
const int LED_COUNT = 3;
void setup() {
for (int i = 0; i < LED_COUNT; i++) {
pinMode(LED_PINS[i], OUTPUT); // 3本まとめてOUTPUTに設定
}
}
void loop() {
for (int i = 0; i < LED_COUNT; i++) {
digitalWrite(LED_PINS[i], HIGH); // 1つずつ順番に点灯
delay(200);
digitalWrite(LED_PINS[i], LOW);
}
}
LED_PINSの中から、iに対応する番号のピンを取り出しています。iが0なら8番ピン、1なら9番ピン、2なら10番ピンという具合に、for文が回るたびに違うピンが処理されます。pinMode()を3回コピペする代わりに、setup()の中でもfor文を使っている点にも注目してください。ピンの役割設定について詳しく知りたい方は、あわせて基礎的な内容も確認しておくと理解が深まります。センサーの選び方はArduino用センサー完全ガイド16選、配線の基礎はブレッドボード完全攻略ガイドで解説しています。
ありがちな間違いと見分け方のコツ
for文・while文でつまずきやすいポイントを、チェックリスト形式でまとめました。「書き込みはできるのに動きがおかしい」という時はここを確認してみてください。
更新部分を書き忘れて無限ループになっていないか。特にwhile文では、条件に関わる変数をループの中で更新する処理を、自分の手で書き込む必要があります。
セミコロン(;)の位置を間違えていないか。for (int i = 0; i < 5; i++);のように、閉じカッコの直後に余計なセミコロンを書いてしまうと、中身が空っぽのループになり意図した処理が実行されません。
配列の範囲を超えて処理していないか。要素数が3つの配列に対してi <= 3のように書いてしまうと、存在しない4つ目を読もうとしてしまいます。条件はi < 要素数が基本です。
whileループの中で他の処理が止まっていないか。「ボタンが押されるまで待つ」ようなwhile文は、その間ずっとプログラム全体を止めてしまいます。他の処理も並行させたい場合は、if文への書き換えを検討しましょう。
カウンター変数の名前が重複していないか。for文を入れ子(ループの中にループ)にする際、両方ともiという名前を使ってしまうと混乱の元になります。外側はi、内側はjのように使い分けましょう。
FAQ・まとめ
for文とwhile文はどう使い分ければいいですか?
「何回繰り返すか」が最初からはっきり決まっている場合はfor文が向いています。逆に「ボタンが押されるまで」「センサーの値がある基準を超えるまで」など、繰り返す回数が状況によって変わる場合はwhile文が向いています。回数が数字で決まっているならfor、条件が満たされるまで続けたいならwhile、と覚えるとよいでしょう。
for文の書き方で気をつけることは?
for文は「初期化」「条件」「更新」という3つの部品をセミコロンで区切って書きます。特に3つ目の更新部分(i++など)を書き忘れると、条件が永遠に満たされたままになり、無限ループになってしまいます。3つの部品それぞれの役割を意識しながら書くことが大切です。
while文で無限ループになってしまうのはなぜですか?
while文はカッコの中の条件がtrue(真)である間、処理を繰り返し続けます。ループの中で条件に関わる変数を更新し忘れると、条件が永遠にtrueのままとなり、処理がそこから抜け出せなくなります。while文を書いたら、ループの中のどこかで条件が変化する仕組みが用意されているか、必ず確認しましょう。
delay()を使わずに繰り返し処理をする方法はありますか?
for文やwhile文自体はdelay()なしでも使えますが、LEDの点滅などタイミングを伴う処理では、delay()の代わりにmillis()を使って時間を管理する方法があります。ただし、これは中級者向けの内容になるため、まずは本記事のようにdelay()を使った書き方で「繰り返し処理」の基本を身につけることをおすすめします。
for文とwhile文は、どちらも「同じ処理を繰り返す」ための道具ですが、得意な場面が異なります。回数がはっきり決まっているならfor文、条件が満たされるまで待ちたいならwhile文——この使い分けさえ押さえれば、長く読みにくかったコピペだらけのコードが、すっきりと整理された読みやすいコードに変わります。まずは3章と5章の実践コードを実際に書き込んで、LEDの点滅やボタンの反応を自分の目で確かめてみてください。
コメント