第7回 解答例
LED・Motor・Buttonを分割する
演習の解答例。まず自分で書いてから読むこと。
ファイル構成
include/ ├── LED.hpp ├── Motor.hpp └── Button.hpp src/ ├── LED.cpp ├── Motor.cpp ├── Button.cpp └── main.cpp
LED
#pragma once
class LED {
public:
LED(int pin);
void begin();
void on();
void off();
void toggle();
private:
int pin;
bool state;
};#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
#pragma once
class Button {
public:
Button(int pin);
void begin();
bool isPressed() const;
private:
int pin;
};#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
#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 type | main.cppで#include "LED.hpp"を忘れている |