Skip to main content

How to use buttons(버튼 사용하기)

이 가이드는 Codi:bit 보드의 내장 버튼을 사용하여 사용자 입력을 감지하는 방법을 보여줍니다.

사전 요구사항

  • Python 기본 지식
  • Codi:bit 보드
  • MicroPython 환경 설정 완료

버튼 상태 감지

Codi:bit 버튼 클래스는 세 가지 주요 메서드를 제공하여 다양한 버튼 상태를 감지할 수 있습니다:

1. is_pressed() - 눌림 순간 감지

버튼이 눌리는 정확한 순간을 감지합니다 (한 번의 이벤트).

from codibit import *

while True:
# 버튼 A가 눌리는 순간 감지
if button_a.is_pressed():
print("버튼 A가 눌렸습니다!")

# 버튼 B가 눌리는 순간 감지
if button_b.is_pressed():
print("버튼 B가 눌렸습니다!")

# 최적 성능을 위한 작은 지연
sleep(0.01)

2. is_holding() - 계속 눌린 상태 감지

버튼이 계속 눌려있는 상태를 감지합니다.

from codibit import *

while True:
# 버튼 A가 계속 눌려있는지 확인
if button_a.is_holding():
print("버튼 A가 눌려있습니다...")

# 버튼 B가 계속 눌려있는지 확인
if button_b.is_holding():
print("버튼 B가 눌려있습니다...")

sleep(0.01)

3. is_released() - 떼어짐 순간 감지

버튼이 떼어지는 정확한 순간을 감지합니다 (한 번의 이벤트).

from codibit import *

while True:
# 버튼 A가 떼어지는 순간 감지
if button_a.is_released():
print("버튼 A가 떼어졌습니다!")

# 버튼 B가 떼어지는 순간 감지
if button_b.is_released():
print("버튼 B가 떼어졌습니다!")

sleep(0.01)

완전한 버튼 상태 모니터링

모든 버튼 상태를 동시에 모니터링할 수 있습니다:

from codibit import *

while True:
# 눌림 감지
if button_a.is_pressed():
print("🔴 버튼 A: 눌렸습니다!")

# 계속 눌린 상태
if button_a.is_holding():
print("🟡 버튼 A: 눌린 중...", end='\r')

# 떼어짐 감지
if button_a.is_released():
print("🟢 버튼 A: 떼어졌습니다!")

sleep(0.01)

버튼 눌림 횟수 세기

get_presses() 메서드는 총 버튼 눌림 횟수를 반환하고 카운터를 리셋합니다.

from codibit import *

print("버튼을 여러 번 누른 후 5초간 기다리면 카운트가 표시됩니다...")

while True:
# 5초 대기
sleep(5)

# 버튼 A가 눌린 횟수 가져오기
a_presses = button_a.get_presses()

# 버튼 B가 눌린 횟수 가져오기
b_presses = button_b.get_presses()

# 카운트 표시
if a_presses > 0:
print(f"버튼 A가 {a_presses}번 눌렸습니다")

if b_presses > 0:
print(f"버튼 B가 {b_presses}번 눌렸습니다")

누적 버튼 눌림 횟수 추적

get_press_count() 메서드는 누적된 총 버튼 눌림 횟수를 반환하되 카운터를 리셋하지 않습니다.

from codibit import *

print("버튼을 눌러보세요. 실시간으로 누적 횟수가 표시됩니다...")

while True:
# 누적된 버튼 A 눌림 횟수
total_a = button_a.get_press_count()

# 누적된 버튼 B 눌림 횟수
total_b = button_b.get_press_count()

# 실시간 표시
print(f"\r총 누름 횟수 - A: {total_a}, B: {total_b}", end="")

sleep(0.1)

get_presses() vs get_press_count() 비교

두 메서드의 차이점을 이해하는 것이 중요합니다:

from codibit import *

print("버튼을 여러 번 눌러보세요...")
sleep(3)

# 첫 번째 확인
presses_a = button_a.get_presses() # 카운터 리셋됨
count_a = button_a.get_press_count() # 카운터 리셋되지 않음

print(f"get_presses(): {presses_a} (리셋됨)")
print(f"get_press_count(): {count_a} (누적)")

sleep(2)

# 두 번째 확인
presses_a2 = button_a.get_presses() # 0 (이미 리셋됨)
count_a2 = button_a.get_press_count() # 여전히 누적값

