라즈베리 파이 버튼 길게 누르기 짧게 누르기

이 튜토리얼은 라즈베리 파이를 사용하여 버튼의 짧은 누름과 긴 누름을 탐지하는 방법을 가르칩니다. 간단하게 하기 위해 다음과 같은 예제로 나누겠습니다.

마지막 섹션에서는 실용적인 환경에서 디바운스를 활용하는 방법을 탐구할 것입니다. 버튼에 대한 디바운스가 필요한 이유에 대한 자세한 내용은 이 기사를 참조하십시오. 디바운스 없이 버튼의 짧은 누름을 잘못 감지할 수 있습니다.

Hardware Preparation

1×Raspberry Pi 4 Model B Amazon
1×Breadboard-mount Button with Cap 쿠팡 | Amazon
1×Breadboard-mount Button Kit 쿠팡 | Amazon
1×Panel-mount Push Button Amazon
1×Breadboard 쿠팡 | Amazon
1×Jumper Wires Amazon
1×(추천) Screw Terminal Block Shield for Raspberry Pi 쿠팡 | Amazon
1×(추천) USB-C Power Cable with On/Off Switch for Raspberry Pi 4B Amazon
1×(추천) Plastic Case and Cooling Fan for Raspberry Pi 4B Amazon
1×(추천) HDMI Touch Screen Monitor for Raspberry Pi Amazon
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.

버튼 정보

버튼(핀아웃, 작동 방식, 프로그래밍 방법 포함)에 익숙하지 않은 경우, 다음 튜토리얼이 안내를 제공할 수 있습니다:

Wiring Diagram

라즈베리 파이 버튼 배선도

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

배선 구성을 간단하고 체계적으로 만들기 위해, Raspberry Pi용 스크루 터미널 블록 실드 사용을 권장합니다. 이 실드는 아래와 같이 더욱 안정적이고 관리하기 쉬운 연결을 제공합니다:

Raspberry Pi Screw Terminal Block Shield

이 튜토리얼에서는 내부 풀업 저항을 사용할 것입니다. 따라서 버튼이 눌리지 않았을 때는 상태가 HIGH이고, 눌렸을 때는 상태가 LOW입니다.

짧은 눌림 감지 방법

누르는 이벤트와 놓는 이벤트 사이의 시간을 계산합니다. 이 기간이 미리 정해진 시간보다 짧으면 짧은 눌림 이벤트를 감지합니다.

짧게 누름의 지속 시간을 지정하세요.

SHORT_PRESS_TIME = 0.5 # 500밀리초
  • 버튼이 눌렸는지 감지하고 눌린 시간을 기록하세요.
if prev_button_state == GPIO.HIGH and button_state == GPIO.LOW: # 버튼이 눌렸습니다 press_time_start = time.time()
  • 버튼이 놓인 시간을 확인하고 놓은 시간을 기록합니다.
if prev_button_state == GPIO.LOW and button_state == GPIO.HIGH: # 버튼이 눌렸다가 떼어짐 press_time_end = time.time()
  • 누르는 시간을 결정하십시오.
press_duration = press_time_end - press_time_start # 누른 시간 계산
  • 짧은 누름 시간으로 정의된 시간과 누름 지속 시간을 비교하여 짧은 누름을 식별합니다.
if press_duration < SHORT_PRESS_TIME: print("A short press is detected") # 짧은 버튼 누르기가 감지되었습니다.

버튼 짧게 누르기를 감지하는 Raspberry Pi 코드

Detailed Instructions

  • 라즈비안 또는 기타 Raspberry Pi 호환 운영 체제가 Pi에 설치되어 있는지 확인하세요.
  • Raspberry Pi가 PC와 동일한 로컬 네트워크에 연결되어 있는지 확인하세요.
  • 라이브러리를 설치해야 하는 경우 Raspberry Pi가 인터넷에 연결되어 있는지 확인하세요.
  • 처음 Raspberry Pi를 사용하는 경우 Raspberry Pi 설정 방법을 참조하세요.
  • Linux 및 macOS에서는 내장된 SSH 클라이언트를 사용하거나 Windows에서는 PuTTY를 사용하여 SSH를 통해 Raspberry Pi에 PC를 연결하세요. SSH를 통해 PC를 Raspberry Pi에 연결하는 방법을 참조하세요.
  • RPi.GPIO 라이브러리가 설치되어 있는지 확인하세요. 설치되어 있지 않으면 다음 명령어를 사용하여 설치하세요:
sudo apt-get update sudo apt-get install python3-rpi.gpio
  • 파이썬 스크립트 파일 short_press.py을(를) 생성하고 다음 코드를 추가하십시오.
