1) 풀 업 방식
2) 풀다운 방식
// Button.h
#pragma once
#include <Arduino.h>
// 매개변수가 없는 void 함수에 대한 포인터를 button_callback_t로 정의
typedef void(*button_callback_t)();
class Button{
protected:
int pin;
button_callback_t callback; // callback 함수에 대한 포인터
public:
Button(int pin);
void setCallback(button_callback_t callback);
int read();
void check();
};
#include "Button.cpp"
Button::Button(int pin): pin(pin){ //버튼 입력핀
pinMode(pin. INPUT_PULLUP);
callback = NULL;
}
void Button::setCallback(button_callback_t callback){ // 함수 주소
this -> callback = calback;
}
// 누른 경우에 H, 뗀 경우에 L을 리턴
int Button::read(){
return !digitalRead(pin);
}
void Button::check(){ // read에 변화가 생기면, 함수 호출
bool o_sw, n_sw;
o_sw = read();
delay(10); // 디바운스를 위한 지연시간
n_sw = read();
if(o_sw == 0 && n_sw ==1){ // 버튼을 누른 시점
if(callback != NULL){
callback();
}
}
}
//Button.cpp
#include <Led.h>
#include "Button.h"
Button btn(2);
Led leds[4] = {
Led(8), Led(9), Led(10), Led(11)
};
int out_no = -1; // 출력 패턴 번호(0 - 3)
void move_led(){ // 순차점등 하는 함수
out_no = (++out_no)%4; //다음 출력 패턴 번호 설정
Serial.println(out_no);
for(int n = 0; n < 4; n++){
leds[n].setValue(n == out_no);
}
void setup(){
btn.setCallback(move_led); // 왜 리턴을 안하고 이렇게 하는가.. 싯팔
}
void loop(){
btn.check();
}
#include <Led.h>
#include <Button.h>
Button btn
Button btn(2);
Led leds[4] = {
Led(8), Led(9), Led(10), Led(11)
};
int out_no = -1
unsigned long old_time = 0; // 프로그램 ms 경과시간
void move_led(){
out_no = (out_no + 1) % 4;
for(int n = 0; n < 4; n++)
{
leds[n].setValue(n==out_no);
}
}
void toggle(){
led.toggle();
}
void setup(){
btn.setCallback(toggle);
old_time = millis();
}
void loop(){
btn.check()
unsigned long current_time = millis(); // 현재 ms 시간
if(current_time - old_time >= 1000){ // 더 제대로된 디바운싱
move_led();
old_time = current_time;
}