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

버튼이 눌리거나 놓이거나, 스위치가 켜질 때, 초보자들은 종존 상태가 LOW에서 HIGH 또는 HIGH에서 LOW로 변한다고 가정하는 경우가 많습니다. 실제로는 그렇지 않습니다. 기계적, 물리적 특성으로 인해 버튼(또는 스위치)의 상태는 사용자의 단일 동작당 여러 번 LOWHIGH 사이를 반복적으로 변동할 수 있습니다. 이를 차터링이라고 합니다. 차터링은 단일 누름이 여러 번 누름으로 읽히게 하여 특정 애플리케이션에서 오작동을 일으킬 수 있습니다.

chattering phenomenon

이 문제를 방지하는 방법은 디바운싱이라고 하며, 이 튜토리얼은 ESP8266을 사용할 때 버튼과 함께하는 방법을 알려드립니다. 다음 단계를 통해 배우게 됩니다:

준비물

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

버튼에 대하여

만약 당신이 버튼(핀 배치, 기능, 프로그래밍 포함)에 익숙하지 않다면, 다음의 튜토리얼이 도움이 될 수 있습니다:

ESP8266 - 버튼 튜토리얼

선연결

ESP8266 NodeMCU Button wiring diagram

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

ESP8266의 핀 배치ESP8266 및 다른 구성 요소에 전원을 공급하는 방법에 대해 더 많이 보십시오.

ESP8266 코드를 디바운스 있음과 없음으로 나누어서 각각의 행동을 비교해 보도록 하겠습니다.

디바운스 없는 읽기 버튼

디바운싱을 탐색하기 전에, 디바운싱 없이 코드를 확인하고 그 동작을 관찰하세요.

사용 방법

아두이노 IDE에서 ESP8266을 시작하려면 다음 단계를 따르세요:

  • ESP8266을 처음 사용하는 경우 Arduino IDE에서 ESP8266 환경 설정하는 방법 튜토리얼을 확인하세요.
  • 다이어그램에 표시된 대로 구성 요소를 연결하세요.
  • USB 케이블을 사용하여 ESP8266 보드를 컴퓨터에 연결하세요.
  • 컴퓨터에서 Arduino IDE를 엽니다.
  • 올바른 ESP8266 보드(예: NodeMCU 1.0 (ESP-12E Module))와 해당 COM 포트를 선택하세요.
  • USB 케이블을 사용하여 ESP8266을 컴퓨터에 연결하세요.
  • Arduino IDE를 실행하고 적절한 보드와 포트를 선택하세요.
  • 아래 코드를 복사하고 Arduino IDE에서 엽니다.
/* * 이 ESP8266 NodeMCU 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP8266 NodeMCU 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp8266/esp8266-button-debounce */ #define BUTTON_PIN D7 // ESP8266의 D7 핀이 버튼에 연결됩니다. int prev_button_state = LOW; // 입력 핀으로부터의 이전 상태 int button_state; // 입력 핀으로부터의 현재 읽기 값 void setup() { // 시리얼 모니터와 통신하기 위해 시리얼을 초기화합니다. Serial.begin(9600); // ESP8266 핀을 풀업 입력으로 구성: 버튼이 열릴 때 HIGH, 눌렸을 때 LOW pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // 스위치/버튼의 상태를 읽습니다: button_state = digitalRead(BUTTON_PIN); if (prev_button_state == HIGH && button_state == LOW) Serial.println("The button is pressed"); else if (prev_button_state == LOW && button_state == HIGH) Serial.println("The button is released"); // 마지막 상태를 저장합니다 prev_button_state = button_state; }

Arduino IDE에서 ESP8266에 코드를 컴파일하고 업로드하려면 Upload 버튼을 클릭하세요.

Arduino IDE Upload Code
  • 시리얼 모니터를 엽니다.
  • 버튼을 몇 초간 누르고 있었다가 놓으세요.
  • 시리얼 모니터에서 출력을 확인하세요.
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  

당신은 때때로 버튼을 단 한 번만 누르고 놓았음에도 불구하고, ESP8266이 그것을 여러 번 누르고 놓은 것으로 인식하는 것을 볼 수 있습니다. 이것은 튜토리얼 시작 부분에서 언급된 치터링 현상입니다. 다음 파트에서 이를 어떻게 해결하는지 살펴보겠습니다.

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

아래 코드는 디바운스라고 불리는 메소드를 적용하여 채터링 현상을 방지합니다.

