第2回 解答例

繰り返しと条件分岐

演習の解答例。まず自分で書いてから読むこと。

1. 0〜9をシリアル出力

void setup() {
    Serial.begin(115200);

    for (int i = 0; i < 10; i++) {
        Serial.println(i);
    }
}

void loop() {
}

2. LEDを一定回数点滅させる

const int LED_PIN = LED_BUILTIN;
const int BLINK_MS = 200;

void blink(int times) {
    for (int i = 0; i < times; i++) {
        digitalWrite(LED_PIN, HIGH);
        delay(BLINK_MS);

        digitalWrite(LED_PIN, LOW);
        delay(BLINK_MS);
    }
}

void setup() {
    pinMode(LED_PIN, OUTPUT);
    blink(5);
}

void loop() {
}

3. ボタンが押されている間だけLED点灯

const int LED_PIN = LED_BUILTIN;
const int BUTTON_PIN = 9;

void setup() {
    pinMode(LED_PIN, OUTPUT);
    pinMode(BUTTON_PIN, INPUT_PULLUP);
}

void loop() {
    bool pressed = (digitalRead(BUTTON_PIN) == LOW);

    digitalWrite(LED_PIN, pressed ? HIGH : LOW);
}

なぜwhileで待たないのか

次のように書いても動くが、勧められない。

// 良くない例
while (digitalRead(BUTTON_PIN) == LOW) {
    digitalWrite(LED_PIN, HIGH);
}

このwhileの中にいる間、他の処理は一切動かない。センサを読む、通信する、別のLEDを制御するといったことが全部止まる。loop()は繰り返し呼ばれるのだから、「1回分の判断」だけを書いて抜けるのが基本である。

→ 第2回の本文に戻る