아두이노 - 버튼 - 긴 누름 단 누름 | Arduino - Button - Long Press Short Press

우리는 배울 것입니다:

처음 세 부분에서, 우리는 원칙적으로 감지하는 방법을 배웁니다.

마지막 부분에서는 디바운스를 적용하여 실제 사용 시 감지하는 방법을 배웁니다. 버튼을 위해 디바운스가 필요한 이유를 확인하려면 왜 버튼에 디바운스가 필요한가를 참고하세요. 디바운스 처리를 하지 않으면 버튼의 짧은 누름을 잘못 감지할 수 있습니다.

준비물

1×Arduino Uno Amazon
1×USB 2.0 cable type A/B 쿠팡 | Amazon
1×Push Button Amazon
1×(Optional) Panel-mount Push Button Amazon
1×Breadboard 쿠팡 | Amazon
1×Jumper Wires Amazon
1×(Optional) 9V Power Adapter for Arduino Amazon
1×(Recommended) Screw Terminal Block Shield for Arduino Uno 쿠팡 | Amazon
1×(Optional) Transparent Acrylic Enclosure For Arduino Uno Amazon
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.

버튼에 대하여

버튼(핀아웃, 작동 방식, 프로그래밍 방법 등)에 대해 잘 모르시다면, 다음 튜토리얼에서 배워보세요:

아두이노 - 버튼 튜토리얼

선연결

Arduino Button Wiring Diagram

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

이 튜토리얼에서는 내부 풀업 저항을 사용할 것입니다. 그러므로 버튼의 상태는 정상일 때 HIGH이고 눌렸을 때는 LOW입니다.

단축키 감지 방법

누른 상태에서 릴리스된 상태까지의 시간 간격을 측정합니다. 이 기간이 정의된 시간보다 짧으면 짧은 누름 이벤트가 감지됩니다.

한 단계씩 살펴봅시다:

  • 최대 단축 키 누름이 지속되는 시간을 정의합니다.
const int SHORT_PRESS_TIME = 500; // 500 밀리초
  • 버튼이 눌렸는지 감지하고 눌린 시간을 저장하세요.
if(lastState == HIGH && currentState == LOW) pressedTime = millis();
  • 버튼이 놓여진 것을 감지하고 놓인 시간을 저장하세요.
if(lastState == LOW && currentState == HIGH) releasedTime = millis();
  • 압력 지속 시간 계산 및
long pressDuration = releasedTime - pressedTime;
  • 누름 지속 시간을 정의된 짧은 누름 시간과 비교하여 짧은 누름을 판단합니다.
if( pressDuration < SHORT_PRESS_TIME ) Serial.println("짧은 누름이 감지되었습니다");

단문 클릭 감지를 위한 아두이노 코드

/* * 이 Arduino 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-button-long-press-short-press */ // 상수는 변경되지 않습니다. 핀 번호를 설정하는 데 여기에서 사용됩니다: const int BUTTON_PIN = 7; // 푸시버튼 핀의 번호 const int SHORT_PRESS_TIME = 500; // 500 밀리초 // 변수는 변경될 것입니다: int lastState = LOW; // 입력 핀에서의 이전 상태 int currentState; // 입력 핀에서의 현재 읽기 unsigned long pressedTime = 0; unsigned long releasedTime = 0; void setup() { Serial.begin(9600); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // 스위치/버튼의 상태를 읽습니다: currentState = digitalRead(BUTTON_PIN); if(lastState == HIGH && currentState == LOW) // 버튼이 눌림 pressedTime = millis(); else if(lastState == LOW && currentState == HIGH) { // 버튼이 놓임 releasedTime = millis(); long pressDuration = releasedTime - pressedTime; if( pressDuration < SHORT_PRESS_TIME ) Serial.println("짧은 누름이 감지되었습니다"); } // 마지막 상태를 저장합니다 lastState = currentState; }

사용 방법

  • 위의 코드를 아두이노 IDE를 통해 아두이노에 업로드하세요.
  • 버튼을 몇 번 짧게 누르세요.
  • 시리얼 모니터에서 결과를 확인하세요.
COM6
Send
A short press is detected
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

※ NOTE THAT:

