아두이노 나노 ESP32 - 버튼 - 디바운스 | Arduino Nano ESP32 - Button - Debounce

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

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

Arduino Nano ESP32 chattering phenomenon

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

준비물

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

버튼 정보

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

Arduino Nano ESP32 - 버튼 튜토리얼

선연결

Arduino Nano ESP32 Button Wiring Diagram

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

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

디바운스 없는 읽기 버튼

사용 방법

  • Arduino Nano ESP32에 익숙하지 않다면, Arduino IDE에서 Arduino Nano ESP32 환경 설정하기에 대한 튜토리얼을 참조하세요.
  • 제공된 다이어그램에 따라 구성 요소들을 연결하세요.
  • USB 케이블을 사용하여 Arduino Nano ESP32 보드를 컴퓨터에 연결하세요.
  • 컴퓨터에서 Arduino IDE를 실행하세요.
  • Arduino Nano ESP32 보드와 해당 COM 포트를 선택하세요.* 아래 코드를 복사하여 Arduino IDE에 붙여넣으세요.
/* * 이 Arduino Nano ESP32 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino Nano ESP32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-nano-esp32/arduino-nano-esp32-button-debounce */ #define BUTTON_PIN D2 // 아두이노 나노 ESP32의 D2 핀이 버튼에 연결됨 int prev_state = LOW; // 입력 핀의 이전 상태 int button_state; // 입력 핀에서의 현재 읽기 void setup() { // 시리얼 모니터와 통신하기 위해 Serial을 초기화합니다. Serial.begin(9600); // 버튼 핀을 pull-up 입력으로 초기화합니다(스위치가 열려 있을 때 HIGH이고 닫혀 있을 때는 LOW) pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // 스위치/버튼의 상태를 읽습니다: button_state = digitalRead(BUTTON_PIN); if (prev_state == HIGH && button_state == LOW) Serial.println("The button is pressed"); else if (prev_state == LOW && button_state == HIGH) Serial.println("The button is released"); // 마지막 상태를 저장합니다 prev_state = button_state; }

아두이노 IDE에서 Upload 버튼을 클릭하여 Arduino Nano 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  

⇒ 보시다시피, 단 한 번의 눌림과 해제를 했지만, Arduino Nano ESP32는 여러 번의 눌림과 해제를 읽었습니다.

※ NOTE THAT:

잡음 현상은 항상 발생하지 않습니다. 발생하지 않으면 위의 테스트를 여러 번 시도해 주세요.

디바운스를 적용한 읽기 버튼

사용 방법

/* * 이 Arduino Nano ESP32 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino Nano ESP32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-nano-esp32/arduino-nano-esp32-button-debounce */ #define BUTTON_PIN D2 // Arduino Nano ESP32 D2 핀에 버튼 연결 #define DEBOUNCE_TIME 50 // 디바운스 시간(밀리초), 여전히 채터링이 있으면 이 시간을 늘리세요 int prev_state_steady = LOW; // 입력 핀에서의 이전 안정된 상태 int prev_state_flick = LOW; // 입력 핀에서의 이전 변동하는 상태 int button_state; // 입력 핀으로부터의 현재 읽기 값 unsigned long last_debounce_time = 0; // 출력 핀이 토글된 마지막 시간 void setup() { // 시리얼 모니터와 통신하기 위해 시리얼을 초기화합니다. Serial.begin(9600); // 버튼 핀을 풀업 입력으로 초기화합니다(스위치가 열려 있을 때 HIGH, 닫혀 있을 때 LOW). pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // 스위치/버튼의 상태를 읽습니다: button_state = digitalRead(BUTTON_PIN); // 버튼이 눌려진 것을 감지합니다 // (즉, 입력이 LOW에서 HIGH로 바뀌었고), 마지막 누름 이후 충분한 시간이 지났을 때 // 노이즈를 무시할 수 있습니다: // 스위치/버튼이 변경되었으면, 노이즈 또는 눌림으로 인해: if (button_state != prev_state_flick) { // 디바운싱 타이머를 초기화합니다 last_debounce_time = millis(); // 마지막 변동하는 상태를 저장합니다 prev_state_flick = button_state; } if ((millis() - last_debounce_time) > DEBOUNCE_TIME) { // 읽기 값이 무엇이든, 디바운스 지연 시간보다 더 길게 그 상태에 있었으므로 // 실제 현재 상태로 받아들입니다: // 버튼 상태가 변경되었다면: if(prev_state_steady == HIGH && button_state == LOW) Serial.println("The button is pressed"); else if(prev_state_steady == LOW && button_state == HIGH) Serial.println("The button is released"); // 마지막 안정된 상태를 저장합니다 prev_state_steady = button_state; } }
  • Arduino IDE에서 Upload 버튼을 클릭하여 코드를 Arduino Nano ESP32 보드에 컴파일하고 업로드하세요.
  • Arduino IDE에서 시리얼 모니터를 엽니다.
  • 몇 초 동안 버튼을 계속 누른 상태로 유지한 다음에 놓습니다.
  • 시리얼 모니터에서 결과를 확인하세요. 아래와 같이 보일 것입니다:
COM6
Send
The button is pressed The button is released
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

⇒ 보시다시피, 당신은 한 번 누르고 놓았고, Arduino Nano ESP32는 한 번 누름과 놓음을 읽었습니다. 채터링이 제거되었습니다.

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

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

아두이노 나노 ESP32 버튼 디바운스 코드 (단일 버튼용)

/* * 이 Arduino Nano ESP32 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino Nano ESP32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-nano-esp32/arduino-nano-esp32-button-debounce */ #include <ezButton.h> #define DEBOUNCE_TIME 50 // 밀리초 단위의 디바운스 시간, 여전히 채터링이 발생한다면 이 시간을 늘리세요. ezButton button(D2); // D2 핀을 위한 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 버튼 디바운스 코드(복수 버튼용)

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

배선도

Arduino Nano ESP32 Button Library Wiring Diagram

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

/* * 이 Arduino Nano ESP32 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino Nano ESP32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-nano-esp32/arduino-nano-esp32-button-debounce */ #include <ezButton.h> #define DEBOUNCE_TIME 50 // 밀리초 단위의 디바운스 시간, 여전히 채터링이 발생하면 이 시간을 늘리세요. ezButton button1(D6); // D6핀을 위한 ezButton 객체 생성 ezButton button2(D7); // D7핀을 위한 ezButton 객체 생성 ezButton button3(D8); // D8핀을 위한 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!