🎯 1주차 통합 미션 - 나만의 알림 시스템¶
"버튼 하나로 세상에 신호를 보내자!"
🎯 이 장에서 배우는 것¶
- 버튼, LED, 부저를 조합해 통합 시스템을 설계할 수 있다
- 입력 → 처리 → 출력의 흐름을 이해하고 설명할 수 있다
- 바이브 코딩을 활용해 기본 코드를 응용·확장할 수 있다
- 자신만의 창의적인 알림 시스템을 완성할 수 있다
- 설계 → 제작 → 테스트 → 개선의 메이커 프로세스를 경험할 수 있다
💡 왜 이걸 배우나요?¶
지금까지 우리는 LED를 켜고, 부저로 소리를 내고, 버튼 입력을 받는 법을 각각 배웠어. 하지만 진짜 유용한 시스템은 이것들이 서로 연결될 때 만들어져.
┌─────────────────────────────────────────────────────────────┐
│ │
│ 🔘 버튼 → 🧠 Pico → 💡 LED │
│ (입력) (처리) (출력) │
│ 🔔 부저 │
│ │
│ "누군가 버튼을 눌렀어!" "어떻게 반응할까?" "알려줄게!" │
│ │
└─────────────────────────────────────────────────────────────┘
실제로 어디에 쓰일까?
| 일상의 예시 | 입력 | 처리 | 출력 |
|---|---|---|---|
| 🚪 초인종 | 버튼 누름 | 신호 감지 | 벨소리 + 조명 |
| 🎮 게임 버저 | 버튼 누름 | 먼저 누른 팀 판단 | LED 점등 + 효과음 |
| 🆘 비상벨 | 버튼 누름 | 긴급 신호 발생 | 사이렌 + 경고등 |
| ⏰ 알람 끄기 | 버튼 누름 | 알람 해제 | 소리 멈춤 |
오늘 우리가 만들 "나만의 알림 시스템"은 이런 모든 것의 기초가 돼!
📚 핵심 개념¶
개념 1: 통합 시스템¶
비유로 시작: 통합 시스템은 마치 오케스트라와 같아. 바이올린, 피아노, 드럼이 각자 연주하면 그냥 소음이지만, 지휘자가 조화롭게 이끌면 아름다운 음악이 되지. 우리의 Pico가 바로 그 지휘자야!
정확한 정의: 통합 시스템이란 여러 입력과 출력 장치가 하나의 제어 장치(Pico) 아래에서 조화롭게 작동하는 구조를 말해.
예시로 확인:
쉽게 말하면: 여러 부품이 팀플레이하는 것!
개념 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: 알림 시스템 완성하기¶
목표: 버튼을 누르면