Chapter 10: 조도 센서로 빛의 밝기 측정하기¶
🎯 이 장에서 배우는 것¶
- [ ] 조도 센서의 아날로그 값을 읽을 수 있다
- [ ] ADC(아날로그-디지털 변환) 개념을 이해한다
- [ ] 밝기 변화를 숫자로 확인할 수 있다
⏱️ 예상 학습 시간: 약 45분
📚 핵심 개념¶
개념: ADC (Analog-to-Digital Conversion)¶
비유로 시작할게요 🎵
ADC는 마치 아날로그 음악을 MP3로 변환하는 것과 같아요!
flowchart LR
A["🎸 연속적인 소리<br/>(아날로그)"] --> B["🔄 ADC<br/>변환기"] --> C["💾 숫자 데이터<br/>(디지털)"]
style A fill:#fff3e0,stroke:#ff9800
style B fill:#e3f2fd,stroke:#2196f3
style C fill:#e8f5e9,stroke:#4caf50
정확한 정의: - 빛의 밝기는 연속적인 값 (아날로그) - ESP32는 이를 0~4095 숫자로 변환 (디지털) - 12비트 해상도: 2¹² = 4,096단계
예시로 확인: | 상황 | 아날로그 값 | 의미 | |------|------------|------| | 어두움 | 0~500 | 센서에 빛이 거의 없음 | | 실내 | 1000~2500 | 일반적인 조명 | | 밝음 | 3000~4095 | 강한 빛 |
🔨 따라하기¶
Step 1: 회로 연결하기¶
조도 센서(포토레지스터)를 연결해요.
조도 센서 → ESP32
━━━━━━━━━━━━━━━━
VCC → 3.3V
GND → GND
OUT → GPIO 34 (ADC1)
💡 GPIO 34, 35, 36, 39는 입력 전용 핀이에요. ADC 읽기에 적합해요!
Step 2: 밝기 값 읽기¶
코드:
from machine import ADC, Pin
import time
# 조도 센서 설정 (GPIO 34)
light_sensor = ADC(Pin(34))
light_sensor.atten(ADC.ATTN_11DB) # 0~3.3V 범위
while True:
value = light_sensor.read() # 0~4095
print(f"밝기: {value}")
time.sleep(0.5)
실행 결과:
밝기: 2847
밝기: 2851
밝기: 1203 ← 손으로 가렸을 때
밝기: 3891 ← 조명 비췄을 때
✅ 체크포인트: 손으로 센서를 가리면 값이 낮아지나요?
📝 전체 코드¶
from machine import ADC, Pin
import time
# 조도 센서 초기화
light_sensor = ADC(Pin(34))
light_sensor.atten(ADC.ATTN_11DB)
def get_brightness_level(value):
"""밝기 수준 판단"""
if value < 1000:
return "어두움 🌙"
elif value < 2500:
return "보통 💡"
else:
return "밝음 ☀️"
# 측정 시작
while True:
value = light_sensor.read()
level = get_brightness_level(value)
print(f"측정값: {value} → {level}")
time.sleep(1)
⚠️ 주의할 점¶
- ADC 핀 선택: GPIO 34, 35, 36, 39만 ADC 입력 가능
- 감쇠 설정:
ATTN_11DB를 설정해야 0~3.3V 전체 범위 측정
✅ 점검하기¶
- ADC가 하는 역할은 무엇인가요?
정답 확인
연속적인 아날로그 신호를 디지털 숫자(0~4095)로 변환합니다.- ESP32의 ADC 해상도는 몇 비트인가요?
정답 확인
12비트 (0~4095, 총 4096단계)- 센서를 손으로 가리면 값이 어떻게 변하나요?
정답 확인
빛이 차단되어 값이 낮아집니다.🔗 다음 장 미리보기¶
다음 장에서는 수온 센서(DS18B20)로 물의 온도를 측정해볼 거예요. 디지털 통신 방식인 1-Wire 프로토콜을 배워봅니다! 🌡️