시리얼 모니터는 한 번의 누름에 대해 여러 번의 짧은 누름 감지를 보여줄 수 있습니다. 이것은 버튼의 정상적인 동작입니다. 이 현상을 "채터링 현상"이라고 합니다. 이 문제는 이 튜토리얼의 마지막 부분에서 해결될 것입니다.

장시간 누르기 감지 방법

롱 프레스를 감지하기 위한 두 가지 사용 사례가 있습니다.

  • 버튼을 놓자마자 롱 프레스 이벤트가 감지됩니다.
  • 버튼이 아직 놓이지 않았더라도 버튼이 눌리는 동안 롱 프레스 이벤트가 감지됩니다.

첫 번째 사용 사례에서, 우리는 눌린 이벤트와 릴리스된 이벤트 사이의 시간 지속을 측정합니다. 지속 시간이 정의된 시간보다 길면, 롱-프레스 이벤트가 감지됩니다.

두 번째 사용 사례에서, 버튼이 눌린 후, 우리는 버튼이 놓일 때까지 지속적으로 누르는 시간을 측정하고 롱 프레스 이벤트를 확인합니다. 버튼이 눌려지는 동안, 지속 시간이 정의된 시간보다 길 경우, 롱 프레스 이벤트가 감지됩니다.

아두이노 코드: 길게 눌렀다가 놓았을 때 감지하기

/* * 이 Arduino 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-button-long-press-short-press */ // 상수는 변경되지 않습니다. 핀 번호를 설정하는 데 여기서 사용됩니다: const int BUTTON_PIN = 7; // 푸시버튼 핀의 번호 const int LONG_PRESS_TIME = 1000; // 1000 밀리초 // 변수는 변경될 것입니다: int lastState = LOW; // 입력 핀의 이전 상태 int currentState; // 입력 핀에서 현재 읽기 unsigned long pressedTime = 0; unsigned long releasedTime = 0; void setup() { Serial.begin(9600); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // 스위치/버튼의 상태를 읽습니다: currentState = digitalRead(BUTTON_PIN); if(lastState == HIGH && currentState == LOW) // 버튼이 눌렸습니다 pressedTime = millis(); else if(lastState == LOW && currentState == HIGH) { // 버튼이 해제되었습니다 releasedTime = millis(); long pressDuration = releasedTime - pressedTime; if( pressDuration > LONG_PRESS_TIME ) Serial.println("A long press is detected"); } // 마지막 상태를 저장합니다 lastState = currentState; }

사용 방법

  • 위의 코드를 아두이노 IDE를 통해 아두이노에 업로드하세요.
  • 1초 후에 버튼을 눌렀다가 놓으세요.
  • 시리얼 모니터에서 결과를 확인하세요.
COM6
Send
A long press is detected
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

버튼이 놓인 직후에만 롱 프레스 이벤트가 감지됩니다.

아두이노 코드: 길게 누르기 감지하기

/* * 이 Arduino 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-button-long-press-short-press */ // 상수는 변경되지 않습니다. 핀 번호를 설정하는 데 여기서 사용됩니다: const int BUTTON_PIN = 7; // 푸시버튼 핀의 번호 const int LONG_PRESS_TIME = 1000; // 1000 밀리초 // 변수는 변경될 것입니다: int lastState = LOW; // 입력 핀에서의 이전 상태 int currentState; // 입력 핀에서의 현재 읽기 값 unsigned long pressedTime = 0; bool isPressing = false; bool isLongDetected = false; void setup() { Serial.begin(9600); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // 스위치/버튼의 상태를 읽습니다: currentState = digitalRead(BUTTON_PIN); if(lastState == HIGH && currentState == LOW) { // 버튼이 눌림 pressedTime = millis(); isPressing = true; isLongDetected = false; } else if(lastState == LOW && currentState == HIGH) { // 버튼이 릴리즈됨 isPressing = false; } if(isPressing == true && isLongDetected == false) { long pressDuration = millis() - pressedTime; if( pressDuration > LONG_PRESS_TIME ) { Serial.println("긴 누름이 감지됨"); isLongDetected = true; } } // 마지막 상태를 저장합니다 lastState = currentState; }

사용 방법

  • 위의 코드를 아두이노 IDE를 통해 아두이노에 업로드하세요.
  • 몇 초 후 버튼을 눌렀다가 놓으세요.
  • 시리얼 모니터에서 결과를 확인하세요.
