아두이노에서 푸쉬버튼 스위치의 long press와 short press를 구분하기 위해서는 스위치가 눌린 시간을 기록해 놓은 다음 눌린 스위치가 떨어질 때 스위치가 눌려있던 기간을 계산해 특정 시간보다 짧으면 short press, 길면 long press로 판단 해 주면 된다.
이번 실험을 위해 연결한 회로이다. 13번 핀에 시스템이 동작하는지 확인하기 위한 heartbeat LED를 연결 해 주고 4번 핀에 푸쉬버튼 스위치를 연결해 주었다. 4번 핀의 pinMode로 INPUT_PULLUP을 사용할 것이기 때문에 추가로 저항을 연결할 필요는 없다.
#define SW 4
#define RELEASED 0
#define SHORT_PRESS 1
#define LONG_PRESS 2
#define SW_THRESHOLD 500
#define HB_LED 13
void setup() {
pinMode(HB_LED, OUTPUT);
pinMode(SW, INPUT_PULLUP);
Serial.begin(115200);
}
void loop() {
static boolean hbLedStat = LOW;
static unsigned long last;
int swState = readSw();
if (SHORT_PRESS == swState) {
Serial.println("SWITCH SHORT PRESSED");
} else if (LONG_PRESS == swState) {
Serial.println("SWITCH LONG PRESSED");
}
if ((millis()-last) >= 500) {
digitalWrite(HB_LED, hbLedStat);
hbLedStat = !hbLedStat;
last = millis();
}
}
int readSw()
{
static boolean prev = HIGH;
static unsigned long last, pressed;
boolean curr;
if ((millis()-last) >= 10) {
curr = digitalRead(SW);
if ((HIGH==prev)&&(LOW==curr)) {
pressed = millis();
prev = LOW;
} else if ((LOW==prev)&&(HIGH==curr)) {
prev = HIGH;
if ((millis()-pressed) > SW_THRESHOLD) {
return LONG_PRESS;
} else {
return SHORT_PRESS;
}
}
last = millis();
}
return RELEASED;
}
코드는 위와 같다. 프로그램이 실행되면 heartbeat LED는 1초 간격으로 계속 깜빡이고 스위치를 눌렀다 떼면 누르고 있던 시간 길이에 따라 short press, long press를 판정해 시리얼 포트로 결과를 출력해 준다.