/* * 이 ESP8266 NodeMCU 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP8266 NodeMCU 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp8266/esp8266-button-debounce */ #define BUTTON_PIN D7 // 버튼이 연결된 ESP8266 핀 D7 #define DEBOUNCE_TIME 50 // 디바운스 시간(밀리초), 여전히 딸깍거림이 있다면 이 시간을 늘리세요 int lastSteadyState = LOW; // 입력 핀에서 이전의 안정된 상태 int lastFlickerableState = LOW; // 입력 핀에서 이전의 불안정한 상태 int button_state; // 입력 핀에서 현재 읽는 값 // 다음 변수들은 시간이 밀리세컨드 단위로 측정되기 때문에, 곧 int에 저장될 수 있는 것보다 큰 숫자가 될 것이므로 unsigned long입니다. unsigned long lastDebounceTime = 0; // 출력 핀이 토글된 마지막 시간 void setup() { // 시리얼 모니터와 통신하기 위한 시리얼 초기화 Serial.begin(9600); // ESP8266 핀을 pull-up 입력으로 구성: 버튼이 열려있을 때 HIGH, 눌렸을 때 LOW pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // 스위치/버튼의 상태를 읽습니다: button_state = digitalRead(BUTTON_PIN); // 방금 버튼을 눌렀는지 확인하세요 // (즉, 입력이 LOW에서 HIGH로 바뀌었고) 마지막 누름 이후로 충분히 기다렸다면 노이즈를 무시합니다: // 스위치/버튼이 변경되었다면, 노이즈 때문이든 누름 때문이든: if (button_state != lastFlickerableState) { // 디바운싱 타이머를 재설정 lastDebounceTime = millis(); // 마지막 불안정한 상태를 저장 lastFlickerableState = button_state; } if ((millis() - lastDebounceTime) > DEBOUNCE_TIME) { // 읽는 값이든, 디바운스 지연시간보다 더 오래 그 상태에 있었다면, 실제 현재 상태로 받아들입니다: // 버튼 상태가 변경되었다면: if(lastSteadyState == HIGH && button_state == LOW) Serial.println("The button is pressed"); else if(lastSteadyState == LOW && button_state == HIGH) Serial.println("The button is released"); // 마지막 안정된 상태를 저장 lastSteadyState = button_state; } }

사용 방법

  • 다이어그램에 표시된 대로 구성 요소를 연결하세요.
  • USB 케이블을 사용하여 ESP8266 보드를 컴퓨터에 연결하세요.
  • 컴퓨터에서 Arduino IDE를 엽니다.
  • 올바른 ESP8266 보드를 선택하세요. 예를 들어, NodeMCU 1.0 (ESP-12E Module)과 해당 COM 포트를 선택하세요.
  • 위의 코드를 복사하여 Arduino IDE로 엽니다.
  • Arduino IDE에서 Upload 버튼을 클릭하여 코드를 ESP8266에 컴파일하고 업로드하세요.
  • 시리얼 모니터를 엽니다.
  • 몇 초 동안 버튼을 누른 상태로 유지한 다음 놓습니다.
  • 결과를 보려면 시리얼 모니터를 확인하세요.
COM6
Send
The button is pressed The button is released
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

당신이 알 수 있듯이, 당신은 버튼을 한 번만 누르고 놓았습니다. ESP8266은 그것을 단일 누르기와 놓기로 감지할 수 있어, 불필요한 잡음을 제거합니다.

우리가 단순화했습니다 - 라이브러리를 이용한 ESP8266 버튼 디바운스 코드

우리는 시작하는 사람들, 특히 여러 버튼을 사용할 때 더 간단하게 만들기 위해 ezButton 라이브러리를 개발했습니다. ezButton 라이브러리에 대해 더 알아보기.

ESP8266 단일 버튼 디바운스 코드

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

ESP8266 여러 버튼용 버튼 디바운스 코드

/* * 이 ESP8266 NodeMCU 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP8266 NodeMCU 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp8266/esp8266-button-debounce */ #include <ezButton.h> ezButton button1(D5); // D5 핀을 위한 ezButton 객체 생성 ezButton button2(D6); // D6 핀을 위한 ezButton 객체 생성 ezButton button3(D7); // D7 핀을 위한 ezButton 객체 생성 void setup() { Serial.begin(9600); button1.setDebounceTime(50); // 디바운스 시간을 50 밀리초로 설정 button2.setDebounceTime(50); // 디바운스 시간을 50 밀리초로 설정 button3.setDebounceTime(50); // 디바운스 시간을 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"); }

위 코드에 대한 개략도:.

위 코드의 배선에 대한 도면:.

위 코드의 연결 표현:.

ESP8266 NodeMCU Button Library wiring diagram

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

동영상

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

추가 지식

DEBOUNCE_DELAY의 값은 버튼의 물리적 특성에 따라 달라집니다. 각 버튼마다 다른 값을 가질 수 있습니다.

확장성

디바운스 기술은 스위치, 터치 센서 등에 사용될 수 있습니다.

댓글

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