2주차 통합 미션 - 스마트 접근 알림 시스템¶
📍 Part 2: 거리와 빛으로 세상 감지
🎯 이 장에서 배우는 것¶
- 조도센서와 거리센서를 하나의 시스템으로 통합할 수 있다
- 거리에 따른 다단계 경고(시각 + 청각)를 구현할 수 있다
- 환경 조건(밝기)에 따라 동작을 변경하는 로직을 만들 수 있다
- 실제 설치 장소를 고려한 프로토타입을 완성할 수 있다
- 2주차에 배운 모든 개념을 종합 활용할 수 있다
💡 왜 이걸 배우나요?¶
┌─────────────────────────────────────────────────────────────┐
│ │
│ 🏠 현관 자동 조명 🚗 후방 감지 센서 │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ 어두우면 │ │ 가까워지면 │ │
│ │ + 사람 오면│ │ 삐삐빅! │ │
│ │ = 불 켜짐 │ │ │ │
│ └─────────────┘ └─────────────┘ │
│ │
│ 🏪 자동문 📱 스마트폰 근접 센서 │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ 다가가면 │ │ 얼굴 가까이 │ │
│ │ 문이 열림 │ │ → 화면 꺼짐 │ │
│ └─────────────┘ └─────────────┘ │
│ │
│ 💡 이 모든 것의 공통점? │
│ → "센서 조합 + 조건에 따른 반응" │
│ │
└─────────────────────────────────────────────────────────────┘
2주차 동안 조도센서와 거리센서를 따로따로 배웠어. 이제 이것들을 합쳐서 진짜 쓸모 있는 물건을 만들어볼 시간이야!
실제 세상의 스마트 기기들은 하나의 센서만 쓰는 경우가 거의 없어. 여러 센서를 조합해서 더 똑똑하게 동작하지. 오늘 만들 "스마트 접근 알림 시스템"은:
- 거리를 감지해서 누가 다가오는지 알고
- 밝기에 따라 민감도를 조절하고
- 단계별 경고로 시각과 청각 피드백을 줘
화장실 앞, 개인 사물함, 내 책상 영역... 실제로 설치할 장소를 상상하면서 만들어보자!
📚 핵심 개념¶
개념 1: 다중 센서 시스템¶
비유로 시작: 너의 몸은 다중 센서 시스템이야. 눈(시각) + 귀(청각) + 피부(촉각)가 동시에 정보를 수집해서 뇌가 종합 판단하지. 눈만으로는 뒤에서 다가오는 사람을 모르지만, 귀가 발소리를 듣고 알려주잖아?
정확한 정의: 다중 센서 시스템은 2개 이상의 센서에서 데이터를 동시에 수집하고, 이를 조합하여 판단하는 시스템이야.
예시로 확인:
쉽게 말하면: 센서 여러 개를 합치면 더 똑똑한 판단이 가능해!
개념 2: 다단계 경고 시스템¶
비유로 시작: 자동차 후방 센서 생각해봐. 멀 때는 "삐...삐...삐", 가까워지면 "삐.삐.삐", 아주 가까우면 "삐삐삐삐삐!" 이렇게 거리에 따라 경고 강도가 달라지지.
정확한 정의: 측정값의 범위를 여러 단계로 나누고, 각 단계마다 다른 출력을 제공하는 시스템이야.
┌─────────────────────────────────────────────────────────────┐
│ 다단계 경고 구조 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 거리(cm) 0 10 30 50 ∞ │
│ ├──────┼───────┼────────┼───────┤ │
│ │위험⚠️ │ 주의🟡 │ 안전🟢 │ 무반응 │ │
│ │ │ │ │ │ │
│ LED │빨강🔴 │노랑🟡 │초록🟢 │ 꺼짐 │ │
│ 부저 │경고음 │짧은 삐 │ 없음 │ 없음 │ │
│ │
└─────────────────────────────────────────────────────────────┘
쉽게 말하면: 센서 값에 따라 "안전/주의/위험" 같은 단계를 만들어 반응해!
개념 3: 환경 적응 로직¶
비유로 시작: 휴대폰 자동 밝기 기능처럼! 밝은 곳에서는 화면이 밝아지고, 어두운 곳에서는 어두워지잖아. 환경에 맞춰서 동작이 바뀌는 거야.
정확한 정의: 센서 A의 값에 따라 센서 B의 동작 기준(임계값)이나 출력 방식을 변경하는 로직이야.
예시로 확인:
# 환경 적응 로직 예시
if 조도 < 300: # 어두운 환경
경고_거리 = 50 # 더 먼 거리에서도 경고 (민감하게)
else: # 밝은 환경
경고_거리 = 30 # 가까이 와야 경고 (덜 민감하게)
쉽게 말하면: 밤에는 예민하게, 낮에는 느긋하게 반응하도록!
🔨 따라하기¶
Step 1: 회로 연결 - 모든 부품 합체!¶
목표: 조도센서, 거리센서, LED 3개, 부저를 모두 연결
┌─────────────────────────────────────────────────────────────┐
│ 스마트 접근 알림 시스템 │
│ 전체 회로 구성 │
├─────────────────────────────────────────────────────────────┤
│ │
│ [Raspberry Pi Pico] │
│ ┌─────────────────┐ │
│ │ │ │
│ │ GP28 ←─────────── [조도센서] (A2 포트) │
│ │ │ │ │
│ │ GP6 ──────────── [초음파 Trig] │
│ │ GP7 ←─────────── [초음파 Echo] (D7 포트) │
│ │ │ │
│ │ GP18 ──────────→ [빨간 LED] (D18 포트) │
│ │ GP19 ──────────→ [노란 LED] (D19 포트) │
│ │ GP20 ──────────→ [초록 LED] (D20 포트) │
│ │ │ │
│ │ GP16 ──────────→ [부저] (D16 포트) │
│ │ │ │
│ └─────────────────┘ │
│ │
│ 📍 Grove Shield 포트 연결: │
│ • A2 포트 → 조도센서 │
│ • D7 포트 → 초음파 거리센서 │
│ • D18 포트 → 빨간 LED │
│ • D19 포트 → 노란 LED │
│ • D20 포트 → 초록 LED │
│ • D16 포트 → 부저 │
│ │
└─────────────────────────────────────────────────────────────┘
실제 연결 모습:
┌─────────────────────────────────────────────────────────────┐
│ │
│ [조도센서] [초음파센서] │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────────────────────────────────┐ │
│ │ Grove Shield for Pico │ │
│ │ ┌─────────────────────────────┐ │ │
│ │ │ Raspberry Pi Pico │ │ │
│ │ └─────────────────────────────┘ │ │
│ └─────────────────────────────────────┘ │
│ │ │ │ │ │
│ ▼ ▼ ▼ ▼ │
│ [빨강] [노랑] [초록] [부저] │
│ LED LED LED │
│ │
└─────────────────────────────────────────────────────────────┘
여기서 잠깐! 🤔
부품이 많아서 복잡해 보이지만, 각각은 이미 배운 것들이야! - 조도센서: Chapter 11에서 배움 - 거리센서: Chapter 12에서 배움
- LED, 부저: 1주차에서 배움새로운 건 "합치는 것"뿐이야!
Step 2: 기본 시스템 - 거리 단계별 LED¶
목표: 거리에 따라 초록 → 노랑 → 빨강 LED 켜기
코드: ```python
=== WHAT: 거리 단계별 LED 신호등 ===¶
거리에 따라 3단계로 LED가 바뀌는 기본 시스템¶
from machine import Pin, ADC import time
--- WHY: 각 핀에 연결된 부품을 제어하기 위해 ---¶
초음파 센서 핀¶
trig = Pin(6, Pin.OUT) # 초음파 발사 echo = Pin(7, Pin.IN) # 반사파 수신
LED 3개 (신호등 역할)¶
led_red = Pin(18, Pin.OUT) # 빨강: 위험! led_yellow = Pin(19, Pin.OUT) # 노랑: 주의 led_green = Pin(20, Pin.OUT) # 초록: 안전
HOW: 거리 측정 함수 (Chapter 12에서 배운 것)¶
def measure_distance(): """초음파로 거리(cm) 측정""" # 초음파 발사 (10us 동안) trig.low() time.sleep_us(2) trig.high() time.sleep_us(10) trig.low()
# 반사파 대기 (타임아웃 방지)
timeout = time.ticks_us()
while echo.value() == 0:
if time.ticks_diff(time.ticks_us(), timeout) > 30000:
return -1 # 타임아웃
start = time.ticks_us()
while echo.value() == 1:
if time.ticks_diff(time.ticks_us(), timeout) > 30000:
return -1 # 타임아웃
end = time.ticks_us()
# 거리 계산: 시간(us) × 음속(cm/us) ÷ 2(왕복)
duration = time.ticks_diff(end, start)
distance = duration * 0.0343 / 2
return distance
HOW: 모든 LED 끄는 함수 (깔끔하게 관리하기 위해)¶
def all_leds_off(): """모든 LED 끄기""" led_red.low() led_yellow.low() led_green.low()
--- 메인 루프: 거리 측정 → LED 제어 ---¶
print("🚦 거리 단계별 LED 시스템") print("─" * 30)
while True: distance = measure_distance()
if distance < 0:
print("측정 실패")
else:
# 모든 LED 끄고 시작
all_leds_off()
# 거리에 따라