아두이노 나노 ESP32 - 버튼 - 긴 누름 짧은 누름 | Arduino Nano ESP32 - Button - Long Press Short Press

이 튜토리얼은 아두이노 나노 ESP32를 사용하여 긴 누름과 짧은 누름을 감지하는 방법에 대한 지침을 제공합니다. 자세히 말하면, 우리는 다음을 배우게 됩니다:

준비물

1×Arduino Nano ESP32 Amazon
1×USB Cable Type-C 쿠팡 | Amazon
1×Push Button 쿠팡 | Amazon
1×(Optional) Panel-mount Push Button Amazon
1×Breadboard 쿠팡 | Amazon
1×Jumper Wires Amazon
1×(Optional) DC Power Jack 쿠팡 | Amazon
1×(Recommended) Screw Terminal Expansion Board for Arduino Nano 쿠팡 | Amazon
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.

버튼 정보

버튼에 관한 구체적인 튜토리얼이 있습니다. 각 튜토리얼은 하드웨어 핀 배치, 작동 원리, ESP32, 아두이노 나노 ESP32 코드에 대한 배선 연결에 대한 자세한 정보와 단계별 지침을 포함하고 있습니다. 다음 링크에서 자세히 알아보세요:

선연결

Arduino Nano ESP32 Button Wiring Diagram

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

이 튜토리얼에서는 내부 풀업 저항을 사용할 것입니다. 버튼의 상태는 평소에는 HIGH이고 눌렀을 때는 LOW입니다.

단축키 감지 방법

  • 눌린 이벤트와 떼어진 이벤트 사이의 시간을 측정합니다.
  • 지속 시간이 사전에 정의된 시간보다 짧으면 짧은 누름 이벤트가 감지됩니다.

한 걸음씩 보자:

짧은 누름의 최대 지속 시간을 정의하십시오.

#define SHORT_PRESS_TIME 500 // 500 밀리초

버튼이 눌렀는지 감지하고 누른 시간을 저장하세요.

if(prev_state == HIGH && button_state == LOW) pressed_time = millis();

버튼이 놓여졌는지 감지하고 놓여진 시간을 저장하세요.

if(prev_state == LOW && button_state == HIGH) released_time = millis();

압력 지속 시간을 계산하고

long press_duration = released_time - pressed_time; // 압축 시간은 누른 시간에서 릴리스된 시간을 뺀 값입니다.

누름 시간을 정의된 짧은 누름 시간과 비교하여 짧게 누른 것인지 결정하세요.

if( press_duration < SHORT_PRESS_TIME ) Serial.println("짧은 누름이 감지되었습니다");

단축 키 누르기 감지를 위한 아두이노 나노 ESP32 코드

