콘텐츠로 이동

Chapter 09: 빛에 반응하는 LED - 자동 밝기 조명

Part 2: 거리와 빛으로 세상 감지


🎯 이 장에서 배우는 것

  • 조도센서 값을 읽고 의미를 이해할 수 있다
  • map 함수를 사용해 센서 값을 LED 밝기로 변환할 수 있다
  • 어두우면 밝아지고, 밝으면 어두워지는 자동 조명을 만들 수 있다
  • 임계값(threshold)을 설정해 ON/OFF 제어를 구현할 수 있다
  • 바이브 코딩으로 나만의 무드등을 만들 수 있다

💡 왜 이걸 배우나요?

어두워지면 자동으로 켜지는 가로등, 본 적 있지? 🌙

낮에는 꺼져 있다가 해가 지면 스르륵 켜지는 그 조명. 누군가 일일이 스위치를 누르는 게 아니야. 빛의 밝기를 감지하는 센서가 "지금 어두워졌네?"를 판단하고, 자동으로 LED를 켜는 거지.

┌─────────────────────────────────────────────────────────────┐
│                    자동 조명의 원리                          │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│    ☀️ 낮 (밝음)              🌙 밤 (어두움)                 │
│                                                             │
│   조도센서: 높은 값         조도센서: 낮은 값               │
│        ↓                         ↓                         │
│   LED: 꺼짐 (절전)          LED: 켜짐 (밝게!)              │
│                                                             │
│   "밝으니까 조명 필요 없어"  "어두우니까 켜줘야지"          │
│                                                             │
└─────────────────────────────────────────────────────────────┘

이번 장에서 배우는 건 "센서 값 → 출력 값 변환"이야. 이게 왜 중요하냐면, 세상의 모든 자동화 시스템이 이 원리로 작동하거든!

  • 에어컨: 온도 감지 → 냉방 강도 조절
  • 자동차: 주변 밝기 감지 → 헤드라이트 자동 ON
  • 스마트폰: 주변 밝기 감지 → 화면 밝기 자동 조절

한 번 익히면, 무한한 프로젝트에 적용할 수 있어!


📚 핵심 개념

개념 1: 조도센서 (Light Sensor)

  1. 비유로 시작: "조도센서는 마치 눈과 같아요. 밝으면 '밝다!'고 느끼고, 어두우면 '어둡다!'고 느끼는 거죠."

  2. 정확한 정의: 조도센서는 빛의 양(밝기)을 전기 신호로 변환하는 센서야. 빛이 많이 들어오면 높은 값, 적게 들어오면 낮은 값을 출력해.

  3. 예시로 확인:

  4. 환한 형광등 아래: 50,000 이상
  5. 일반 실내: 20,000~40,000
  6. 손으로 완전히 가리면: 100 이하

쉽게 말하면: 빛을 숫자로 바꿔주는 장치야!

┌─────────────────────────────────────────────────────────────┐
│                조도센서의 값 범위                            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  0 ◀──────────────────────────────────────────────▶ 65535  │
│  │                                                      │   │
│  완전 어둠                                          완전 밝음│
│  (칠흑 같은 밤)                              (직사광선)     │
│                                                             │
│     💀          🌙          💡          ☀️         🔆      │
│     0~100    1000~5000  10000~30000  40000~    60000+      │
│    손으로     저녁 실내    일반 실내   밝은 창가  직사광선   │
│    완전 가림                                                │
│                                                             │
└─────────────────────────────────────────────────────────────┘

개념 2: 값 매핑 (Value Mapping)

  1. 비유로 시작: "매핑은 마치 단위 변환과 같아요. 100cm를 1m로 바꾸듯이, 센서의 범위를 LED의 범위로 바꾸는 거예요."

  2. 정확한 정의: 매핑(mapping)은 한 범위의 값을 다른 범위의 값으로 비례 변환하는 것이야. 조도센서 값(0~65535)을 LED PWM 값(0~65535)으로 변환할 때 사용해.

  3. 예시로 확인:

    조도센서 값 0      →  LED 밝기 65535 (최대)
    조도센서 값 32767  →  LED 밝기 32768 (중간)
    조도센서 값 65535  →  LED 밝기 0     (꺼짐)
    

쉽게 말하면: 센서 값을 LED가 이해하는 값으로 번역하는 거야!

┌─────────────────────────────────────────────────────────────┐
│                    매핑의 원리                               │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   [입력 범위]                      [출력 범위]              │
│                                                             │
│   조도센서                         LED PWM                  │
│   0 ─────────────── 65535          0 ─────────────── 65535 │
│   │                    │           │                    │   │
│   어둠              밝음          꺼짐              최대밝기│
│                                                             │
│        ╲                             ╱                      │
│          ╲         map()           ╱                        │
│            ╲                     ╱                          │
│              ╲     (변환)      ╱                            │
│                ╲             ╱                              │
│                  ───────────                                │
│                                                             │
│   * 핵심: 어두우면(입력 작음) → LED 밝게(출력 큼)           │
│          밝으면(입력 큼) → LED 어둡게(출력 작음)            │
│          → "반비례" 관계!                                   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

개념 3: 임계값 (Threshold)

  1. 비유로 시작: "임계값은 마치 합격선과 같아요. 60점 이상이면 합격, 미만이면 불합격처럼, 특정 값을 기준으로 동작이 달라지는 거예요."

  2. 정확한 정의: 임계값(threshold)은 어떤 동작을 실행할지 결정하는 기준점이야. 센서 값이 이 기준을 넘으면 ON, 넘지 않으면 OFF 같은 식으로 제어해.

  3. 예시로 확인:

    임계값 = 20000 (30% 정도 밝기)
    
    조도 값 15000 → 임계값보다 작음 → "어둡다!" → LED ON
    조도 값 25000 → 임계값보다 큼  → "밝다!"   → LED 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: 너무 빠르면 읽기 어려우니까

실행 결과:

조도값: 42156
조도값: 41893
조도값: 15234    ← 손으로 살짝 가림
조도값: 3521     ← 손으로 완전히 가림
조도값: 45678    ← 손 뗌

여기서 잠깐! 🤔

📌 알아보기: ADC란?

ADC = Analog to Digital Converter (아날로그-디지털 변환기) - 조도센서는 빛의 양에 따라 연속적인 전압을 출력해 - 컴퓨터는 0과 1만 이해하니까, 이 전압을 숫자로 바꿔야 해 - Pico의 ADC는 전압을 0~65535 범위의 숫자로 변환해줘

직접 실험해보기: 1. 손으로 센서를 완전히 가려봐 → 값이 얼마? 2. 스마트폰 손전등을 비춰봐 → 값이 얼마? 3. 일반 상태 → 값이 얼마?

이 값들을 기억해둬! 나중에 임계값 설정할 때 참고해야 해.


Step 2: map 함수로 값 변환하기

목표: 조도값을 LED 밝기로 변환하는 map 함수 이해하기

코드: ```python

=== WHAT: map 함수 만들기 ===

한 범위의 값을 다른 범위로 변환하는