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

푸시버튼(스위치) 상태변화(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


끝.

댓글

이 블로그의 인기 게시물

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

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

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

[아두이노] 가변저항(Potential Divider)과 전압분배(Voltage Divider)

NPN, PNP 트랜지스터 차이점

[주식] 한국거래소(KRX) 데이터 API 입문 가이드

[PLC] 센서 NPN, PNP 출력 타입별 결선방법 (OMRON E2E-X 시리즈 3선식 배선)

[수학] 연속 확률 변수의 기대값 수식은 어떻게 유도될까?

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

[농사] 천연 식물성 살충제 종류 및 제조법