/* * 이 Arduino Nano ESP32 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino Nano 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; // 입력 핀에서의 현재 읽기값 unsigned long pressed_time = 0; unsigned long released_time = 0; void setup() { Serial.begin(9600); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // 스위치/버튼의 상태를 읽습니다: button_state = digitalRead(BUTTON_PIN); if (prev_button_state == HIGH && button_state == LOW) // 버튼이 눌림 pressed_time = millis(); else if (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; }

사용 방법

  • 아두이노 나노 ESP32를 처음 사용하는 경우, 아두이노 IDE에서 아두이노 나노 ESP32 환경 설정 방법을 참조하세요.
  • 위의 코드를 아두이노 IDE를 통해 아두이노 나노 ESP32에 업로드하세요.
  • 버튼을 여러 번 짧게 누릅니다.
  • 시리얼 모니터에서 결과를 확인하세요. 아래와 같습니다:
COM6
Send
A short press is detected
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

※ NOTE THAT:

시리얼 모니터는 단일 클릭에 대해 여러 번의 짧은 클릭을 출력할 수 있습니다. 이것은 버튼의 정상적인 동작입니다. 이 동작은 "채터링 현상"이라고 불립니다. 이 문제를 해결하는 방법은 이 튜토리얼의 뒷부분에서 배우게 될 것입니다.

긴 누름 감지하는 방법

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

  • 버튼을 놓자마자 롱 프레스 이벤트가 감지됩니다.
  • 버튼을 누르고 있는 동안에 롱 프레스 이벤트가 감지됩니다.

첫 번째 경우에는:

  • 누른 이벤트와 놓은 이벤트 사이의 시간 길이를 재십시오.
  • 지속 시간이 사전에 정의된 시간보다 길 경우, 길게 누르기 이벤트가 감지됩니다.

두 번째 경우: 버튼을 누르는 동안, 아래 과정을 반복적으로 수행하세요:

  • 압박 시간을 측정하세요.
  • 지속 시간이 사전에 정의된 시간보다 길면, 긴-누름 이벤트가 감지됩니다.
  • 그렇지 않으면, 버튼이 놓일 때까지 과정을 반복하세요.

Arduino Nano ESP32 코드: 길게 누르기가 릴리스될 때 감지하기

/* * 이 Arduino Nano ESP32 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino Nano 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; // 입력 핀에서 현재 읽는 값 unsigned long pressed_time = 0; unsigned long released_time = 0; void setup() { Serial.begin(9600); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // 스위치/버튼의 상태를 읽습니다: button_state = digitalRead(BUTTON_PIN); if(prev_button_state == HIGH && button_state == LOW) // 버튼이 눌림 pressed_time = millis(); else if(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; }

사용 방법

  • Arduino Nano ESP32를 처음 사용하는 경우, Arduino Nano ESP32를 Arduino IDE에서 설정하는 방법을 참조하세요.
  • 위의 코드를 Arduino IDE를 통해 Arduino Nano ESP32에 업로드합니다.
  • 1초 후에 버튼을 눌렀다가 놓습니다.
  • 시리얼 모니터에서 결과를 확인하세요. 아래와 같이 보입니다:
COM6
Send
A long press is detected
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

아두이노 나노 ESP32 코드, 누르는 동안 긴 누름 감지하기

/* * 이 Arduino Nano ESP32 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino Nano ESP32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-nano-esp32/arduino-nano-esp32-button-long-press-short-press */ #define BUTTON_PIN D2 // Arduino Nano ESP32 pin D2 버튼에 연결된 핀 #define LONG_PRESS_TIME 1000 // 1000 밀리초 int prev_button_state = LOW; // 입력 핀에서 이전 상태 int button_state; // 입력 핀에서 현재 읽기 unsigned long pressed_time = 0; bool is_pressing = false; bool is_long_detected = false; void setup() { Serial.begin(9600); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // 스위치/버튼의 상태를 읽음: button_state = digitalRead(BUTTON_PIN); if(prev_button_state == HIGH && button_state == LOW) { // 버튼이 눌림 pressed_time = millis(); is_pressing = true; is_long_detected = false; } else if(prev_button_state == LOW && button_state == HIGH) { // 버튼이 릴리즈됨 is_pressing = false; } if(is_pressing == true && is_long_detected == false) { long press_duration = millis() - pressed_time; if( press_duration > LONG_PRESS_TIME ) { Serial.println("A long press is detected"); is_long_detected = true; } } // 마지막 상태를 저장 prev_button_state = button_state; }

사용 방법

  • Arduino Nano ESP32를 처음 사용하는 경우, Arduino IDE에서 Arduino Nano ESP32 환경 설정하는 방법을 보려면 여기를 참고하세요.
  • 위의 코드를 Arduino IDE를 통해 Arduino Nano ESP32에 업로드하세요.
  • 몇 초 후 버튼을 눌렀다가 놓으세요.
  • 시리얼 모니터에서 결과를 확인하세요. 아래와 같이 표시됩니다:
COM6
Send
A long press is detected
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

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

짧게 누르기와 길게 누른 후 놓기