COM6
Send
A long press is detected
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

버튼이 아직 릴리스되지 않았을 때만 롱-프레스 이벤트가 감지됩니다.

긴 누름과 짧은 누름을 모두 감지하는 방법

"짧게 누르기" 및 "길게 누른 후 놓기"

/* * 이 Arduino 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-button-long-press-short-press */ // 상수는 변하지 않습니다. 핀 번호를 설정하는 데 여기에서 사용됩니다: const int BUTTON_PIN = 7; // 버튼 핀의 번호 const int SHORT_PRESS_TIME = 1000; // 1000 밀리초 const int LONG_PRESS_TIME = 1000; // 1000 밀리초 // 변수는 변경될 것입니다: int lastState = LOW; // 입력 핀의 이전 상태 int currentState; // 입력 핀에서의 현재 읽기 값 unsigned long pressedTime = 0; unsigned long releasedTime = 0; void setup() { Serial.begin(9600); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // 스위치/버튼의 상태를 읽습니다: currentState = digitalRead(BUTTON_PIN); if(lastState == HIGH && currentState == LOW) // 버튼이 눌림 pressedTime = millis(); else if(lastState == LOW && currentState == HIGH) { // 버튼이 놓임 releasedTime = millis(); long pressDuration = releasedTime - pressedTime; if( pressDuration < SHORT_PRESS_TIME ) Serial.println("짧은 누름이 감지됨"); if( pressDuration > LONG_PRESS_TIME ) Serial.println("긴 누름이 감지됨"); } // 마지막 상태를 저장 lastState = currentState; }

사용 방법

  • 위의 코드를 아두이노 IDE를 통해 아두이노로 업로드하십시오.
  • 버튼을 길게 및 짧게 누르십시오.
  • 시리얼 모니터에서 결과를 확인하십시오.

※ NOTE THAT:

시리얼 모니터는 길게 누르는 동안 여러 번의 짧은 누름 감지를 표시할 수 있습니다. 이것은 버튼의 정상적인 동작입니다. 이러한 현상을 "채터링 현상"이라고 합니다. 이 문제는 이 튜토리얼의 마지막 부분에서 해결될 것입니다.

단축 키와 롱 프레스 동안 누르기

/* * 이 Arduino 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-button-long-press-short-press */ // 상수는 변경되지 않습니다. 핀 번호를 설정하는 데 여기서 사용됩니다. const int BUTTON_PIN = 7; // 푸시버튼 핀의 번호 const int SHORT_PRESS_TIME = 1000; // 1000 밀리초 const int LONG_PRESS_TIME = 1000; // 1000 밀리초 // 변수는 변경될 것입니다: int lastState = LOW; // 입력 핀의 이전 상태 int currentState; // 입력 핀에서의 현재 읽기 unsigned long pressedTime = 0; unsigned long releasedTime = 0; bool isPressing = false; bool isLongDetected = false; void setup() { Serial.begin(9600); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // 스위치/버튼의 상태를 읽습니다: currentState = digitalRead(BUTTON_PIN); if(lastState == HIGH && currentState == LOW) { // 버튼이 눌림 pressedTime = millis(); isPressing = true; isLongDetected = false; } else if(lastState == LOW && currentState == HIGH) { // 버튼이 릴리즈됨 isPressing = false; releasedTime = millis(); long pressDuration = releasedTime - pressedTime; if( pressDuration < SHORT_PRESS_TIME ) Serial.println("짧은 누름이 감지됨"); } if(isPressing == true && isLongDetected == false) { long pressDuration = millis() - pressedTime; if( pressDuration > LONG_PRESS_TIME ) { Serial.println("긴 누름이 감지됨"); isLongDetected = true; } } // 마지막 상태를 저장 lastState = currentState; }

사용 방법

  • 위의 코드를 아두이노 IDE를 통해 아두이노에 업로드하세요.
  • 버튼을 길게 누르고 짧게 눌러보세요.
  • 시리얼 모니터에서 결과를 확인하세요.

※ NOTE THAT:

시리얼 모니터는 길게 누를 때 여러 번의 짧은 누름 감지를 보여줄 수 있습니다. 이것은 버튼의 정상적인 동작입니다. 이 현상을 "차터링 현상"이라고 합니다. 이 문제는 이 튜토리얼의 마지막 부분에서 해결될 것입니다.

