아두이노 나노 ESP32 버튼 디바운스

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

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

아두이노 나노 ESP32 chattering phenomenon

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

준비물

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

버튼 정보

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

아두이노 나노 ESP32 - 버튼

선연결

아두이노 나노 ESP32 버튼 연결 배선도

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

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

디바운스 없는 읽기 버튼

사용 방법

  • Arduino Nano ESP32에 익숙하지 않다면, 아두이노 나노 ESP32 - 소프트웨어 설치에 대한 튜토리얼을 참조하세요.
  • 제공된 다이어그램에 따라 구성 요소들을 연결하세요.
  • USB 케이블을 사용하여 Arduino Nano ESP32 보드를 컴퓨터에 연결하세요.
  • 컴퓨터에서 Arduino IDE를 실행하세요.
  • Arduino Nano ESP32 보드와 해당 COM 포트를 선택하세요.* 아래 코드를 복사하여 Arduino IDE에 붙여넣으세요.
/* * 이 아두이노 나노 esp32 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 나노 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 보드에 코드를 컴파일하고 업로드하세요.

아두이노 코딩

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

how to open serial monitor on 아두이노 ide
  • 버튼을 한 번 누르고 몇 초간 유지한 다음에 놓으세요.
  • 시리얼 모니터에서 결과를 확인하세요. 아래와 같이 보입니다:
Newbiely | Arduino IDE 2.3.8
──
File
Edit
Sketch
Tools
Help
Arduino Nano ESP32
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano ESP32' 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
Arduino Nano ESP32 on COM15
2

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

※ 주의:

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

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

사용 방법

/* * 이 아두이노 나노 esp32 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 나노 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에서 시리얼 모니터를 엽니다.
  • 몇 초 동안 버튼을 계속 누른 상태로 유지한 다음에 놓습니다.
  • 시리얼 모니터에서 결과를 확인하세요. 아래와 같이 보일 것입니다:
Newbiely | Arduino IDE 2.3.8
──
File
Edit
Sketch
Tools
Help
Arduino Nano ESP32
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano ESP32' on 'COM15')
New Line
9600 baud
The button is pressed The button is released
Ln 11, Col 1
Arduino Nano ESP32 on COM15
2

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

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

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

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

/* * 이 아두이노 나노 esp32 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 나노 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 버튼 디바운스 코드(복수 버튼용)

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

배선도

아두이노 나노 ESP32 버튼 라이브러리 연결 배선도

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

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