콘텐츠로 이동

🎯 1주차 통합 미션 - 나만의 알림 시스템

"버튼 하나로 세상에 신호를 보내자!"


🎯 이 장에서 배우는 것

  • 버튼, LED, 부저를 조합해 통합 시스템을 설계할 수 있다
  • 입력 → 처리 → 출력의 흐름을 이해하고 설명할 수 있다
  • 바이브 코딩을 활용해 기본 코드를 응용·확장할 수 있다
  • 자신만의 창의적인 알림 시스템을 완성할 수 있다
  • 설계 → 제작 → 테스트 → 개선의 메이커 프로세스를 경험할 수 있다

💡 왜 이걸 배우나요?

지금까지 우리는 LED를 켜고, 부저로 소리를 내고, 버튼 입력을 받는 법을 각각 배웠어. 하지만 진짜 유용한 시스템은 이것들이 서로 연결될 때 만들어져.

┌─────────────────────────────────────────────────────────────┐
│                                                             │
│   🔘 버튼         →        🧠 Pico        →     💡 LED     │
│   (입력)                   (처리)               (출력)      │
│                                                 🔔 부저    │
│                                                             │
│   "누군가 버튼을 눌렀어!"    "어떻게 반응할까?"   "알려줄게!" │
│                                                             │
└─────────────────────────────────────────────────────────────┘

실제로 어디에 쓰일까?

일상의 예시 입력 처리 출력
🚪 초인종 버튼 누름 신호 감지 벨소리 + 조명
🎮 게임 버저 버튼 누름 먼저 누른 팀 판단 LED 점등 + 효과음
🆘 비상벨 버튼 누름 긴급 신호 발생 사이렌 + 경고등
⏰ 알람 끄기 버튼 누름 알람 해제 소리 멈춤

오늘 우리가 만들 "나만의 알림 시스템"은 이런 모든 것의 기초가 돼!


📚 핵심 개념

개념 1: 통합 시스템

비유로 시작: 통합 시스템은 마치 오케스트라와 같아. 바이올린, 피아노, 드럼이 각자 연주하면 그냥 소음이지만, 지휘자가 조화롭게 이끌면 아름다운 음악이 되지. 우리의 Pico가 바로 그 지휘자야!

정확한 정의: 통합 시스템이란 여러 입력과 출력 장치가 하나의 제어 장치(Pico) 아래에서 조화롭게 작동하는 구조를 말해.

예시로 확인:

버튼(입력) ─┐
            ├─→ Pico(처리) ─┬─→ LED 깜빡임(출력1)
            │               └─→ 멜로디 재생(출력2)

쉽게 말하면: 여러 부품이 팀플레이하는 것!


개념 2: 상태 기반 동작

비유로 시작: 신호등을 생각해봐. "초록 → 노랑 → 빨강"처럼 현재 상태에 따라 다음 행동이 결정되지. 우리 알림 시스템도 "대기 중 → 알림 중 → 다시 대기"처럼 상태가 변해.

정확한 정의: 상태 기반 동작이란 시스템의 현재 상태를 기억하고, 그 상태에 따라 다르게 반응하는 방식이야.

예시로 확인:

┌─────────────────────────────────────────────────────────────┐
│                                                             │
│      ┌──────────┐    버튼 누름     ┌──────────┐            │
│      │          │ ───────────────→ │          │            │
│      │  대기 중  │                  │  알림 중  │            │
│      │  (조용)   │ ←─────────────── │ (LED+소리)│            │
│      └──────────┘    알림 완료      └──────────┘            │
│                                                             │
└─────────────────────────────────────────────────────────────┘

쉽게 말하면: "지금 뭐 하고 있는지" 기억하면서 동작하는 것!


개념 3: 메이커 프로세스

비유로 시작: 요리할 때를 생각해봐. 레시피만 보고 바로 완벽한 요리가 나올까? 아니지! 계획 → 조리 → 맛보기 → 간 맞추기를 반복하잖아. 메이커도 똑같아.

정확한 정의: 메이커 프로세스란 설계 → 제작 → 테스트 → 개선을 반복하며 점점 더 좋은 것을 만들어가는 과정이야.

┌─────────────────────────────────────────────────────────────┐
│                                                             │
│    ┌─────────┐      ┌─────────┐                            │
│    │  설계   │ ───→ │  제작   │                            │
│    │ (구상)  │      │ (조립)  │                            │
│    └────↑────┘      └────┬────┘                            │
│         │                │                                  │
│         │                ↓                                  │
│    ┌────┴────┐      ┌─────────┐                            │
│    │  개선   │ ←─── │ 테스트  │                            │
│    │ (수정)  │      │ (확인)  │                            │
│    └─────────┘      └─────────┘                            │
│                                                             │
│              🔄 이 과정을 반복!                             │
│                                                             │
└─────────────────────────────────────────────────────────────┘

쉽게 말하면: 만들고, 테스트하고, 고치고, 다시 만들고!


🔨 따라하기: 기본 알림 시스템 만들기

🛠️ 준비물