print(f"get_presses(): {presses_a2} (여전히 0)")
print(f"get_press_count(): {count_a2} (누적 유지)")

고급 버튼 패턴

상태 기반 버튼 처리

더 복잡한 상호작용을 위해 버튼 상태를 추적합니다:

from codibit import *

button_a_pressed = False
counter = 0

print("버튼 A: 증가, 버튼 B: 감소")
print(f"카운터: {counter}")

while True:
# 버튼 A 눌림 감지
if button_a.is_pressed():
button_a_pressed = True
counter += 1
print(f"카운터: {counter}")

# 버튼 A 떼어짐 감지
if button_a.is_released():
button_a_pressed = False
print("버튼 A가 떼어졌습니다")

# 버튼 B 눌림 감지
if button_b.is_pressed():
counter -= 1
print(f"카운터: {counter}")

# 버튼 B 떼어짐 감지
if button_b.is_released():
print("버튼 B가 떼어졌습니다")

sleep(0.01)

동시 버튼 감지

여러 버튼이 동시에 눌렸을 때를 감지합니다:

from codibit import *

print("버튼 A와 B를 동시에 눌러주세요...")

while True:
# 두 버튼이 동시에 눌려있는지 확인
if button_a.is_holding() and button_b.is_holding():
print("두 버튼이 모두 눌려있습니다!")

# 개별 버튼 눌림 감지
if button_a.is_pressed():
print("버튼 A가 눌렸습니다")

if button_b.is_pressed():
print("버튼 B가 눌렸습니다")

# 개별 버튼 떼어짐 감지
if button_a.is_released():
print("버튼 A가 떼어졌습니다")

if button_b.is_released():
print("버튼 B가 떼어졌습니다")

sleep(0.01)

간단한 메뉴 시스템

버튼을 사용한 기본 메뉴 시스템을 만들어봅시다.

from codibit import *

menu_items = ["게임 시작", "설정", "종료"]
current_item = 0

def show_menu():
print(f"메뉴: {menu_items[current_item]}")
print("A: 선택, B: 다음")

# 초기 메뉴 표시
show_menu()

while True:
# 메뉴 선택
if button_a.is_pressed():
print(f"선택됨: {menu_items[current_item]}")
sleep(1)
show_menu()

# 메뉴 탐색
if button_b.is_pressed():
current_item = (current_item + 1) % len(menu_items)
show_menu()

sleep(0.01)

팁과 모범 사례

1. 적절한 메서드 선택

  • is_pressed(): 버튼이 눌리는 순간 감지 (한 번의 이벤트)
  • is_holding(): 버튼이 계속 눌린 상태 감지
  • is_released(): 버튼이 떼어지는 순간 감지 (한 번의 이벤트)
  • get_presses(): 주기적 카운팅 (카운터 리셋)
  • get_press_count(): 실시간 누적 카운팅 (카운터 유지)

2. 성능 최적화

루프에 항상 작은 지연을 포함하세요:

sleep(0.01)  # 10ms - 대부분의 경우 권장
sleep(0.05) # 50ms - 안정성 중심 애플리케이션용

3. 버튼 상태 흐름

일반적인 버튼 상호작용 흐름:

  1. is_pressed() - 버튼이 눌림
  2. is_holding() - 버튼이 계속 눌려있음 (연속)
  3. is_released() - 버튼이 떼어짐

4. 디바운싱

버튼은 50ms 지연으로 자동 디바운싱 처리됩니다. 조정 가능합니다:

button_a = Button(BUTTON_A_PIN, debounce_ms=30)  # 더 빠른 반응
button_b = Button(BUTTON_B_PIN, debounce_ms=100) # 더 안정적

5. 이벤트 처리 모범 사례

# ✅ 좋은 예: 모든 상태를 순서대로 확인
if button_a.is_pressed():
print("눌렸습니다!")

if button_a.is_holding():
print("눌린 중...")

if button_a.is_released():
print("떼어졌습니다!")

# ❌ 피해야 할 예: 상태 확인 누락
if button_a.is_holding(): # is_pressed()를 먼저 확인해야 함
print("눌린 중...")

6. 카운터 관리

  • get_presses(): 카운터 리셋, 주기적 카운팅에 적합
  • get_press_count(): 카운터 유지, 누적 통계에 적합

7. 메모리 효율성

MicroPython 환경에서는 반응성과 CPU 사용량의 균형을 위해 적절한 sleep 간격을 사용하세요.