Chapter 09: 빛에 반응하는 LED - 자동 밝기 조명¶
Part 2: 거리와 빛으로 세상 감지
🎯 이 장에서 배우는 것¶
- 조도센서 값을 읽고 의미를 이해할 수 있다
- map 함수를 사용해 센서 값을 LED 밝기로 변환할 수 있다
- 어두우면 밝아지고, 밝으면 어두워지는 자동 조명을 만들 수 있다
- 임계값(threshold)을 설정해 ON/OFF 제어를 구현할 수 있다
- 바이브 코딩으로 나만의 무드등을 만들 수 있다
💡 왜 이걸 배우나요?¶
어두워지면 자동으로 켜지는 가로등, 본 적 있지? 🌙
낮에는 꺼져 있다가 해가 지면 스르륵 켜지는 그 조명. 누군가 일일이 스위치를 누르는 게 아니야. 빛의 밝기를 감지하는 센서가 "지금 어두워졌네?"를 판단하고, 자동으로 LED를 켜는 거지.
┌─────────────────────────────────────────────────────────────┐
│ 자동 조명의 원리 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ☀️ 낮 (밝음) 🌙 밤 (어두움) │
│ │
│ 조도센서: 높은 값 조도센서: 낮은 값 │
│ ↓ ↓ │
│ LED: 꺼짐 (절전) LED: 켜짐 (밝게!) │
│ │
│ "밝으니까 조명 필요 없어" "어두우니까 켜줘야지" │
│ │
└─────────────────────────────────────────────────────────────┘
이번 장에서 배우는 건 "센서 값 → 출력 값 변환"이야. 이게 왜 중요하냐면, 세상의 모든 자동화 시스템이 이 원리로 작동하거든!
- 에어컨: 온도 감지 → 냉방 강도 조절
- 자동차: 주변 밝기 감지 → 헤드라이트 자동 ON
- 스마트폰: 주변 밝기 감지 → 화면 밝기 자동 조절
한 번 익히면, 무한한 프로젝트에 적용할 수 있어!
📚 핵심 개념¶
개념 1: 조도센서 (Light Sensor)¶
-
비유로 시작: "조도센서는 마치 눈과 같아요. 밝으면 '밝다!'고 느끼고, 어두우면 '어둡다!'고 느끼는 거죠."
-
정확한 정의: 조도센서는 빛의 양(밝기)을 전기 신호로 변환하는 센서야. 빛이 많이 들어오면 높은 값, 적게 들어오면 낮은 값을 출력해.
-
예시로 확인:
- 환한 형광등 아래: 50,000 이상
- 일반 실내: 20,000~40,000
- 손으로 완전히 가리면: 100 이하
쉽게 말하면: 빛을 숫자로 바꿔주는 장치야!
┌─────────────────────────────────────────────────────────────┐
│ 조도센서의 값 범위 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 0 ◀──────────────────────────────────────────────▶ 65535 │
│ │ │ │
│ 완전 어둠 완전 밝음│
│ (칠흑 같은 밤) (직사광선) │
│ │
│ 💀 🌙 💡 ☀️ 🔆 │
│ 0~100 1000~5000 10000~30000 40000~ 60000+ │
│ 손으로 저녁 실내 일반 실내 밝은 창가 직사광선 │
│ 완전 가림 │
│ │
└─────────────────────────────────────────────────────────────┘
개념 2: 값 매핑 (Value Mapping)¶
-
비유로 시작: "매핑은 마치 단위 변환과 같아요. 100cm를 1m로 바꾸듯이, 센서의 범위를 LED의 범위로 바꾸는 거예요."
-
정확한 정의: 매핑(mapping)은 한 범위의 값을 다른 범위의 값으로 비례 변환하는 것이야. 조도센서 값(0~65535)을 LED PWM 값(0~65535)으로 변환할 때 사용해.
-
예시로 확인:
쉽게 말하면: 센서 값을 LED가 이해하는 값으로 번역하는 거야!
┌─────────────────────────────────────────────────────────────┐
│ 매핑의 원리 │
├─────────────────────────────────────────────────────────────┤
│ │
│ [입력 범위] [출력 범위] │
│ │
│ 조도센서 LED PWM │
│ 0 ─────────────── 65535 0 ─────────────── 65535 │
│ │ │ │ │ │
│ 어둠 밝음 꺼짐 최대밝기│
│ │
│ ╲ ╱ │
│ ╲ map() ╱ │
│ ╲ ╱ │
│ ╲ (변환) ╱ │
│ ╲ ╱ │
│ ─────────── │
│ │
│ * 핵심: 어두우면(입력 작음) → LED 밝게(출력 큼) │
│ 밝으면(입력 큼) → LED 어둡게(출력 작음) │
│ → "반비례" 관계! │
│ │
└─────────────────────────────────────────────────────────────┘
개념 3: 임계값 (Threshold)¶
-
비유로 시작: "임계값은 마치 합격선과 같아요. 60점 이상이면 합격, 미만이면 불합격처럼, 특정 값을 기준으로 동작이 달라지는 거예요."
-
정확한 정의: 임계값(threshold)은 어떤 동작을 실행할지 결정하는 기준점이야. 센서 값이 이 기준을 넘으면 ON, 넘지 않으면 OFF 같은 식으로 제어해.
-
예시로 확인:
쉽게 말하면: "이 값보다 작으면 켜고, 크면 꺼!" 하는 기준선이야!
┌─────────────────────────────────────────────────────────────┐
│ 임계값의 동작 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 조도값 ────────────────────────────────────────────── │
│ │ │ │
│ 65535│ 밝음 ☀️ │ │
│ │ │ │
│ │ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ │
│ 20000│ ↑ 임계값 (threshold) │ │
│ │ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ │
│ │ 어둠 🌙 │ │
│ 0│ │ │
│ └───────────────────────────────────────────── │
│ │
│ 임계값 위 (밝음) → LED OFF 💡❌ │
│ 임계값 아래 (어둠) → LED ON 💡✅ │
│ │
└─────────────────────────────────────────────────────────────┘
🔨 따라하기¶
Step 1: 조도센서 값 읽기¶
목표: 조도센서를 연결하고 현재 밝기를 숫자로 확인하기
회로 연결:
┌─────────────────────────────────────────────────────────────┐
│ 조도센서 연결 │
├─────────────────────────────────────────────────────────────┤
│ │
│ Pico Grove 조도센서 │
│ ┌─────────┐ ┌─────────────┐ │
│ │ │ │ ┌───┐ │ │
│ │ A0 ├─────────────────┤ │ 👁 │ │ │
│ │ │ Grove 케이블 │ └───┘ │ │
│ │ │ (노랑-빨강- │ Light │ │
│ │ │ 검정-흰색) │ Sensor │ │
│ │ │ │ │ │
│ └─────────┘ └─────────────┘ │
│ │
│ * Grove Shield 사용 시: A0 포트에 바로 연결! │
│ │
└─────────────────────────────────────────────────────────────┘
코드:
# === WHAT: 조도센서 값 읽기 ===
# 현재 밝기를 숫자로 확인하는 기본 코드
# --- WHY: 먼저 센서가 어떤 값을 주는지 알아야 활용할 수 있어 ---
from machine import ADC # HOW: ADC는 아날로그 값을 읽는 기능
import time
# 조도센서 설정 (A0 = GPIO26)
light_sensor = ADC(26) # HOW: GPIO 26번 핀을 아날로그 입력으로 설정
# 무한 반복
while True:
# 조도값 읽기 (0~65535)
light_value = light_sensor.read_u16() # HOW: u16 = 16비트 부호 없는 정수 (0~65535)
# 화면에 출력
print(f"조도값: {light_value}") # HOW: f-string으로 값 출력
# 0.5초 대기
time.sleep(0.5) # HOW: 너무 빠르면 읽기 어려우니까
실행 결과:
여기서 잠깐! 🤔
📌 알아보기: ADC란?
ADC = Analog to Digital Converter (아날로그-디지털 변환기) - 조도센서는 빛의 양에 따라 연속적인 전압을 출력해 - 컴퓨터는 0과 1만 이해하니까, 이 전압을 숫자로 바꿔야 해 - Pico의 ADC는 전압을 0~65535 범위의 숫자로 변환해줘
직접 실험해보기: 1. 손으로 센서를 완전히 가려봐 → 값이 얼마? 2. 스마트폰 손전등을 비춰봐 → 값이 얼마? 3. 일반 상태 → 값이 얼마?
이 값들을 기억해둬! 나중에 임계값 설정할 때 참고해야 해.
Step 2: map 함수로 값 변환하기¶
목표: 조도값을 LED 밝기로 변환하는 map 함수 이해하기
코드: ```python