여기에서는 입력 장치로 많이 사용되는 푸시 버튼을 객체화 시키는 예제를 작성해 보도록 하겠다. 푸시버튼도 디지털 핀에 연결할 수 있으며 외부에서 풀업(pull-up)을 시켜주느냐 아니면 내부 풀업을 연결하느냐를 지정할 수 있도록 하겠다. Led 클래스와 마찬가지로 연결된 핀 번호는 private 변수에 저장한다. 그리고 내부에 풀업이 되었는지의 여부를 저장하는 변수도 private변수에 저장한다.
클래스의 선언을 다음과 같다.
class Button {public:Button(byte, boolean); // 생성자boolean isPushed(); // 버튼이 눌렸다면 true를 반환하는 멤버 함수private:byte _pin; // 연결된 핀boolean _internalPullup; //내부에 풀업이 되었는가}; |
생성자를 보면 입력 인수의 타입만 지정해 주었음을 알 수 있다. 생성자와 멤버 함수의 구현부는 다음과 같다.
// 생성자의 구현Button::Button(byte pin, boolean internalPullUp = true) {_pin = pin;_internalPullup = internalPullUp;if (_internalPullup)pinMode(_pin, INPUT_PULLUP);elsepinMode(_pin, INPUT);}// 멤버 함수의 구현boolean Button::isPushed() {return (digitalRead(_pin) == LOW)? true:false;} |
생성자의 구현을 보면 다음과 같이 기본값 인자가 사용되었다.
Button::Button(byte pin, boolean internalPullUp = true) {...} |
이렇게 구현해 놓으면 생성자는 인자를 하나를 받을 수도 있고 두 개를 받을 수도 있는데 하나만 있다면 두 번째는 자동으로 true로 지정된다. 즉, 다음과 같이 두 가지로 생성하는 것이 가능하다.
Button btn1(12); // 내부 풀업 저항을 연결하는 경우Button btn2(11, false); // 외부에서 풀업 된 경우 |
두 번째 인자의 값에 따라서 pinMode()함수를 적절하게 호출하였음을 알 수 있다.
풀업 저항이 연결되었을 경우 푸시버튼을 누른 상태에서 digitalRead()함수의 반환값은 LOW가 된다. 따라서 이에 맞게 멤버 함수 isPushed() 가 작성되었음을 알 수 있다.
만약 클래스 선언이 Button.h에, 구현부가 Button.cpp 에 저장되어 라이브러리를 구성했다면, 이것을 이용하여 버튼이 눌리면 내장 LED가 켜지고 그렇지 않으면 꺼지는 프로그램을 다음과 같이 작성할 수 있다.
#include <Button.h> // 라이브러리 인클루드Button btn1(12); //12번 핀에 내부 풀업 연결void setup() {pinMode(13, OUTPUT);}void loop() {if (btn1.isPushed()) // 만약 버튼이 눌렸다면digitalWrite(13, HIGH);else // 그렇지 않다면 (눌리지 않았다면)digitalWrite(13, LOW);} |
이와 같이 class를 이용하여 객체화를 시도하면 프로그램을 좀 더 직관적으로 작성할 수 있다.
댓글 없음:
댓글 쓰기