/* * 이 Arduino Nano ESP32 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino Nano 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 1000 // 1000 밀리초 #define LONG_PRESS_TIME 1000 // 1000 밀리초 int prev_button_state = LOW; // 입력 핀의 이전 상태 int button_state; // 입력 핀의 현재 읽기 unsigned long pressed_time = 0; unsigned long released_time = 0; void setup() { Serial.begin(9600); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // 스위치/버튼의 상태를 읽습니다: button_state = digitalRead(BUTTON_PIN); if (prev_button_state == HIGH && button_state == LOW) // 버튼이 눌림 pressed_time = millis(); else if (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("짧은 누름이 감지되었습니다"); if ( press_duration > LONG_PRESS_TIME ) Serial.println("긴 누름이 감지되었습니다"); } // 마지막 상태를 저장 prev_button_state = button_state; }

사용 방법

  • 아두이노 나노 ESP32를 처음 사용하는 경우, 아두이노 IDE에서 아두이노 나노 ESP32 환경 설정 방법을 확인하세요.
  • 위의 코드를 아두이노 IDE를 통해 아두이노 나노 ESP32에 업로드하세요.
  • 버튼을 길게 누르고 짧게 누르세요.
  • 시리얼 모니터에서 결과를 확인하세요. 아래와 같습니다:

※ NOTE THAT:

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

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

/* * 이 Arduino Nano ESP32 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino Nano ESP32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-nano-esp32/arduino-nano-esp32-button-long-press-short-press */ #define BUTTON_PIN D2 // 아두이노 나노 ESP32 핀 D2가 버튼에 연결됨 #define SHORT_PRESS_TIME 1000 // 1000 밀리초 #define LONG_PRESS_TIME 1000 // 1000 밀리초 int prev_button_state = LOW; // 입력 핀에서 이전 상태 int button_state; // 입력 핀에서 현재 읽기 unsigned long pressed_time = 0; unsigned long released_time = 0; bool is_pressing = false; bool is_long_detected = false; void setup() { Serial.begin(9600); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // 스위치/버튼의 상태를 읽습니다: button_state = digitalRead(BUTTON_PIN); if (prev_button_state == HIGH && button_state == LOW) { // 버튼이 눌렸습니다 pressed_time = millis(); is_pressing = true; is_long_detected = false; } else if (prev_button_state == LOW && button_state == HIGH) { // 버튼이 놓였습니다 is_pressing = false; released_time = millis(); long press_duration = released_time - pressed_time; if ( press_duration < SHORT_PRESS_TIME ) Serial.println("짧은 누름이 감지됨"); } if (is_pressing == true && is_long_detected == false) { long press_duration = millis() - pressed_time; if ( press_duration > LONG_PRESS_TIME ) { Serial.println("긴 누름이 감지됨"); is_long_detected = true; } } // 마지막 상태를 저장 prev_button_state = button_state; }

사용 방법

  • Arduino Nano ESP32를 처음 사용하는 경우, Arduino IDE에서 Arduino Nano ESP32 환경 설정 방법을 참조하십시오.
  • 위의 코드를 Arduino IDE를 통해 Arduino Nano ESP32에 업로드하십시오.
  • 버튼을 길게 누르고 짧게 누르십시오.
  • 시리얼 모니터에서 결과를 확인하십시오. 아래와 같습니다:

롱 프레스와 숏 프레스 디바운싱 처리

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

디바운싱은 조금 복잡한데, 특히 여러 버튼을 사용할 때 그렇습니다. 초보자들이 쉽게 이해할 수 있도록, 우리는 ezButton이라는 라이브러리를 만들었습니다.

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

짧은 누름과 긴 누름, 그리고 놓은 후 디바운싱 처리

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

사용 방법

  • 아두이노 나노 ESP32를 처음 사용하는 경우, 아두이노 나노 ESP32의 환경설정 방법을 확인하세요.
  • EzButton 라이브러리를 설치하세요. 설치 방법을 참조하세요.
  • 위의 코드를 아두이노 IDE를 통해 아두이노 나노 ESP32에 업로드하세요.
  • 버튼을 길게 및 짧게 누르세요.
  • 시리얼 모니터에서 결과를 확인하세요. 아래와 같이 보일 것입니다.

누르는 동안 짧게 누르기와 길게 누르기, 디바운싱 처리

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

사용 방법

  • Arduino Nano ESP32를 처음 사용하는 경우, Arduino IDE에서 Arduino Nano ESP32 환경 설정하는 방법을 참조하십시오.
  • EzButton 라이브러리를 설치하십시오. 설치 방법을 참조하십시오.
  • 위의 코드를 Arduino IDE를 통해 Arduino Nano ESP32에 업로드하십시오.
  • 버튼을 길게 누르고 짧게 누르십시오.
  • 시리얼 모니터에서 결과를 확인하십시오. 아래와 같이 보입니다:

동영상

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

왜 길게 누르기와 짧게 누르기가 필요한가요?

  • 버튼 수와 디지털 입력 핀을 절약하기 위해 하나의 버튼으로 두 가지 이상의 기능을 유지할 수 있습니다. 예를 들어, 짧게 누르면 불을 켜고, 길게 누르면 선풍기를 켭니다.
  • 우연히 눌러지는 것을 방지하기 위해 짧게 누르는 대신 길게 누르기를 사용하세요. 예를 들어, 일부 장치는 공장 초기화를 위해 버튼을 사용합니다. 버튼이 우연히 눌리면 위험합니다.

※ 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!