[아두이노] [아두이노 실습] 푸쉬버튼 long press, short press 판단하기

아두이노 실습] 푸쉬버튼 long press, short press 판단하기

아두이노에서 푸쉬버튼 스위치의 long press와 short press를 구분하기 위해서는 스위치가 눌린 시간을 기록해 놓은 다음 눌린 스위치가 떨어질 때 스위치가 눌려있던 기간을 계산해 특정 시간보다 짧으면 short press, 길면 long press로 판단 해 주면 된다.

Untitled_Sketch_fzz_-_Fritzing_-__Schema

Untitled_Sketch_fzz_-_Fritzing_-__Breadb

이번 실험을 위해 연결한 회로이다. 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를 판정해 시리얼 포트로 결과를 출력해 준다.
0
0
이 글을 페이스북으로 퍼가기 이 글을 트위터로 퍼가기 이 글을 카카오스토리로 퍼가기 이 글을 밴드로 퍼가기

임베디드 보드

번호 제목 글쓴이 날짜 조회수
118 아두이노 ESP32 Analog Inputs (ADC) +4 icon 양재동메이커 02-12 17,502
117 아두이노 TIP : Serial의 Port가 Open 시점 확인 icon 양재동메이커 01-21 14,112
116 아두이노 ESP32 Boot Mode icon 양재동메이커 12-28 14,077
115 아두이노 아두이노 에러 리스트(Arduino Error list) icon 양재동메이커 11-24 19,273
114 아두이노 ESP32 main.cpp +1 icon 양재동메이커 11-19 14,331
113 아두이노 ESP32 EEPROM 와 IR Remote icon 양재동메이커 08-06 14,216
112 아두이노 Learn ESP32 icon 양재동메이커 06-25 13,923
111 라즈베리 파이 라즈베리 파이 (Raspberry Pi) 기초 icon 양재동메이커 06-19 15,358
110 라즈베리 파이 (동영상 강의) 라즈베리 파이 강좌 Link icon 양재동메이커 06-17 14,384
109 STM32 / MBED [MED] Switch debouncing icon HellMaker 12-30 16,509
108 기타 [타이젠] 아두이노의 16x2 LCD Display라이브러리 LiquidCrystal_I2C의 타이젠 포팅 icon 양재동메이커 09-15 16,264
107 기타 [타이젠] GPIO의 디지탈 출력과 입력 인터럽트의 C++ Class 제작 icon 양재동메이커 09-12 15,556
106 마이크로비트 서보 모터 icon HellMaker 09-03 15,331
105 마이크로비트 아날로그 온도센서 (마이크로 비트 센서 활용) icon HellMaker 09-01 15,956
104 마이크로비트 터치센서 (마이크로 비트 센서 활용) icon HellMaker 09-01 14,880
103 마이크로비트 디지털 홀 센서 (마이크로 비트 센서 활용) icon HellMaker 08-29 14,136
102 마이크로비트 리니어 홀 센서 (마이크로 비트 센서 활용) icon HellMaker 08-29 13,530
101 마이크로비트 불꽃 감지 센서 (마이크로 비트 센서 활용) icon HellMaker 08-26 13,910
100 마이크로비트 로터리 엔코더 (마이크로 비트 센서 활용) icon HellMaker 08-25 14,130
99 마이크로비트 2컬러 LED(3mm) (센서 활용) icon HellMaker 08-22 14,054