[아두이노] 푸시버튼 상태변화 감지 (에지 검출)

푸시버튼(스위치) 상태변화(State Change/Edge Detection) 감지

간혹 버튼이 몇 번 눌려졌는지 카운트 해야하는 경우가 있습니다. 버튼이 언제 OFF=>ON으로 상태가 변화하는 시점에 카운트를 증가시키면 될 것입니다. 예로써 버튼이 4번 눌려지면 LED를 ON하는 프로그램을 작성해 보겠습니다.


우선 아두이노 보드와 스위치 10KΩ 저항을 이용하여 아래와 같이 풀다운 회로를 구성합니다.


프로그램의 핵심은 다음과 같습니다. 버튼의 상태를 지속적으로 읽고 마지막 버튼 상태와 비교를 합니다. 만약 버튼의 현재 상태가 버튼의 마지막 상태와 다르고, HIGH 상태라면 버튼은 OFF에서 ON 된 것으로 판단할 수 있으며, 카운터를 1 증가시킵니다. 카운터가 4의 배수에 도달하면 내장 LED(13번 핀)을 구동하고 그 외의 경우 LED를 OFF합니다.

코드는 아래와 같습니다.

const int buttonPin = 2; // 푸시버튼 스위치가 연결된 핀번호
const int ledPin = 13; // 내장 LED 핀번호

int buttonPushCounter = 0; // 스위치가 눌려진 횟수를 기록
int buttonState = 0; // 스위치의 현재 상태
int lastButtonState = 0; // 스위치의 이전 상태

void setup() {
  // 스위치 연결된 입력핀 설정
  pinMode(buttonPin, INPUT);
  // LED 연결된 출력핀 설정
  pinMode(ledPin, OUTPUT);
  // 확인용 시리얼 모니터 구동
  Serial.begin(9600);
}

void loop() {
  // 스위치의 현재값 읽기
  buttonState = digitalRead(buttonPin);

  // 스위치의 이전 상태값과 비교
  if (buttonState != lastButtonState) {
    // 이전 상태와 다르고 스위치가 눌려진 상태면 카운터를 1 증가
    if (buttonState == HIGH) {
      buttonPushCounter++;
      Serial.println("on");
      Serial.print("number of button pushes: ");
      Serial.println(buttonPushCounter);
    } else {
      Serial.println("off");
    }

    // 스위치 디바운싱(Debouncing) 용도로 딜레이
    delay(50);
  }

  // 스위치의 현재 상태를 이전 상태로 저장
  lastButtonState = buttonState;

  
  // 카운터가 4의 배수에 도달했는지 확인해서 내장 LED 점등
  if (buttonPushCounter % 4 == 0) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }
}


코드 아래쪽에 스위치의 디바운스(Debouncing) 용도로 사용되었으며 좀 더 자세한 사항은 아래 링크를 참조 바랍니다.

[Arduino] Debouncing


끝.

댓글

이 블로그의 인기 게시물

[PLC] PLC 아날로그 입출력 기본

전력(kW) 계산하기 (직류, 교류 단상, 교류 삼상)

공압 속도 제어: 미터인 vs 미터아웃

[PLC] 채터링 현상과 입력 필터

제너 다이오드에 저항을 연결하는 이유

[python] 파이썬 pyplot 2차원 그래프 샘플 코드

[PLC] 래더 다이어그램과 PLC

공압회로 기호

[PLC] PLC 입출력 타입 - 싱크 & 소스 (Sink & Source)

3선 결선식 센서의 타입 PNP, NPN