/* * 이 아두이노 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-button-long-press-short-press */// 상수는 변경되지 않습니다. 핀 번호를 설정하는 데 여기에서 사용됩니다:constint BUTTON_PIN = 7; // 푸시버튼 핀의 번호constint SHORT_PRESS_TIME = 500; // 500 밀리초// 변수는 변경될 것입니다:int lastState = LOW; // 입력 핀에서의 이전 상태int currentState; // 입력 핀에서의 현재 읽기unsignedlong pressedTime = 0;unsignedlong releasedTime = 0;voidsetup() {Serial.begin(9600);pinMode(BUTTON_PIN, INPUT_PULLUP);}voidloop() {// 스위치/버튼의 상태를 읽습니다: currentState = digitalRead(BUTTON_PIN);if(lastState == HIGH && currentState == LOW) // 버튼이 눌림 pressedTime = millis();elseif(lastState == LOW && currentState == HIGH) { // 버튼이 놓임 releasedTime = millis();long pressDuration = releasedTime - pressedTime;if( pressDuration < SHORT_PRESS_TIME )Serial.println("짧은 누름이 감지되었습니다"); }// 마지막 상태를 저장합니다 lastState = currentState;}
사용 방법
위의 코드를 아두이노 IDE를 통해 아두이노에 업로드하세요.
버튼을 몇 번 짧게 누르세요.
시리얼 모니터에서 결과를 확인하세요.
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
A short press is detected
Ln 11, Col 1
Arduino Uno on COM15
2
※ 주의:
시리얼 모니터는 한 번의 누름에 대해 여러 번의 짧은 누름 감지를 보여줄 수 있습니다. 이것은 버튼의 정상적인 동작입니다. 이 현상을 "채터링 현상"이라고 합니다. 이 문제는 이 튜토리얼의 마지막 부분에서 해결될 것입니다.
장시간 누르기 감지 방법
롱 프레스를 감지하기 위한 두 가지 사용 사례가 있습니다.
버튼을 놓자마자 롱 프레스 이벤트가 감지됩니다.
버튼이 아직 놓이지 않았더라도 버튼이 눌리는 동안 롱 프레스 이벤트가 감지됩니다.
첫 번째 사용 사례에서, 우리는 눌린 이벤트와 릴리스된 이벤트 사이의 시간 지속을 측정합니다. 지속 시간이 정의된 시간보다 길면, 롱-프레스 이벤트가 감지됩니다.
두 번째 사용 사례에서, 버튼이 눌린 후, 우리는 버튼이 놓일 때까지 지속적으로 누르는 시간을 측정하고 롱 프레스 이벤트를 확인합니다. 버튼이 눌려지는 동안, 지속 시간이 정의된 시간보다 길 경우, 롱 프레스 이벤트가 감지됩니다.
아두이노 코드: 길게 눌렀다가 놓았을 때 감지하기
/* * 이 아두이노 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-button-long-press-short-press */// 상수는 변경되지 않습니다. 핀 번호를 설정하는 데 여기서 사용됩니다:constint BUTTON_PIN = 7; // 푸시버튼 핀의 번호constint LONG_PRESS_TIME = 1000; // 1000 밀리초// 변수는 변경될 것입니다:int lastState = LOW; // 입력 핀의 이전 상태int currentState; // 입력 핀에서 현재 읽기unsignedlong pressedTime = 0;unsignedlong releasedTime = 0;voidsetup() {Serial.begin(9600);pinMode(BUTTON_PIN, INPUT_PULLUP);}voidloop() {// 스위치/버튼의 상태를 읽습니다: currentState = digitalRead(BUTTON_PIN);if(lastState == HIGH && currentState == LOW) // 버튼이 눌렸습니다 pressedTime = millis();elseif(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초 후에 버튼을 눌렀다가 놓으세요.
시리얼 모니터에서 결과를 확인하세요.
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
A long press is detected
Ln 11, Col 1
Arduino Uno on COM15
2
버튼이 놓인 직후에만 롱 프레스 이벤트가 감지됩니다.
아두이노 코드: 길게 누르기 감지하기
/* * 이 아두이노 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-button-long-press-short-press */// 상수는 변경되지 않습니다. 핀 번호를 설정하는 데 여기서 사용됩니다:constint BUTTON_PIN = 7; // 푸시버튼 핀의 번호constint LONG_PRESS_TIME = 1000; // 1000 밀리초// 변수는 변경될 것입니다:int lastState = LOW; // 입력 핀에서의 이전 상태int currentState; // 입력 핀에서의 현재 읽기 값unsignedlong pressedTime = 0;bool isPressing = false;bool isLongDetected = false;voidsetup() {Serial.begin(9600);pinMode(BUTTON_PIN, INPUT_PULLUP);}voidloop() {// 스위치/버튼의 상태를 읽습니다: currentState = digitalRead(BUTTON_PIN);if(lastState == HIGH && currentState == LOW) { // 버튼이 눌림 pressedTime = millis(); isPressing = true; isLongDetected = false; } elseif(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를 통해 아두이노에 업로드하세요.
몇 초 후 버튼을 눌렀다가 놓으세요.
시리얼 모니터에서 결과를 확인하세요.
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
A long press is detected
Ln 11, Col 1
Arduino Uno on COM15
2
버튼이 아직 릴리스되지 않았을 때만 롱-프레스 이벤트가 감지됩니다.
긴 누름과 짧은 누름을 모두 감지하는 방법
"짧게 누르기" 및 "길게 누른 후 놓기"
/* * 이 아두이노 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-button-long-press-short-press */// 상수는 변하지 않습니다. 핀 번호를 설정하는 데 여기에서 사용됩니다:constint BUTTON_PIN = 7; // 버튼 핀의 번호constint SHORT_PRESS_TIME = 1000; // 1000 밀리초constint LONG_PRESS_TIME = 1000; // 1000 밀리초// 변수는 변경될 것입니다:int lastState = LOW; // 입력 핀의 이전 상태int currentState; // 입력 핀에서의 현재 읽기 값unsignedlong pressedTime = 0;unsignedlong releasedTime = 0;voidsetup() {Serial.begin(9600);pinMode(BUTTON_PIN, INPUT_PULLUP);}voidloop() {// 스위치/버튼의 상태를 읽습니다: currentState = digitalRead(BUTTON_PIN);if(lastState == HIGH && currentState == LOW) // 버튼이 눌림 pressedTime = millis();elseif(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를 통해 아두이노로 업로드하십시오.
버튼을 길게 및 짧게 누르십시오.
시리얼 모니터에서 결과를 확인하십시오.
※ 주의:
시리얼 모니터는 길게 누르는 동안 여러 번의 짧은 누름 감지를 표시할 수 있습니다. 이것은 버튼의 정상적인 동작입니다. 이러한 현상을 "채터링 현상"이라고 합니다. 이 문제는 이 튜토리얼의 마지막 부분에서 해결될 것입니다.
단축 키와 롱 프레스 동안 누르기
/* * 이 아두이노 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-button-long-press-short-press */// 상수는 변경되지 않습니다. 핀 번호를 설정하는 데 여기서 사용됩니다.constint BUTTON_PIN = 7; // 푸시버튼 핀의 번호constint SHORT_PRESS_TIME = 1000; // 1000 밀리초constint LONG_PRESS_TIME = 1000; // 1000 밀리초// 변수는 변경될 것입니다:int lastState = LOW; // 입력 핀의 이전 상태int currentState; // 입력 핀에서의 현재 읽기unsignedlong pressedTime = 0;unsignedlong releasedTime = 0;bool isPressing = false;bool isLongDetected = false;voidsetup() {Serial.begin(9600);pinMode(BUTTON_PIN, INPUT_PULLUP);}voidloop() {// 스위치/버튼의 상태를 읽습니다: currentState = digitalRead(BUTTON_PIN);if(lastState == HIGH && currentState == LOW) { // 버튼이 눌림 pressedTime = millis(); isPressing = true; isLongDetected = false; } elseif(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를 통해 아두이노에 업로드하세요.
버튼을 길게 누르고 짧게 눌러보세요.
시리얼 모니터에서 결과를 확인하세요.
※ 주의:
시리얼 모니터는 길게 누를 때 여러 번의 짧은 누름 감지를 보여줄 수 있습니다. 이것은 버튼의 정상적인 동작입니다. 이 현상을 "차터링 현상"이라고 합니다. 이 문제는 이 튜토리얼의 마지막 부분에서 해결될 것입니다.
롱 프레스 및 숏 프레스 디바운싱
많은 애플리케이션에서 버튼을 디바운스 하는 것이 매우 중요합니다.
디바운싱은 특히 여러 버튼을 사용할 때 조금 복잡합니다. 초보자들이 훨씬 쉽게 다룰 수 있도록, 저희는 ezButton 이라는 라이브러리를 만들었습니다.
우리는 아래 코드에서 이 라이브러리를 사용할 것입니다.
짧게 누르기와 길게 누르기, 릴리스 후 디바운싱 처리
/* * 이 아두이노 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-button-long-press-short-press */#include <ezButton.h>constint SHORT_PRESS_TIME = 1000; // 1000 밀리초constint LONG_PRESS_TIME = 1000; // 1000 밀리초ezButtonbutton(7); // 핀 7에 연결된 ezButton 객체를 생성합니다.unsignedlong pressedTime = 0;unsignedlong releasedTime = 0;voidsetup() {Serial.begin(9600);button.setDebounceTime(50); // 디바운스 시간을 50 밀리초로 설정}voidloop() {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("긴 누름이 감지됨"); }}
비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.
왜 긴 누름과 짧은 누름이 필요한가요?
버튼의 수를 줄이기 위해 하나의 버튼으로 두 가지 이상의 기능을 할 수 있습니다. 예를 들어, 짧게 누르면 작동 모드 변경, 길게 누르면 장치를 끕니다.
실수로 짧게 누르는 것을 줄이기 위해 길게 누르기 기능을 사용합니다. 예를 들어, 일부 기기는 공장 초기화를 위해 버튼을 사용합니다. 버튼이 실수로 눌리면 위험합니다. 이를 방지하기 위해, 장치는 버튼을 길게 누를 때만 (예: 5초 이상) 공장 초기화가 실행되도록 구현되었습니다.