챕터 13: 센서 조합의 힘 - 복합 감지 시스템¶
🎯 이 장에서 배우는 것¶
- 두 개 이상의 센서를 동시에 연결하고 값을 읽을 수 있다
- AND/OR 논리로 복합 조건을 작성할 수 있다
- 조도센서와 초음파 센서를 조합한 스마트 시스템을 만들 수 있다
- 실제 문제 해결을 위한 센서 조합을 설계할 수 있다
💡 왜 이걸 배우나요?¶
센서 하나로는 부족해!¶
지금까지 조도센서, 초음파 센서를 각각 사용해봤어. 그런데 실제 스마트 시스템은 센서 하나만 쓰는 경우가 거의 없어.
[현관 자동 조명의 비밀]
❌ 조도센서만 있으면?
→ 낮에도 손으로 가리면 조명이 켜짐 (낭비!)
❌ 거리센서만 있으면?
→ 밝은 대낮에도 사람 오면 조명이 켜짐 (낭비!)
✅ 조도 + 거리 둘 다 있으면?
→ "어둡고 AND 사람이 가까이 오면" 조명 켜짐 (완벽!)
실생활 속 복합 센서 시스템¶
┌─────────────────────────────────────────────────────────────┐
│ 🚗 자동차 후방 카메라 │
│ 거리센서 + 카메라 = 가까울 때만 화면 표시 │
│ │
│ 🏠 스마트 홈 조명 │
│ 조도 + 모션 + 시간 = 필요할 때만 자동 점등 │
│ │
│ 📱 스마트폰 화면 밝기 │
│ 조도 + 근접센서 = 통화 중엔 화면 끔 │
│ │
│ 🚽 자동 비데 │
│ 거리 + 온도 + 착석감지 = 사람 앉으면 작동 │
└─────────────────────────────────────────────────────────────┘
이번 챕터에서 배우는 핵심:
센서를 조합하면 더 똑똑하고 효율적인 시스템이 된다!
📚 핵심 개념¶
개념 1: 복합 조건 (AND / OR 논리)¶
비유로 시작: 복합 조건은 마치 놀이공원 입장 조건과 같아요. - "키 120cm 이상 AND 7세 이상" → 둘 다 만족해야 탈 수 있음 - "학생증 OR 청소년증" → 둘 중 하나만 있어도 할인
정확한 정의: 프로그래밍에서 and는 모든 조건이 참일 때만 참, or는 하나라도 참이면 참이야.
예시로 확인:
# AND 조건 - 둘 다 만족해야 함
어둡다 = True
가깝다 = True
if 어둡다 and 가깝다:
print("조명 켜기!") # 이게 실행됨
# OR 조건 - 하나만 만족해도 됨
버튼_눌림 = False
소리_감지 = True
if 버튼_눌림 or 소리_감지:
print("알림 울리기!") # 이것도 실행됨
쉽게 말하면: and는 "그리고", or는 "또는"이야!
개념 2: 센서 조합 설계 패턴¶
비유로 시작: 센서 조합은 마치 요리 레시피와 같아요. 재료(센서)를 어떻게 조합하느냐에 따라 완전히 다른 요리(시스템)가 나와요.
대표적인 조합 패턴:
┌─────────────────────────────────────────────────────────────┐
│ 패턴 1: 조건 필터링 (AND) │
│ ────────────────────── │
│ "A이면서 B일 때만" 동작 │
│ │
│ 예시: 어두울 때만 거리 감지 작동 │
│ ┌───────┐ ┌───────┐ ┌───────┐ │
│ │ 조도 │───▶│ AND? │───▶│ 거리 │───▶ LED │
│ │ 어둡냐│ │ │ │ 가깝냐│ │
│ └───────┘ └───────┘ └───────┘ │
│ │
├─────────────────────────────────────────────────────────────┤
│ 패턴 2: 다중 트리거 (OR) │
│ ────────────────────── │
│ "A거나 B면" 동작 │
│ │
│ 예시: 버튼 누르거나 손 가까이 오면 알림 │
│ ┌───────┐ │
│ │ 버튼 │───┐ │
│ └───────┘ │ ┌───────┐ │
│ ├──▶│ OR? │───▶ 부저 │
│ ┌───────┐ │ └───────┘ │
│ │ 거리 │───┘ │
│ └───────┘ │
│ │
├─────────────────────────────────────────────────────────────┤
│ 패턴 3: 단계적 반응 │
│ ────────────────────── │
│ 센서 값에 따라 다른 동작 │
│ │
│ 예시: 거리에 따라 다른 색 LED │
│ ┌───────┐ ┌────────────────────────────┐ │
│ │ 거리 │───▶│ >50cm: 초록 │ 20-50: 노랑 │───▶ LED │
│ │ 센서 │ │ <20cm: 빨강 │ │ │
│ └───────┘ └────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
쉽게 말하면: 센서 여러 개를 어떤 규칙으로 연결하느냐가 설계의 핵심이야!
개념 3: 센서 동시 읽기¶
비유로 시작: 센서 동시 읽기는 마치 두 손으로 동시에 온도계와 습도계 확인하는 것과 같아요.
정확한 정의: 하나의 프로그램에서 여러 센서의 값을 순서대로 빠르게 읽어서 마치 동시에 읽는 것처럼 처리해.
while True:
# 센서 1 읽기
밝기 = 조도센서.read()
# 센서 2 읽기
거리 = 초음파센서.read()
# 둘 다 사용해서 판단
if 밝기 < 1000 and 거리 < 30:
LED.on()
time.sleep(0.1) # 0.1초마다 반복
쉽게 말하면: 컴퓨터가 매우 빨라서 순서대로 읽어도 "동시"처럼 느껴지는 거야!
🔨 따라하기¶
Step 1: 두 센서 동시에 연결하기¶
목표: 조도센서와 초음파 센서를 동시에 Pico에 연결하고 값 읽기
회로 연결:
┌─────────────────────────────────────────────────────────────┐
│ Pico + Grove Shield │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ 연결: │
│ │ │ │
│ │ [조도] │────▶ A0 (아날로그) │
│ │ │ │
│ │ [초음파] │────▶ D16 (디지털) │
│ │ │ │
│ │ [LED 빨강] │────▶ D18 │
│ │ [LED 노랑] │────▶ D19 │
│ │ [LED 초록] │────▶ D20 │
│ │ │ │
│ │ [부저] │────▶ D21 │
│ │ │ │
│ └──────────────┘ │
│ │
│ 💡 팁: Grove Shield 덕분에 여러 센서를 쉽게 연결! │
└─────────────────────────────────────────────────────────────┘
코드:
# === WHAT: 두 센서 동시에 값 읽기 ===
# 조도센서와 초음파 센서의 값을 동시에 읽어서 출력
from machine import Pin, ADC
import time
# --- WHY: 각 센서마다 다른 방식으로 연결 ---
# 조도센서 = 아날로그 (0~65535 범위의 숫자)
# 초음파 = 디지털 (시간 측정으로 거리 계산)
# HOW: 조도센서 설정 (아날로그 입력)
light_sensor = ADC(Pin(26)) # A0 = GP26
# HOW: 초음파 센서 설정 (Trigger와 Echo 핀)
trigger = Pin(16, Pin.OUT) # 신호 보내는 핀
echo = Pin(17, Pin.IN) # 신호 받는 핀
# --- 초음파 센서로 거리 측정하는 함수 ---
def get_distance():
# 초음파 신호 보내기
trigger.low()
time.sleep_us(2)
trigger.high()
time.sleep_us(10)
trigger.low()
# 신호가 돌아오는 시간 측정
while echo.value() == 0:
start = time.ticks_us()
while echo.value() == 1:
end = time.ticks_us()
# 시간 → 거리 변환 (소리 속도 이용)
duration = time.ticks_diff(end, start)
distance = (duration * 0.0343) / 2 # cm 단위
return distance
# --- 메인 루프: 두 센서 동시에 읽기 ---
print("=== 두 센서 동시 읽기 시작! ===")
print("조도센서와 초음파 센서 값을 확인해보세요")
print()
while True:
# 센서 1: 조도 읽기
light_value = light_sensor.read_u16()
# 센서 2: 거리 읽기
distance = get_distance()
# 두 값 함께 출력
print(f"밝기: {light_value:5d} | 거리: {distance:5.1f}cm")
time.sleep(0.5) # 0.5초마다 측정
실행 결과:
=== 두 센서 동시 읽기 시작! ===
조도센서와 초음파 센서 값을 확인해보세요
밝기: 45230 | 거리: 85.3cm
밝기: 44890 | 거리: 42.1cm
밝기: 12340 | 거리: 15.7cm ← 손으로 가리고 가까이 댐
밝기: 11200 | 거리: 8.2cm
여기서 잠깐! 🤔
센서가 "동시에" 읽히는 걸까?
사실 컴퓨터는 한 번에 하나씩 순서대로 읽어. 하지만 너무 빨라서 (0.001초도 안 걸림) 우리 눈엔 동시처럼 보여!
Step 2: AND 조건으로 스마트 조명 만들기¶
목표: "어둡고 AND 가까이 오면" LED가 켜지는 스마트 조명
``` ┌─────────────────────────────────────────────────────────────┐ │ 📋 동작 시나리오 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 조건 1: 밝기 < 20000 (어두움)