/* * 이 아두이노 나노 esp32 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 나노 esp32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-nano-esp32/arduino-nano-esp32-button-long-press-short-press */#define BUTTON_PIN D2 // Arduino Nano ESP32 핀 D2에 버튼 연결#define SHORT_PRESS_TIME 500 // 500 밀리초int prev_button_state = LOW; // 입력 핀에서의 이전 상태int button_state; // 입력 핀에서의 현재 읽기값unsignedlong pressed_time = 0;unsignedlong released_time = 0;voidsetup() {Serial.begin(9600);pinMode(BUTTON_PIN, INPUT_PULLUP);}voidloop() {// 스위치/버튼의 상태를 읽습니다: button_state = digitalRead(BUTTON_PIN);if (prev_button_state == HIGH && button_state == LOW) // 버튼이 눌림 pressed_time = millis();elseif (prev_button_state == LOW && button_state == HIGH) { // 버튼이 릴리즈됨 released_time = millis();long press_duration = released_time - pressed_time;if ( press_duration < SHORT_PRESS_TIME )Serial.println("A short press is detected"); }// 마지막 상태를 저장 prev_button_state = button_state;}
Message (Enter to send message to 'Arduino Nano ESP32' on 'COM15')
New Line
9600 baud
A short press is detected
Ln 11, Col 1
Arduino Nano ESP32 on COM15
2
※ 주의:
시리얼 모니터는 단일 클릭에 대해 여러 번의 짧은 클릭을 출력할 수 있습니다. 이것은 버튼의 정상적인 동작입니다. 이 동작은 "채터링 현상"이라고 불립니다. 이 문제를 해결하는 방법은 이 튜토리얼의 뒷부분에서 배우게 될 것입니다.
긴 누름 감지하는 방법
롱 프레스를 감지하기 위한 두 가지 사용 사례가 있습니다.
버튼을 놓자마자 롱 프레스 이벤트가 감지됩니다.
버튼을 누르고 있는 동안에 롱 프레스 이벤트가 감지됩니다.
첫 번째 경우에는:
누른 이벤트와 놓은 이벤트 사이의 시간 길이를 재십시오.
지속 시간이 사전에 정의된 시간보다 길 경우, 길게 누르기 이벤트가 감지됩니다.
두 번째 경우: 버튼을 누르는 동안, 아래 과정을 반복적으로 수행하세요:
압박 시간을 측정하세요.
지속 시간이 사전에 정의된 시간보다 길면, 긴-누름 이벤트가 감지됩니다.
그렇지 않으면, 버튼이 놓일 때까지 과정을 반복하세요.
Arduino Nano ESP32 코드: 길게 누르기가 릴리스될 때 감지하기
/* * 이 아두이노 나노 esp32 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 나노 esp32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-nano-esp32/arduino-nano-esp32-button-long-press-short-press */#define BUTTON_PIN D2 // Arduino Nano ESP32 핀 D2핀이 버튼에 연결되어 있음#define LONG_PRESS_TIME 1000 // 1000 밀리초int prev_button_state = LOW; // 입력 핀에서 이전 상태int button_state; // 입력 핀에서 현재 읽는 값unsignedlong pressed_time = 0;unsignedlong released_time = 0;voidsetup() {Serial.begin(9600);pinMode(BUTTON_PIN, INPUT_PULLUP);}voidloop() {// 스위치/버튼의 상태를 읽습니다: button_state = digitalRead(BUTTON_PIN);if(prev_button_state == HIGH && button_state == LOW) // 버튼이 눌림 pressed_time = millis();elseif(prev_button_state == LOW && button_state == HIGH) { // 버튼이 놓임 released_time = millis();long press_duration = released_time - pressed_time;if( press_duration > LONG_PRESS_TIME )Serial.println("A long press is detected"); }// 마지막 상태를 저장 prev_button_state = button_state;}