ESP32 - 버튼 - 디바운스 | ESP32 - Button - Debounce

버튼이 눌리거나/놓이거나 스위치가 ON OFF 사이에서 전환될 때, 그 상태는 한 번 LOW에서 HIGH(또는 HIGH에서 LOW)로 변경됩니다. 이게 맞나요?

아니요, 그렇지 않습니다. 이는 물리적인 세계에서 단일 버튼을 누를 때, 버튼의 상태가 한 번이 아니라 여러 번 LOWHIGH 사이를 빠르게 전환하기 때문입니다. 이는 기계적이고 물리적인 특성입니다. 이 현상은 차터링이라는 이름으로 알려져 있습니다. 차터링 현상은 MCU(예: ESP32)가 단일 실제 누름에 대해 여러 번의 버튼 누름을 읽게 만듭니다. 이는 오작동을 초래합니다. 이 현상을 제거하는 과정을 디바운스라고 합니다. 이 튜토리얼은 그 방법을 보여줍니다.

ESP32 chattering phenomenon

이 튜토리얼은 다음을 제공합니다:

준비물

1×ESP-WROOM-32 Dev Module 쿠팡 | 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) ESP32 Screw Terminal Adapter 쿠팡 | Amazon
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.

버튼에 대하여

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

ESP32 - 버튼 튜토리얼

선연결

ESP32 Button Wiring Diagram

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

ESP32 및 다른 구성 요소에 전원을 공급하는 방법에 대해 잘 알지 못하는 경우, 다음 튜토리얼에서 안내를 찾을 수 있습니다: ESP32 전원 공급 방법.

명확히 하기 위해, ESP32 코드를 디바운스 없이 그리고 디바운스와 함께 실행하여 그 결과를 비교해 봅시다

디바운스 없이 버튼 읽기

사용 방법

  • ESP32를 처음 사용하는 경우, 아두이노 IDE에서 ESP32 환경 설정하는 방법을 확인하세요.
  • 위 이미지와 같이 배선하세요.
  • ESP32 보드를 마이크로 USB 케이블을 이용해 PC에 연결하세요.
  • PC에서 아두이노 IDE를 엽니다.
  • 올바른 ESP32 보드(예: ESP32 Dev Module)와 COM 포트를 선택하세요.
  • 아래 코드를 복사하여 아두이노 IDE에 붙여넣으세요.
/* * 이 ESP32 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp32/esp32-button-debounce */ #define BUTTON_PIN 21 // GIOP21 핀이 버튼에 연결됨 // 변수는 변할 것입니다: int lastState = LOW; // 입력 핀에서의 이전 상태 int currentState; // 입력 핀에서의 현재 읽기 void setup() { // 9600비트/초에서 시리얼 통신 시작: Serial.begin(9600); // 푸시버튼 핀을 풀업 입력으로 초기화합니다 // 풀업 입력 핀은 스위치가 열려 있을 때 HIGH이고 스위치가 닫혀 있을 때 LOW입니다. pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // 스위치/버튼의 상태를 읽습니다: currentState = digitalRead(BUTTON_PIN); if (lastState == HIGH && currentState == LOW) Serial.println("버튼이 눌림"); else if (lastState == LOW && currentState == HIGH) Serial.println("버튼이 릴리스됨"); // 마지막 상태를 저장 lastState = currentState; }

아두이노 IDE에서 Upload 버튼을 클릭하여 ESP32 보드에 코드를 컴파일하고 업로드하세요.

Arduino IDE Upload Code

아두이노 IDE에서 시리얼 모니터 열기

How to open serial monitor on Arduino IDE
  • 버튼을 한 번 누르고 여러 초 동안 계속 누르고 있었다가 놓으세요.
  • 시리얼 모니터에서 결과를 확인하세요. 아래와 같이 보입니다:
COM6
Send
The button is pressed The button is pressed The button is pressed The button is released The button is released
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

⇒ 보시다시피, 당신은 단 한 번의 누르고 놓기만 했지만, ESP32는 여러 번의 누르고 놓기를 감지했습니다.

※ NOTE THAT:

잡음 현상이 항상 발생하는 것은 아닙니다. 발생하지 않는 경우, 위의 테스트를 여러 번 시도해 주세요.

디바운스 기능이 있는 읽기 버튼

사용 방법

이것이 ESP32를 처음 사용하는 경우, Arduino IDE에서 ESP32 환경 설정 방법을 확인하세요.

아래 코드를 복사하여 Arduino IDE에 붙여넣으세요.

