본문 바로가기
Hardware/MCU(Arduino,ESP8266)

아두이노 버튼 짧게 누르기/길게 누르기 구현(ezButton 라이브러리)

by lovey25 2023. 10. 3.
반응형

아두이노 프로젝트에서 버튼은 프로젝트 기능을 풍부하게 만들어 줄 수 있는 중요한 요소입니다. 그러나, 하드웨어 적으로는 입력 핀에 연결된 스위치를 통해서 High/Low 전압 값을 읽어 들이는 간단한 메커니즘이지만 스프트웨어 적으로는 인터럽트, 디바운싱, 풀업/다운 저항 등 입문자 입장에서는 부담스러울 수 있는 여러 가지 고려사항이 있는 까다로운 요소입니다.

오늘은 이런 난감한 상황을 시원하게 해결해 줄 수 있는 "ezButton"이라는 라이브러리를 알아보겠습니다.

ezButton 라이브러리

ezButton은 debounce, 버튼의 닫힘, 열림 이벤트 등을 지원하는 아두이노 라이브러리입니다.  

지원기능

지원되는 기능은 다음과 같습니다.

  • Uses the internal pull-up resistor to avoid the floating value
  • Supports debounce to eliminate the chattering phenomenon
  • Supports the pressed and released events
  • Supports the counting (for FALLING, RISING and BOTH)
  • Easy to use with multiple buttons
  • All functions are non-blocking

라이브러리에 대한 더 자세한 내용은 아래 저장소에서 확인할 수 있습니다.

 

GitHub - ArduinoGetStarted/button: Button library supports debounce, pressed/released events. It is easy to use with multiple bu

Button library supports debounce, pressed/released events. It is easy to use with multiple buttons. It is designed for not only beginners but also experienced users - GitHub - ArduinoGetStarted/bu...

github.com

라이브러리의 최신 버전은 1.0.4입니다.

라이브러리 설치

제가 사용하는 platformIO 기준으로 platformio.ini 설정을 다음과 같이 해서 라이브러리 설치하였습니다. (아두이노 나노 보드 사용했습니다)

[env:miniatmega328]
platform = atmelavr
board = miniatmega328
framework = arduino
lib_deps = 
  arduinogetstarted/ezButton @ ^1.0.4

프로젝트 개요

라이브러리를 테스트하기 위해서 다음과 같은 간단한 프로젝트 만들어 보겠습니다.

아두이노 나노 보드에 푸시 버튼을 연결해서 600ms이상 롱클릭이 인식될 경우 내장된 LED를 켜고, 숏클릭 이벤트가 발생할 경우 반대로 LED를 끄도록 합니다. 버튼은 D7핀에 연결해서 내장 pullup 저항을 사용하기에 버튼과 나노보드 외 다른 부품은 전혀 필요하지 않습니다. (실제로는 버튼도 생략하고 와이어를 수동으로 붙였다 뗐다 해서 테스트했습니다.) 

Hardware

아두이노 나노 보드를 사용했으며, D7핀과 GND를 스위치로 연결합니다.

Software

펌웨어는 ezButton 라이브러리 샘플코드를 참조해서 약간 수정했습니다.

#include <ezButton.h>

const int SHORT_LONG_TIME = 600; // milliseconds

ezButton btn(7); // ezButton 객체를 D7 핀에 연결;

unsigned long pressedTime = 0;
unsigned long releasedTime = 0;
bool isPressing = false;
bool isLongDetected = false;

void setup()
{
  btn.setDebounceTime(50); // debounce time
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop()
{
  btn.loop(); // MUST call the loop() function first

  if (btn.isPressed()) // 버튼을 누르면
  {
    pressedTime = millis(); // 버튼을 누른 시간을 변수에 저장
    isPressing = true;
    isLongDetected = false;
  }

  if (btn.isReleased()) // 버튼을 놓았을 때
  {
    isPressing = false;
    releasedTime = millis(); // 버튼을 놓은 시간을 변수에 저장하고

    long pressDuration = releasedTime - pressedTime; // 버튼을 누르고 있었던 시간을 계산해서

    if (pressDuration < SHORT_LONG_TIME) // 길게 누르기 판단 기준보다 짧으면
    {
      digitalWrite(LED_BUILTIN, LOW); // 내장 LED를 끄기
    }
  }

  if (isPressing == true && isLongDetected == false) // 버튼이 눌려져 있고, 롱클릭 상태가 아니면
  {
    long pressDuration = millis() - pressedTime; // 얼마나 길게 눌려지고 있는지 계산해서

    if (pressDuration > SHORT_LONG_TIME) // 길게 누르기 판단 기준보다 길면
    {
      isLongDetected = true;
      digitalWrite(LED_BUILTIN, HIGH); // 내장 LED 켜기
    }
  }
}

먼저 라이브러리 사용을 위해서 "ezButton.h"를 맨 첫 줄에 추가해 주고, ezButton 객체를 "btn"이라는 이름으로 생성하고 D7핀과 연결(5행) 해 주었습니다.

14행:setDebounceTime() 함수를 사용해서 50ms 이하의 스위치 변화는 무시하도록 하여 chattering 현상을 방지합니다. 

15행: 내장 LED가 연결된 13번 핀을 출력 핀으로 설정합니다.

20행: loop() 함수의 맨 처음 btn객체의 loop() 함수를 호출해 주어 라이브러리가 동작하도록 해 줍니다.

그 외 롱/숏 클릭을 인지하는 로직은 코드 내부 주석으로 대신하겠습니다.

결과

버튼을 길게 클릭하면 LED가 켜지고, 짧게 클릭하면 LED가 다시 꺼집니다. 비교적 간단하게 길게 클릭, 짧게 클릭을 인식하는 기능 구현하였습니다. 프로젝트에 유용하게 사용할 수 있을 것 같네요.

와이어를 길~게 연결하면 LED가 켜지고, 살짝 연결하면 LED가 꺼져요.

 

끝!

반응형

댓글