ESP32 마이크로파이썬 버튼 디바운스

때때로 ESP32에 버튼을 연결하면 버튼을 한 번만 눌러도 여러 번 눌린 것처럼 보일 수 있습니다. 이는 버튼이 눌린 상태와 눌리지 않은 상태를 빠르게 전환할 수 있기 때문입니다. 이것을 바운싱이라고 하며, 채터링으로도 알려져 있습니다. 바운싱은 프로그램에 문제를 일으킬 수 있습니다.

이 가이드는 MicroPython을 사용한 디바운싱이라는 기법을 통해 ESP32의 이 문제를 해결하는 방법을 보여줍니다. 디바운싱은 ESP32가 하나의 버튼 누름을 한 번의 누름으로 인식하도록 도와줍니다.

ESP32 마이크로파이썬 채터링 현상

우리는 아래 단계를 통해 배울 것입니다:

준비물

1×ESP32 ESP-WROOM-32 개발 모듈 쿠팡 | 아마존
1×USB 케이블 타입-A to 타입-C (USB-A PC용) 쿠팡 | 아마존
1×USB 케이블 타입-C to 타입-C (USB-C PC용) 아마존
1×캡이 있는 버튼 쿠팡 | 아마존
1×버튼 키트 쿠팡 | 아마존
1×패널 장착 푸시 버튼 아마존
1×푸시 버튼 모듈 아마존
1×브레드보드 쿠팡 | 아마존
1×점퍼케이블 쿠팡 | 아마존
1×(추천) ESP32용 스크루 터미널 확장 보드 쿠팡 | 아마존
1×(추천) ESP32용 전원 분배기 쿠팡 | 아마존
공개: 이 포스팅 에 제공된 일부 링크는 아마존 제휴 링크입니다. 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

버튼 정보

버튼에 대해 아직 익숙하지 않다면 (핀 구성, 작동 원리, ESP32와의 인터페이싱, 그리고 ESP32와 상호작용하기 위한 MicroPython 코드 작성 방법 포함), 관련 내용을 더 알아보실 수 있습니다:

선연결

  • breadboard를 사용하여 ESP32와 버튼을 연결하는 방법
ESP32 마이크로파이썬 버튼 배선 다이어그램

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

ESP32 마이크로파이썬 두 핀 푸시 버튼 배선도

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

디바운스 처리가 없는 ESP32 MicroPython 코드와 디바운스 처리가 적용된 코드를 비교하여, 디바운스 처리가 동작에 어떤 영향을 미치는지 살펴보자.

ESP32 - 디바운스 없는 버튼

먼저, 동작을 이해하기 위해 디바운싱 없이 ESP32용 MicroPython 코드를 살펴보겠습니다.

/* * 이 ESP32 마이크로파이썬 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP32 마이크로파이썬 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp32-micropython/esp32-micropython-button-debounce */ from machine import Pin import time BUTTON_PIN = 21 # The ESP32 pin GPIO21 connected to the button # Setup the button pin. The Pin.PULL_UP enables the internal pull-up resistor. button = Pin(BUTTON_PIN, Pin.IN, Pin.PULL_UP) # Initialize the previous state of the button prev_button_state = 1 # Assuming the button is unpressed initially while True: # Read the current state of the button button_state = button.value() # Check if button was released if prev_button_state == 0 and button_state == 1: print("The button is released") # Check if button was pressed if prev_button_state == 1 and button_state == 0: print("The button is pressed") # Save the current state as the previous state for the next loop iteration prev_button_state = button_state

자세한 사용 방법

ESP32에서 Thonny IDE를 사용하여 MicroPython 코드를 설정하고 실행하는 방법에 대한 지침은 다음과 같습니다:

  • 컴퓨터에 Thonny IDE가 설치되어 있는지 확인하세요.
  • ESP32 보드에 MicroPython 펌웨어가 로드되어 있는지 확인하세요.
  • MicroPython과 함께 ESP32를 처음 사용하신다면, 단계별 지침은 ESP32 마이크로파이썬 - 시작하기 가이드를 확인하세요.
  • 다이어그램과 같이 버튼을 ESP32에 연결하세요.
  • USB 케이블을 이용해 ESP32 보드를 컴퓨터에 연결하세요.
  • 컴퓨터에서 Thonny IDE를 실행하세요.
  • Thonny IDE에서 도구 옵션을 선택하세요.
  • 인터프리터 탭에서 드롭다운 메뉴를 이용해 MicroPython (ESP32)를 선택하세요.
  • 정확한 포트가 선택되었는지 확인하세요. Thonny IDE는 보통 이를 자동으로 감지하지만, Windows의 경우 COM12, Linux의 경우 /dev/ttyACM0와 같이 수동으로 선택해야 할 수도 있습니다.
  • 제공된 MicroPython 코드를 복사하여 Thonny의 편집기에 붙여넣으세요.
  • 다음 방법으로 ESP32에 코드를 저장하세요:
    • 저장 버튼을 클릭하거나 Ctrl+S를 누르세요.
    • 저장 대화상자에서 MicroPython 장치를 선택하세요.
    • 파일 이름을 main.py로 지정하세요.
  • 녹색 실행 버튼을 클릭하거나 F5를 눌러 스크립트를 실행하세요.
  • 버튼을 몇 초간 누르고 있다가 놓으세요.
  • Thonny IDE 하단의 Shell에서 메시지를 확인하세요.
