콘텐츠로 이동

토글 스위치 만들기

🎯 이 장에서 배우는 것

  • [ ] 변수를 사용해 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문 밖에 넣기: 전체 프로그램이 느려짐


✅ 점검하기

  1. ledState = not ledState는 무슨 역할을 하나요?
정답 확인현재 상태를 반대로 뒤집습니다. True는 False로, False는 True로 바꿉니다.
  1. time.sleep(0.3)을 없애면 어떤 문제가 생길까요?
정답 확인바운싱 때문에 버튼을 한 번 눌러도 여러 번 눌린 것처럼 인식되어 LED가 불규칙하게 깜빡입니다.

🔗 다음 장 미리보기

토글 기능을 완성했어요! 🎉 다음 장에서는 버튼 두 개를 조합해서 더 다양한 조작을 만들어봅니다.