토글 스위치 만들기¶
🎯 이 장에서 배우는 것¶
- [ ] 변수를 사용해 LED 상태를 저장할 수 있다
- [ ] 버튼을 누를 때마다 LED가 켜지고 꺼지는 토글 기능을 구현할 수 있다
- [ ] 버튼 바운싱 현상을 이해하고 해결할 수 있다
📚 핵심 개념¶
개념: 토글(Toggle)과 상태 저장¶
비유로 시작: 토글은 마치 전등 스위치와 같아요. 한 번 누르면 켜지고, 다시 누르면 꺼지죠. 이걸 구현하려면 "지금 불이 켜져 있는지 꺼져 있는지" 기억해야 해요.
정확한 정의:
- 토글: 두 상태(ON/OFF)를 번갈아 전환하는 것
- 상태 변수: 현재 상태를 저장하는 변수 (예: ledState = False)
왜 변수가 필요할까?
flowchart LR
A[버튼 누름] --> B{현재 상태?}
B -->|꺼짐| C[켜기]
B -->|켜짐| D[끄기]
C --> E[상태 저장: 켜짐]
D --> F[상태 저장: 꺼짐]
버튼을 눌렀을 때 "켜야 할지 꺼야 할지" 결정하려면, 현재 상태를 알아야 합니다!
🔨 따라하기¶
Step 1: 상태 변수로 토글 구현하기¶
from pico_stick import LED_STICK, BUTTON_A
import time
# 상태 변수: LED가 켜져 있는지 저장
ledState = False
while True:
if BUTTON_A.is_pressed():
# 상태 뒤집기: False → True, True → False
ledState = not ledState
if ledState:
LED_STICK.set_all(255, 255, 0) # 켜기
else:
LED_STICK.set_all(0, 0, 0) # 끄기
time.sleep(0.3) # 디바운싱: 잠시 대기
실행 결과:
버튼 한 번 누름 → LED 켜짐 (계속 유지)
버튼 다시 누름 → LED 꺼짐 (계속 유지)
Step 2: 바운싱 문제 이해하기¶
버튼을 한 번 눌렀는데 LED가 깜빡거리나요? 이게 바운싱(bouncing) 현상이에요!
버튼 내부의 금속이 접촉할 때 아주 짧은 시간 동안 ON/OFF가 반복됩니다. time.sleep(0.3)이 이 문제를 해결해줍니다 - 0.3초 동안은 추가 입력을 무시하는 거예요.
📝 전체 코드¶
from pico_stick import LED_STICK, BUTTON_A
import time
ledState = False # LED 상태 저장 (False = 꺼짐)
while True:
if BUTTON_A.is_pressed():
ledState = not ledState # 상태 뒤집기
if ledState:
LED_STICK.set_all(255, 255, 0)
else:
LED_STICK.set_all(0, 0, 0)
time.sleep(0.3) # 바운싱 방지
⚠️ 주의할 점¶
time.sleep() 위치가 중요해요!
- ✅ if문 안에 넣기: 버튼 누를 때만 대기
- ❌ if문 밖에 넣기: 전체 프로그램이 느려짐
✅ 점검하기¶
ledState = not ledState는 무슨 역할을 하나요?
정답 확인
현재 상태를 반대로 뒤집습니다. True는 False로, False는 True로 바꿉니다.time.sleep(0.3)을 없애면 어떤 문제가 생길까요?
정답 확인
바운싱 때문에 버튼을 한 번 눌러도 여러 번 눌린 것처럼 인식되어 LED가 불규칙하게 깜빡입니다.🔗 다음 장 미리보기¶
토글 기능을 완성했어요! 🎉 다음 장에서는 버튼 두 개를 조합해서 더 다양한 조작을 만들어봅니다.