┌─────────────────────────────────────────────────────────────┐
│                                                             │
│  ✅ Raspberry Pi Pico (USB 연결됨)                          │
│  ✅ Grove Shield for Pico                                   │
│  ✅ Grove LED (빨강) - D16 포트                             │
│  ✅ Grove 부저 - D18 포트                                   │
│  ✅ Grove 버튼 - D20 포트                                   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

📍 연결도

      ┌─────────────────────────────────────────┐
      │         Grove Shield for Pico           │
      │                                         │
      │  D16 ●────────────● LED (빨강)          │
      │                                         │
      │  D18 ●────────────● 부저                │
      │                                         │
      │  D20 ●────────────● 버튼                │
      │                                         │
      └─────────────────────────────────────────┘

Step 1: 회로 연결하기

목표: LED, 부저, 버튼을 Pico에 연결하기

📌 연결 가이드:

1. Grove LED를 D16 포트에 연결
   - Grove 케이블의 노란선이 신호선

2. Grove 부저를 D18 포트에 연결
   - 부저의 방향 확인 (+ 표시 확인)

3. Grove 버튼을 D20 포트에 연결
   - 버튼을 눌렀을 때 HIGH(1) 신호

여기서 잠깐! 🤔

연결하기 전에 USB를 뽑아두는 습관을 들이자! 전원이 켜진 상태에서 연결하면 부품이 손상될 수 있어.


Step 2: 기본 동작 확인하기

목표: 각 부품이 제대로 작동하는지 개별 테스트

먼저 각 부품이 잘 연결됐는지 확인해보자:

# === WHAT: 부품 연결 테스트 ===
# LED, 부저, 버튼이 제대로 연결됐는지 확인하는 코드

from machine import Pin
import time

# --- 핀 설정 ---
led = Pin(16, Pin.OUT)      # LED: 출력 모드
buzzer = Pin(18, Pin.OUT)   # 부저: 출력 모드
button = Pin(20, Pin.IN, Pin.PULL_DOWN)  # 버튼: 입력 모드

# --- 테스트 1: LED 깜빡임 ---
print("LED 테스트 중...")
for i in range(3):
    led.value(1)     # LED 켜기
    time.sleep(0.3)
    led.value(0)     # LED 끄기
    time.sleep(0.3)
print("LED 테스트 완료!")

# --- 테스트 2: 부저 소리 ---
print("부저 테스트 중...")
for i in range(3):
    buzzer.value(1)  # 소리 켜기
    time.sleep(0.1)
    buzzer.value(0)  # 소리 끄기
    time.sleep(0.1)
print("부저 테스트 완료!")

# --- 테스트 3: 버튼 읽기 ---
print("버튼 테스트 중... (버튼을 눌러보세요)")
print("5초 동안 버튼 상태를 출력합니다")
for i in range(50):
    if button.value() == 1:
        print("버튼 눌림! ●")
    time.sleep(0.1)
print("버튼 테스트 완료!")

실행 결과:

LED 테스트 중...
LED 테스트 완료!
부저 테스트 중...
부저 테스트 완료!
버튼 테스트 중... (버튼을 눌러보세요)
5초 동안 버튼 상태를 출력합니다
버튼 눌림! ●
버튼 눌림! ●
버튼 테스트 완료!

체크포인트 ✅ - [ ] LED가 3번 깜빡였나요? - [ ] 부저에서 "삐삐삐" 소리가 났나요? - [ ] 버튼을 누르면 "버튼 눌림! ●"이 출력되나요?

하나라도 안 되면 연결을 다시 확인해봐!


Step 3: 버튼 → LED 연결하기

목표: 버튼을 누르면 LED가 켜지는 기본 연결 만들기

# === WHAT: 버튼으로 LED 제어하기 ===
# 버튼을 누르면 LED가 켜지고, 떼면 꺼지는 코드

from machine import Pin
import time

# --- 핀 설정 ---
led = Pin(16, Pin.OUT)
button = Pin(20, Pin.IN, Pin.PULL_DOWN)

# --- WHY: 왜 무한 반복이 필요할까? ---
# 버튼 상태를 계속 확인해야 하니까!
# 한 번만 확인하면 그 순간만 체크하고 끝나버려

print("버튼을 누르면 LED가 켜집니다")
print("Ctrl+C로 종료")

while True:
    # HOW: 버튼 상태를 읽어서 LED에 그대로 전달
    if button.value() == 1:  # 버튼 눌림
        led.value(1)         # LED 켜기
    else:                    # 버튼 안 눌림
        led.value(0)         # LED 끄기

    time.sleep(0.01)  # 아주 짧게 대기 (CPU 부담 줄이기)

실행해보기: 1. 코드를 Thonny에서 실행 2. 버튼을 누르고 있으면 → LED 켜짐 3. 버튼에서 손을 떼면 → LED 꺼짐

여기서 잠깐! 🤔

이 코드는 버튼을 누르고 있는 동안만 LED가 켜져. 손을 떼면 바로 꺼지지. 나중에 "토글" 방식도 배울 거야!


Step 4: 알림 시스템 완성하기

목표: 버튼을 누르면