/* * 이 ESP32 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp32/esp32-button-debounce */ #define BUTTON_PIN 21 // GIOP21 pin에 버튼 연결 #define DEBOUNCE_TIME 50 // 디바운스 시간(밀리초), 여전히 채터링이 발생한다면 이 시간을 늘리세요 // 변수는 변경될 것입니다: int lastSteadyState = LOW; // 입력 핀으로부터의 이전 안정 상태 int lastFlickerableState = LOW; // 입력 핀으로부터의 이전 깜박일 수 있는 상태 int currentState; // 입력 핀으로부터의 현재 읽기 값 // 다음 변수들은 unsigned longs 입니다. 왜냐하면 시간(밀리초 단위로 측정됨)이 // int에 저장될 수 있는 수보다 빠르게 더 큰 숫자가 될 것이기 때문입니다. unsigned long lastDebounceTime = 0; // 출력 핀이 토글된 마지막 시간 void setup() { // 초당 9600비트의 속도로 시리얼 통신 초기화: Serial.begin(9600); // 푸시버튼 핀을 풀업 입력으로 초기화 // 풀업 입력 핀은 스위치가 열려 있을 때 HIGH이고 스위치가 닫혔을 때는 LOW입니다. pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // 스위치/버튼의 상태를 읽습니다: currentState = digitalRead(BUTTON_PIN); // 방금 버튼을 눌렀는지 확인하십시오 // (즉, 입력이 LOW에서 HIGH로 변경되었으며) 충분히 긴 시간이 지난 후 // 잡음을 무시할 수 있습니다: // 스위치/버튼이 변경되었다면, 잡음 또는 누르기 때문일 수 있습니다: if (currentState != lastFlickerableState) { // 디바운싱 타이머를 재설정합니다 lastDebounceTime = millis(); // 마지막 깜박일 수 있는 상태를 저장합니다 lastFlickerableState = currentState; } if ((millis() - lastDebounceTime) > DEBOUNCE_TIME) { // 읽기가 어떤 것이든, 디바운스 지연 시간보다 더 오래 지속되었습니다. // 그러므로 실제 현재 상태로 간주하십시오: // 버튼 상태가 변경되었다면: if(lastSteadyState == HIGH && currentState == LOW) Serial.println("The button is pressed"); else if(lastSteadyState == LOW && currentState == HIGH) Serial.println("The button is released"); // 마지막 안정 상태를 저장합니다 lastSteadyState = currentState; } }
  • 아두이노 IDE에서 Upload 버튼을 클릭하여 ESP32 보드에 코드를 컴파일하고 업로드합니다.
  • 아두이노 IDE에서 시리얼 모니터를 엽니다.
How to open serial monitor on Arduino IDE
  • 몇 초 동안 버튼을 계속 누르고 있었다가 놓으십시오.
  • 시리얼 모니터에서 결과를 확인하세요. 아래와 같이 보입니다:
COM6
Send
The button is pressed The button is released
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

⇒ 보시다시피, 당신은 한 번 누르고 해제했고, ESP32는 한 번 누르고 해제한 것을 읽었습니다. 따라서, 진동(차터링)은 제거되었습니다.

우리는 간단하게 만들었습니다 - 라이브러리를 사용한 ESP32 버튼 디바운스 코드

초보자들이 여러 버튼에 대해 디바운싱 할 때 편하게 사용할 수 있도록, ezButton이라는 버튼 라이브러리를 만들었습니다. 여기에서 ezButton 라이브러리에 대해 알아보세요.

ESP32 단일 버튼을 위한 버튼 디바운스 코드

/* * 이 ESP32 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp32/esp32-button-debounce */ #include <ezButton.h> #define DEBOUNCE_TIME 50 // 밀리초 단위의 디바운스 시간, 여전히 들썩거린다면 이 시간을 늘리세요 ezButton button(21); // GPIO21 핀에 연결된 ezButton 객체 생성 void setup() { Serial.begin(9600); button.setDebounceTime(DEBOUNCE_TIME); // 디바운스 시간을 50 밀리초로 설정 } void loop() { button.loop(); // 반드시 loop() 함수를 먼저 호출해야 합니다. if (button.isPressed()) Serial.println("The button is pressed"); if (button.isReleased()) Serial.println("The button is released"); }

ESP32 버튼 디바운스 코드 (여러 버튼용)

세 개의 버튼을 위한 디바운스 코드를 작성합시다.

배선도

ESP32 Button Library Wiring Diagram

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

/* * 이 ESP32 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp32/esp32-button-debounce */ #include <ezButton.h> #define DEBOUNCE_TIME 50 // 디바운스 시간을 밀리세컨드 단위로, 이 시간을 늘리면 여전히 차터링이 있을 수 있습니다. ezButton button1(21); // GPIO21 핀에 연결된 ezButton 객체를 생성합니다. ezButton button2(22); // GPIO22 핀에 연결된 ezButton 객체를 생성합니다. ezButton button3(23); // GPIO23 핀에 연결된 ezButton 객체를 생성합니다. void setup() { Serial.begin(9600); button1.setDebounceTime(DEBOUNCE_TIME); // 디바운스 시간을 50밀리세컨드로 설정 button2.setDebounceTime(DEBOUNCE_TIME); // 디바운스 시간을 50밀리세컨드로 설정 button3.setDebounceTime(DEBOUNCE_TIME); // 디바운스 시간을 50밀리세컨드로 설정 } void loop() { button1.loop(); // 반드시 loop() 함수를 먼저 호출해야 합니다. button2.loop(); // 반드시 loop() 함수를 먼저 호출해야 합니다. button3.loop(); // 반드시 loop() 함수를 먼저 호출해야 합니다. if (button1.isPressed()) Serial.println("The button 1 is pressed"); if (button1.isReleased()) Serial.println("The button 1 is released"); if (button2.isPressed()) Serial.println("The button 2 is pressed"); if (button2.isReleased()) Serial.println("The button 2 is released"); if (button3.isPressed()) Serial.println("The button 3 is pressed"); if (button3.isReleased()) Serial.println("The button 3 is released"); }

동영상

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

추가 지식

  • DEBOUNCE_TIME 값은 하드웨어에 따라 다릅니다. 다른 하드웨어는 다른 값을 사용할 수 있습니다.
  • 디바운스는 온/오프 스위치, 리미트 스위치, 리드 스위치, 터치 센서 등에도 적용되어야 합니다.

코멘트

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