第7回 解答例

LED・Motor・Buttonを分割する

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

ファイル構成

include/
├── LED.hpp
├── Motor.hpp
└── Button.hpp

src/
├── LED.cpp
├── Motor.cpp
├── Button.cpp
└── main.cpp

LED

include/LED.hpp
#pragma once

class LED {
public:
    LED(int pin);

    void begin();
    void on();
    void off();
    void toggle();

private:
    int pin;
    bool state;
};
src/LED.cpp
#include <Arduino.h>

#include "LED.hpp"

LED::LED(int pin)
    : pin(pin), state(false) {
}

void LED::begin() {
    pinMode(pin, OUTPUT);
    off();
}

void LED::on() {
    state = true;
    digitalWrite(pin, HIGH);
}

void LED::off() {
    state = false;
    digitalWrite(pin, LOW);
}

void LED::toggle() {
    if (state) {
        off();
    } else {
        on();
    }
}

Button

include/Button.hpp
#pragma once

class Button {
public:
    Button(int pin);

    void begin();
    bool isPressed() const;

private:
    int pin;
};
src/Button.cpp
#include <Arduino.h>

#include "Button.hpp"

Button::Button(int pin)
    : pin(pin) {
}

void Button::begin() {
    pinMode(pin, INPUT_PULLUP);
}

bool Button::isPressed() const {
    return digitalRead(pin) == LOW;
}

main.cpp

src/main.cpp
#include <Arduino.h>

#include "Button.hpp"
#include "LED.hpp"
#include "Motor.hpp"

LED led(LED_BUILTIN);
Button button(9);
Motor motor(24);

void setup() {
    led.begin();
    button.begin();
    motor.begin();
}

void loop() {
    if (button.isPressed()) {
        led.on();
        motor.setSpeed(50);
    } else {
        led.off();
        motor.stop();
    }
}

main.cppが短く、何をしているかがそのまま読める状態になっているかを確認すること。

よくある誤り

症状原因
undefined reference to LED::on().cpp側でLED::を書き忘れ、ただの関数を定義している
redefinition of class LEDヘッダガード(#pragma once)がない
'pinMode' was not declared.cppで#include <Arduino.h>を忘れている
'LED' does not name a typemain.cppで#include "LED.hpp"を忘れている

→ 第7回の本文に戻る