프로젝트 03: 🌙 감성 스마트 무드등
주변이 어두워지면 스스로 은은한 불빛을 내뿜는 똑똑한 조명을 만들어 봅시다.
1. 프로젝트 개요
방 안의 불을 끄면 자동으로 켜지고, 아침이 되어 해가 뜨면 자동으로 꺼지는 스마트 가전의 원리를 배웁니다. 조도 센서로 들어오는 아날로그 값(0~1023)을 LED의 밝기 값(0~255)으로 변환하는 것이 핵심입니다.
📦 준비물
아두이노 우노 x 1
고휘도 LED (흰색/노란색) x 1
조도 센서 (CDS) x 1
220Ω 저항 (LED용) x 1
10kΩ 저항 (센서용) x 1
브레드보드 & 와이어
2. 상세 회로도 (Wiring Diagram)
조도 센서는 빛의 양에 따라 저항이 변하므로, 전압 분배 법칙을 이용해 10kΩ 저항과 함께 연결해야 합니다. LED는 밝기 조절을 위해 물결표시(~)가 있는 PWM 9번 핀에 연결합니다.
▲ 스마트 무드등 회로도: 조도 센서와 LED의 연결 위치를 확인하세요.
3. 코드 작성하기
단순히 켜고 끄는 것이 아니라, 어두울수록 더 밝게 빛나도록 수식을 반전시키는 것이 포인트입니다.
int sensorPin = A0; // 조도 센서 핀
int ledPin = 9; // LED 핀 (PWM 핀)
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
// 1. 빛의 세기 읽기 (밝을수록 큰 값, 어두울수록 작은 값)
int value = analogRead(sensorPin);
Serial.print("Sensor Value: ");
Serial.println(value);
// 2. 밝기 계산 (어두울 때 켜져야 하므로 범위를 뒤집습니다)
// 입력: 300(밝음) ~ 800(어두움) -> 출력: 0(끔) ~ 255(최대 밝기)
// ※ 실제 센서 값에 따라 300, 800 숫자는 조정이 필요할 수 있습니다.
int brightness = map(value, 300, 800, 0, 255);
// 3. 값의 범위를 0~255로 제한 (안전을 위해)
brightness = constrain(brightness, 0, 255);
// 4. LED 밝기 조절
analogWrite(ledPin, brightness);
delay(50);
}
4. 핵심 로직 설명
💡 map() 함수의 마법: 거꾸로 변환하기
일반적으로 조도 센서는 어두울수록 낮은 숫자(전압)를 냅니다. 하지만 무드등은 어두울 때(낮은 숫자) 더 밝게(높은 숫자) 빛나야 하죠. 그래서 map(value, 300, 800, 255, 0) 처럼 마지막 숫자의 순서를 바꿔주면 '반비례' 효과를 쉽게 낼 수 있습니다.
- constrain(값, 최소, 최대): 계산된 밝기가 0보다 작아지거나 255보다 커지지 않도록 딱 잡아주는 안전장치 함수입니다.
- PWM 제어:
analogWrite를 통해 전압의 세기를 조절하여 LED의 밝기를 부드럽게 변경합니다.
5. 🎯 심화 챌린지: 무드등 색깔 바꾸기
단색 LED 대신 RGB LED를 사용해 보세요! 주변이 어두워질수록 단순히 밝아지는 것이 아니라, 파란색에서 따뜻한 주황색으로 색상이 변하게 만들면 훨씬 감성적인 무드등이 됩니다.