Message (Enter to send message to 'ESP32 Dev Module' on 'COM15')
New Line
9600 baud
A short press is detected
Ln 11, Col 1
ESP32 Dev Module on COM15
2
※ 주의:
시리얼 모니터는 단일 클릭에 대해 여러 번의 짧은 클릭을 출력할 수 있습니다. 이는 버튼의 정상적인 동작입니다. 이러한 동작은 "차터링 현상"이라고 불립니다. 이 문제를 해결하는 방법은 이 튜토리얼에서 나중에 배우게 됩니다.
롱 프레스 감지 방법
길게 누르기를 감지하기 위한 사용 사례가 두 가지가 있습니다.
버튼을 놓자마자 롱 프레스 이벤트가 감지됩니다.
버튼이 눌리는 동안 롱 프레스 이벤트가 감지됩니다.
In the first case: - 첫 번째 경우:
눌린 이벤트와 릴리스된 이벤트 사이의 시간 길이를 측정하세요.
해당 기간이 사전 정의된 시간보다 길 경우, 롱-프레스 이벤트가 감지됩니다.
두 번째 경우: 버튼이 눌리는 동안, 아래 과정을 반복적으로 수행하십시오:
누르는 시간을 측정하세요.
시간이 사전에 정해진 시간보다 길면, 길게 누르기 이벤트가 감지됩니다.
그렇지 않으면, 버튼이 놓일 때까지 과정을 반복하세요.
ESP32 코드를 사용하여 길게 누르기를 놓았을 때 감지하기
/* * 이 ESP32 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp32/esp32-button-long-press-short-press */#define BUTTON_PIN 21 // GPIO21 핀이 버튼에 연결됨#define 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;}
Message (Enter to send message to 'ESP32 Dev Module' on 'COM15')
New Line
9600 baud
A long press is detected
Ln 11, Col 1
ESP32 Dev Module on COM15
2
긴 누름과 짧은 누름 모두 감지하는 방법
짧게 누르기와 길게 누른 후 놓기
/* * 이 ESP32 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp32/esp32-button-long-press-short-press */#define BUTTON_PIN 21#define SHORT_PRESS_TIME 1000#define LONG_PRESS_TIME 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;}
디바운싱은 여러 버튼을 사용할 때 특히 조금 복잡합니다. 초보자를 위해 간단하게 만들기 위하여, 우리는 ezButton이라 불리는 라이브러리를 만들었습니다.
아래 코드에서 이 라이브러리를 사용할 것입니다.
짧은 누름과 긴 누름, 그리고 뗀 후 디바운싱 처리
/* * 이 ESP32 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp32/esp32-button-long-press-short-press */#include <ezButton.h>#define SHORT_PRESS_TIME 1000 // 1000밀리초#define LONG_PRESS_TIME 1000 // 1000밀리초ezButtonbutton(21); // GPIO21 핀에 연결된 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("A short press is detected");if ( pressDuration > LONG_PRESS_TIME )Serial.println("A long press is detected"); }}