# 이 Raspberry Pi 코드는 newbiely.kr 에서 개발되었습니다 # 이 Raspberry Pi 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. # 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: # https://newbiely.kr/tutorials/raspberry-pi/raspberry-pi-button-long-press-short-press import RPi.GPIO as GPIO import time BUTTON_PIN = 16 SHORT_PRESS_TIME = 0.5 # 500 milliseconds DEBOUNCE_TIME = 0.1 # 100 milliseconds # Variables will change: prev_button_state = GPIO.LOW # the previous state from the input pin button_state = None # the current reading from the input pin press_time_start = 0 press_time_end = 0 # Set up GPIO and configure the pull-up resistor GPIO.setmode(GPIO.BCM) GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) try: while True: # Read the state of the switch/button button_state = GPIO.input(BUTTON_PIN) # Perform debounce by waiting for DEBOUNCE_TIME time.sleep(DEBOUNCE_TIME) if prev_button_state == GPIO.HIGH and button_state == GPIO.LOW: # Button is pressed press_time_start = time.time() elif prev_button_state == GPIO.LOW and button_state == GPIO.HIGH: # Button is released press_time_end = time.time() press_duration = press_time_end - press_time_start if press_duration < SHORT_PRESS_TIME: print("A short press is detected") # Save the last state prev_button_state = button_state except KeyboardInterrupt: print("\nExiting the program.") GPIO.cleanup()
  • 파일을 저장하고 터미널에서 다음 명령을 실행하여 Python 스크립트를 실행하세요:
python3 short_press.py
  • 버튼을 짧게 여러 번 누르세요.
  • 터미널에서 결과를 확인하세요.
PuTTY - Raspberry Pi
A short press is detected A short press is detected A short press is detected

스크립트는 터미널에서 Ctrl + C를 누를 때까지 무한 루프에서 계속 실행됩니다.

길게 누르기를 감지하는 방법

긴 누르기를 인식하는 두 가지 시나리오가 있습니다:

  • 버튼이 해제된 직후에 롱 프레스 이벤트가 식별됩니다.
  • 버튼이 눌린 상태에서도, 해제되기 전에도 롱 프레스 이벤트가 식별됩니다.

첫 번째 시나리오에서는 누름 및 해제 이벤트 사이의 지속 시간이 계산됩니다. 이 지속 시간이 미리 정해진 시간을 초과하면, 롱 프레스 이벤트가 식별됩니다.

두 번째 시나리오에서는 버튼이 눌렸을 때, 버튼을 뗄 때까지 누른 시간을 지속적으로 확인합니다. 버튼을 누르고 있는 동안 시간이 미리 정해진 시간을 초과하면, 롱프레스 이벤트가 감지됩니다.

라즈베리 파이 코드: 버튼을 떼면 롱 프레스 감지

Detailed Instructions

  • Python 스크립트 파일 long_press_1.py을 생성하고 다음 코드를 추가하세요:
# 이 Raspberry Pi 코드는 newbiely.kr 에서 개발되었습니다 # 이 Raspberry Pi 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. # 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: # https://newbiely.kr/tutorials/raspberry-pi/raspberry-pi-button-long-press-short-press import RPi.GPIO as GPIO import time BUTTON_PIN = 16 LONG_PRESS_TIME = 1.0 # 1 seconds DEBOUNCE_TIME = 0.1 # 100 milliseconds # Variables will change: prev_button_state = GPIO.LOW # the previous state from the input pin button_state = None # the current reading from the input pin press_time_start = 0 press_time_end = 0 # Set up GPIO and configure the pull-up resistor GPIO.setmode(GPIO.BCM) GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) try: while True: # Read the state of the switch/button button_state = GPIO.input(BUTTON_PIN) # Perform debounce by waiting for DEBOUNCE_TIME time.sleep(DEBOUNCE_TIME) if prev_button_state == GPIO.HIGH and button_state == GPIO.LOW: # Button is pressed press_time_start = time.time() elif prev_button_state == GPIO.LOW and button_state == GPIO.HIGH: # Button is released press_time_end = time.time() press_duration = press_time_end - press_time_start if press_duration >= LONG_PRESS_TIME: print("A long press is detected") # Save the last state prev_button_state = button_state except KeyboardInterrupt: print("\nExiting the program.") GPIO.cleanup()
  • 파일을 저장하고 터미널에서 다음 명령을 실행하여 Python 스크립트를 실행하십시오:
python3 long_press_1.py
  • 버튼을 2초 동안 누른 후 버튼을 놓으세요.
  • 터미널에서 결과를 확인하세요.
PuTTY - Raspberry Pi
A long press is detected

버튼이 놓였을 때만 길게 누르는 이벤트가 인식됩니다.

누름 중 장시간 눌림을 감지하는 Raspberry Pi 코드

