본문 바로가기
  • 재미있는 펌웨어와 코딩
ESP32/펌웨어

아두이노 버튼 라이브러리

by 윤재윤호 2023. 10. 3.

 아두이노에 버튼을 연결하여 사용시 하드웨어와 소프트웨어 두 종류에

신경을 써야 합니다. 버튼을 누를 때 발생하는 채터링( chattering )

발생 하여 한 번 눌렀지만 입력이 여러번 반복되어 생각하지 못한

오류를 발생하게 됩니다.

 

<채터링 방지>

하드웨어

     - 버튼 입력에 0.1uF 콘덴서를 GND에 연결한다.

     - 콘덴서 용량이 커지면 입력 속도가 늦어진다.

 

소프트웨어

     - 버튼 입력시 일정 시간 동안 입력이 유지 되는지 확인 한다.

     - 입력 체크 시간(Debounce Time)이 너무 길면 입력 속도가 늦어진다.

 

또한, 버튼이 한 번 눌렀을 때에만 동작 해야할 때도 있고 버튼을 뗐을 때도

한 번만 동작 해야할 때도 있습니다. 또는 길게 누르고 있을 경우도 있어서

이러한 복잡한 동작들을 라이브러리화 시켜서 사용하면 편리 합니다.

 

SButton.zip
0.00MB

SButton.zip 파일을 받아서 압축을 풀어 사용하시는 프로젝트에 포함하여 사용 하시면 됩니다.

 

사용방법 예제 입니다.

#include "SButton.h"

int SW1 = 13; // 스위치 입력 GPIO13
SButton sw( SW1, true ); // GPIO13번, 내부 풀업 설정

void setup() {
  Serial.begin( 115200 );
  sw.SetHoldTime( 2000 ); // 기본 3초
}

void loop() {
  sw.update(); // 스위치 상태 확인
  
  if( sw.isDown() ) // 스위치를 눌렀을 때.
    Serial.println( "Switch ON" );
    
  if( sw.isUp() ) // 스위치를 뗐을 때.
    Serial.println( "Switch OFF" );
    
  if( sw.isHold() ) // 스위치를 누르고 있을 때.
    Serial.println( "Switch HOLD" );
}

실행화면

시리얼창

버튼 라이브러리 정의

#include "SButton.h"

 

버튼 객체 생성

풀업이 가능한 GPIO에서만 풀업을 true로 설정이 가능합니다.

풀업을 지원하지 않는 포트는 버튼에 풀업저항을 반드시 달아야 합니다.

int SW1 = 13; // 스위치 입력 GPIO13
SButton sw( SW1, true ); // GPIO13번, 내부 풀업 설정

 

setup()에 버튼에 대한 설정을 합니다.

기본적으로 디폴트값이 있으므로 굳이 설정을 하지 않아도 됩니다.

sw.SetHoldTime( 2000 ); // 기본 3초

 

버튼 업데이트는 loop() 안에 반드시 있어야 됩니다.

sw.update(); // 스위치 상태 확인

 

버튼 입력시 동작

if( sw.isDown() ) // 스위치를 눌렀을 때.
  Serial.println( "Switch ON" );
    
if( sw.isUp() ) // 스위치를 뗐을 때.
  Serial.println( "Switch OFF" );
    
if( sw.isHold() ) // 스위치를 누르고 있을 때.
  Serial.println( "Switch HOLD" );

 

동작을 해보시면 아시겠지만 각각 한 번만 동작하는 함수가 있어서 간단히 코딩을 할 수 있습니다.

그 외 동작은 헤더 파일을 보시면 됩니다.

 

void SetDebounceTime( unsigned long debounce_time );

채터링 체크 시간을 설정. (msec)


void SetHoldTime( unsigned long hold_time );

버튼을 길게 눌렀을 때 동작하는 시간을 설정.  (msec)


void SetAutoTime( unsigned long auto_time );

버튼을 길게 누르고 있는 경우 버튼 입력이 자동으로 반복되어지는 동작 시간 설정.  (msec)

설명이 어려우므로 이해하기 쉽게 설명 드리겠습니다.

버튼을 눌러서 어떤 숫자를 증가 시키는데 한 번에 한 번만 증가 해야 하고 누르고 있으면

자동으로 증가 해야 할 경우가 있습니다. 홀드 기능과 다릅니다. 

아래에 설명할 isAuto 함수와 같이 사용 합니다.


void update( void );

버튼의 상태를 확인합니다. loop() 함수에 반드시 넣어야 합니다.


int read( void );

버튼의 현재 상태를 반환 합니다.


bool isDown( void );

버튼이 눌렸는지 확인. 한 번만 동작함.(누르고 있는 동안)

Falling Wedge 검사.


bool isUp( void );

버튼이 뗐는지 확인. 한 번만 동작함.(누르고 있지 않는 동안)

Rising Wedge 검사.


bool isHold( void );

버튼을 일정시간 눌렸는지 확인. 한 번만 동작함.(누르고 있는 동안)


bool isAuto( void );

SetAutoTime 에서 설정한 시간이 지난 다음 버튼을 계속해서

누르고 있으면 동작.(누르고 있는 동안 동작함)


void clear( void );

버튼의 모든 상태를 초기화.


void wait( void );

버튼을 뗄때 까지 기다림. (하나의 버튼으로 여러 동작을 할 때 유용함)