Shell x
>>> %Run -c $EDITOR_CONTENT
MPY: soft reboot The button is pressed The button is pressed The button is pressed The button is released The button is released
MicroPython (ESP32) • CP2102 USB To UART Bridge Controller @ COM12 ≡

로그에서 볼 수 있듯이, 버튼을 단 한 번만 누르셨지만 ESP32는 여러 번 누른 것으로 감지되었습니다.

버튼에 대한 ESP32 디바운스

/* * 이 ESP32 마이크로파이썬 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP32 마이크로파이썬 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp32-micropython/esp32-micropython-button-debounce */ from DIYables_MicroPython_Button import Button import time # Initialize buttons connected to GPIO pins GPIO21 button = Button(21) button.set_debounce_time(100) # Set debounce time to 100 milliseconds while True: button.loop() if button.is_pressed(): print("The button is pressed") if button.is_released(): print("The button is released")
빠른 단계
  • Thonny IDE에서 Thonny IDE의 도구 패키지 관리로 이동합니다.
  • “DIYables-MicroPython-Button”을 검색한 후, DIYables에서 만든 Button 라이브러리를 찾습니다.
  • DIYables-MicroPython-Button을 클릭한 후, Button 라이브러리를 설치하기 위해 Install 버튼을 클릭합니다.
ESP32 마이크로파이썬 버튼 라이브러리
  • 주어진 코드를 복사하여 Thonny IDE의 편집기에 붙여넣습니다.
  • ESP32 보드에 스크립트를 저장합니다.
  • 초록색 실행 버튼(또는 F5 키)을 클릭하여 스크립트를 시작합니다. 스크립트가 실행됩니다.
  • 버튼을 누릅니다.
  • Thonny IDE 하단 Shell의 메시지를 확인합니다.
Shell x
>>> %Run -c $EDITOR_CONTENT
MPY: soft reboot The button is pressed The button is released
MicroPython (ESP32) • CP2102 USB To UART Bridge Controller @ COM12 ≡

버튼을 한 번 눌렀고, ESP32는 추가적인 간섭 없이 이를 단일 누름 및 놓음으로 올바르게 인식했습니다.

※ 주의:

다른 앱은 서로 다른 DEBOUNCE_TIME 설정을 사용합니다. 각 앱마다 고유한 값이 있을 수 있습니다.

ESP32: 여러 버튼을 위한 디바운스

MicroPython을 사용하는 ESP32로 네 개의 버튼에 디바운싱을 추가해봅시다. ESP32에 버튼들을 연결하는 방법은 다음과 같습니다:

ESP32 마이크로파이썬 4 버튼 배선 다이어그램

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

/* * 이 ESP32 마이크로파이썬 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP32 마이크로파이썬 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp32-micropython/esp32-micropython-button-debounce */ from DIYables_MicroPython_Button import Button import time button_1 = Button(25) # Initialize buttons connected to ESP32 pin GPIO25 button_2 = Button(26) # Initialize buttons connected to ESP32 pin GPIO26 button_3 = Button(27) # Initialize buttons connected to ESP32 pin GPIO27 button_4 = Button(14) # Initialize buttons connected to ESP32 pin GPIO14 button_1.set_debounce_time(100) # Set debounce time to 100 milliseconds button_2.set_debounce_time(100) # Set debounce time to 100 milliseconds button_3.set_debounce_time(100) # Set debounce time to 100 milliseconds button_4.set_debounce_time(100) # Set debounce time to 100 milliseconds while True: button_1.loop() button_2.loop() button_3.loop() button_4.loop() if button_1.is_pressed(): print("The button 1 is pressed") if button_1.is_released(): print("The button 1 is released") if button_2.is_pressed(): print("The button 2 is pressed") if button_2.is_released(): print("The button 2 is released") if button_3.is_pressed(): print("The button 3 is pressed") if button_3.is_released(): print("The button 3 is released") if button_4.is_pressed(): print("The button 4 is pressed") if button_4.is_released(): print("The button 4 is released")

동영상

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