롱 프레스 및 숏 프레스 디바운싱

많은 애플리케이션에서 버튼을 디바운스 하는 것이 매우 중요합니다.

디바운싱은 특히 여러 버튼을 사용할 때 조금 복잡합니다. 초보자들이 훨씬 쉽게 다룰 수 있도록, 저희는 ezButton 이라는 라이브러리를 만들었습니다.

우리는 아래 코드에서 이 라이브러리를 사용할 것입니다.

짧게 누르기와 길게 누르기, 릴리스 후 디바운싱 처리

/* * 이 Arduino 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-button-long-press-short-press */ #include <ezButton.h> const int SHORT_PRESS_TIME = 1000; // 1000 밀리초 const int LONG_PRESS_TIME = 1000; // 1000 밀리초 ezButton button(7); // 핀 7에 연결된 ezButton 객체를 생성합니다. unsigned long pressedTime = 0; unsigned long releasedTime = 0; void setup() { Serial.begin(9600); button.setDebounceTime(50); // 디바운스 시간을 50 밀리초로 설정 } void loop() { button.loop(); // 우선 loop() 함수를 호출해야 함 if(button.isPressed()) pressedTime = millis(); if(button.isReleased()) { releasedTime = millis(); long pressDuration = releasedTime - pressedTime; if( pressDuration < SHORT_PRESS_TIME ) Serial.println("짧은 누름이 감지됨"); if( pressDuration > LONG_PRESS_TIME ) Serial.println("긴 누름이 감지됨"); } }

사용 방법

  • EzButton 라이브러리를 설치하세요. 방법 보기
  • 위의 코드를 Arduino IDE를 통해 Arduino에 업로드하세요.
  • 버튼을 길게 누르고 짧게 누르세요.
  • 시리얼 모니터에서 결과를 확인하세요.

짧은 누름과 긴 누름에 대한 디바운싱 처리

/* * 이 Arduino 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-button-long-press-short-press */ #include <ezButton.h> const int SHORT_PRESS_TIME = 1000; // 1000 밀리초 const int LONG_PRESS_TIME = 1000; // 1000 밀리초 ezButton button(7); // 핀 7에 연결된 ezButton 객체를 생성한다; unsigned long pressedTime = 0; unsigned long releasedTime = 0; bool isPressing = false; bool isLongDetected = false; void setup() { Serial.begin(9600); button.setDebounceTime(50); // 디바운스 시간을 50 밀리초로 설정한다 } void loop() { button.loop(); // loop() 함수를 먼저 호출해야 함 if(button.isPressed()){ pressedTime = millis(); isPressing = true; isLongDetected = false; } if(button.isReleased()) { isPressing = false; releasedTime = millis(); long pressDuration = releasedTime - pressedTime; if( pressDuration < SHORT_PRESS_TIME ) Serial.println("A short press is detected"); } if(isPressing == true && isLongDetected == false) { long pressDuration = millis() - pressedTime; if( pressDuration > LONG_PRESS_TIME ) { Serial.println("A long press is detected"); isLongDetected = true; } } }

사용 방법

  • EzButton 라이브러리를 설치하세요. 방법 보기
  • 위의 코드를 Arduino IDE를 통해 Arduino에 업로드하세요.
  • 버튼을 길게 누르고 짧게 누르세요.
  • 시리얼 모니터에서 결과를 확인하세요.

동영상

비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.

왜 긴 누름과 짧은 누름이 필요한가요?

버튼의 수를 줄이기 위해 하나의 버튼으로 두 가지 이상의 기능을 할 수 있습니다. 예를 들어, 짧게 누르면 작동 모드 변경, 길게 누르면 장치를 끕니다.

실수로 짧게 누르는 것을 줄이기 위해 길게 누르기 기능을 사용합니다. 예를 들어, 일부 기기는 공장 초기화를 위해 버튼을 사용합니다. 버튼이 실수로 눌리면 위험합니다. 이를 방지하기 위해, 장치는 버튼을 길게 누를 때만 (예: 5초 이상) 공장 초기화가 실행되도록 구현되었습니다.

댓글

※ OUR MESSAGES

  • Please feel free to share the link of this tutorial. However, Please do not use our content on any other websites. We invested a lot of effort and time to create the content, please respect our work!