Detailed Instructions

  • 파이썬 스크립트 파일 long_press_2.py를 작성하고 다음 코드를 추가하세요.
# 이 Raspberry Pi 코드는 newbiely.kr 에서 개발되었습니다 # 이 Raspberry Pi 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. # 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: # https://newbiely.kr/tutorials/raspberry-pi/raspberry-pi-button-long-press-short-press import RPi.GPIO as GPIO import time BUTTON_PIN = 16 LONG_PRESS_TIME = 1.0 # 1000 milliseconds (1 second) # Variables will change: prev_button_state = GPIO.LOW # the previous state from the input pin button_state = None # the current reading from the input pin press_time_start = 0 is_pressing = False is_long_detected = False # Set up GPIO and configure the pull-up resistor GPIO.setmode(GPIO.BCM) GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) try: while True: # Read the state of the switch/button button_state = GPIO.input(BUTTON_PIN) if prev_button_state == GPIO.HIGH and button_state == GPIO.LOW: # Button is pressed press_time_start = time.time() is_pressing = True is_long_detected = False elif prev_button_state == GPIO.LOW and button_state == GPIO.HIGH: # Button is released is_pressing = False if is_pressing and not is_long_detected: press_duration = time.time() - press_time_start if press_duration > LONG_PRESS_TIME: print("A long press is detected") is_long_detected = True # Save the last state prev_button_state = button_state except KeyboardInterrupt: print("\nExiting the program.") GPIO.cleanup()
  • 파일을 저장하고 터미널에서 다음 명령을 실행하여 Python 스크립트를 실행하세요:
python3 long_press_2.py
  • 버튼을 누르고 몇 초간 유지한 후 버튼에서 손을 떼세요.
  • 시리얼 모니터에서 결과를 확인하세요.
PuTTY - Raspberry Pi
A long press is detected

버튼이 놓이지 않았을 때도 길게 누르는 이벤트만 감지됩니다.

길게 누르기와 짧게 누르기를 모두 감지하는 방법

Detailed Instructions

  • 파이썬 스크립트 파일 long_short_press.py을(를) 생성하고 다음 코드를 추가하십시오:
# 이 Raspberry Pi 코드는 newbiely.kr 에서 개발되었습니다 # 이 Raspberry Pi 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. # 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: # https://newbiely.kr/tutorials/raspberry-pi/raspberry-pi-button-long-press-short-press import RPi.GPIO as GPIO import time BUTTON_PIN = 16 SHORT_PRESS_TIME = 0.5 # 500 milliseconds LONG_PRESS_TIME = 1.0 # 1 seconds DEBOUNCE_TIME = 0.1 # 100 milliseconds # Variables will change: prev_button_state = GPIO.LOW # the previous state from the input pin button_state = None # the current reading from the input pin press_time_start = 0 press_time_end = 0 # Set up GPIO and configure the pull-up resistor GPIO.setmode(GPIO.BCM) GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) try: while True: # Read the state of the switch/button button_state = GPIO.input(BUTTON_PIN) # Perform debounce by waiting for DEBOUNCE_TIME time.sleep(DEBOUNCE_TIME) if prev_button_state == GPIO.HIGH and button_state == GPIO.LOW: # Button is pressed press_time_start = time.time() elif prev_button_state == GPIO.LOW and button_state == GPIO.HIGH: # Button is released press_time_end = time.time() press_duration = press_time_end - press_time_start if press_duration < SHORT_PRESS_TIME: print("A short press is detected") elif press_duration >= LONG_PRESS_TIME: print("A long press is detected") # Save the last state prev_button_state = button_state except KeyboardInterrupt: print("\nExiting the program.") GPIO.cleanup()
  • 파일을 저장하고 터미널에서 다음 명령어를 실행하여 Python 스크립트를 실행하세요:
python3 long_short_press.py
  • 버튼을 짧게 또는 길게 눌러보세요.
  • 터미널에서 결과를 확인하세요.

Video Tutorial

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

왜 길게 누르기와 짧게 누르기가 필요한가

  • 버튼 수를 최소화하기 위해 하나의 버튼으로 여러 기능을 수행할 수 있습니다. 예를 들어, 짧게 누르면 작동 모드를 전환할 수 있고, 길게 누르면 기기를 종료할 수 있습니다.
  • 길게 누르는 기능은 실수로 짧게 누르는 것을 방지하는 데 도움이 됩니다. 예를 들어, 일부 기기는 버튼을 사용하여 초기화를 시작합니다. 버튼이 실수로 눌리면 위험할 수 있습니다. 이를 방지하기 위해 버튼을 일정 시간(예: 5초 동안) 눌러야만 기기가 초기화를 시작하도록 설계되었습니다.