ESP32 버튼 디바운스

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

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

ESP32 chattering phenomenon

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

준비물

1×38-pin ESP32 ESP-WROOM-32 Dev Module - Narrow 쿠팡 | 아마존
1×(또는) 38-pin ESP32 ESP-WROOM-32 Dev Module - Wide 쿠팡 | 아마존
1×(또는) 30-pin ESP32 ESP-WROOM-32 Dev Module - Wide 아마존
1×(또는) ESP32 Uno-form board 아마존
1×(또는) ESP32 S3 Uno-form board 아마존
1×USB 케이블 타입-A to 타입-C (USB-A PC용) 쿠팡 | 아마존
1×USB 케이블 타입-C to 타입-C (USB-C PC용) 아마존
1×버튼 키트 쿠팡 | 아마존
1×패널 장착 푸시 버튼 아마존
1×푸시 버튼 모듈 아마존
1×브레드보드 쿠팡 | 아마존
1×점퍼케이블 쿠팡 | 아마존
1×(옵션) DC 커넥터 전원 연결 잭 플러그 소켓 쿠팡 | 아마존
1×(추천) ESP32용 스크루 터미널 확장 보드 쿠팡 | 아마존
1×(추천) Breakout Expansion Board for ESP32 쿠팡 | 아마존
1×(추천) ESP32용 전원 분배기 쿠팡 | 아마존
공개: 이 포스팅 에 제공된 일부 링크는 아마존 제휴 링크입니다. 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

버튼에 대하여

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

ESP32 - 버튼

선연결

ESP32 버튼 연결 배선도

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

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

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

디바운스 없이 버튼 읽기

사용 방법

  • ESP32를 처음 사용하는 경우, 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 보드에 코드를 컴파일하고 업로드하세요.

아두이노 코딩

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

how to open serial monitor on 아두이노 ide
  • 버튼을 한 번 누르고 여러 초 동안 계속 누르고 있었다가 놓으세요.
  • 시리얼 모니터에서 결과를 확인하세요. 아래와 같이 보입니다:
Newbiely | Arduino IDE 2.3.8
──
File
Edit
Sketch
Tools
Help
ESP32 Dev Module
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'ESP32 Dev Module' on 'COM15')
New Line
9600 baud
The button is pressed The button is pressed The button is pressed The button is released The button is released
Ln 11, Col 1
ESP32 Dev Module on COM15
2

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

※ 주의:

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

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

사용 방법

이것이 ESP32를 처음 사용하는 경우, 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 아두이노 ide
  • 몇 초 동안 버튼을 계속 누르고 있었다가 놓으십시오.
  • 시리얼 모니터에서 결과를 확인하세요. 아래와 같이 보입니다:
Newbiely | Arduino IDE 2.3.8
──
File
Edit
Sketch
Tools
Help
ESP32 Dev Module
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'ESP32 Dev Module' on 'COM15')
New Line
9600 baud
The button is pressed The button is released
Ln 11, Col 1
ESP32 Dev Module on COM15
2

⇒ 보시다시피, 당신은 한 번 누르고 해제했고, 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 버튼 라이브러리 연결 배선도

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

코멘트