아두이노 레시피

아두이노 레시피 : LED 자동밝기 - 기초편

arduinochef 2025. 2. 26. 15:42

# Recipe 17. LED 정복하기 시리즈 : auto-brightness

스마트 등에 있는 디머기능을 만들어봤으니, 이번엔 '자동밝기' 기능을 만들어볼까요?

안녕하세요~ 아두이노셰프입니다. 어제는 가변저항으로 LED 밝기조절을 했었는데요. 오늘은 이를 자동화해 보겠습니다. 스마트조명, 스탠드, 스마트폰까지 주변의 빛의 양을 감지해서 자동으로 밝기를 조절하는 기능을 많이 볼 수 있는데요. 어제 만들었던 코드를 조금만 바꾸면 이 기능을 만들 수 있답니다. 그럼 직접 해보면서 원리를 이해해 볼까요?

오늘은 그 네 번째 시간, ‘’ 자동 밝기조절’입니다.

오늘의 재료 Ingredient


<메인 재료>

CDS 셀(1개), LED(1개)

<그 외 재료>

아두이노 우노

브레드보드

1kΩ 저항(2개)

수-수 케이블(7개)


메이킹 방법 Steps

Step 1. 선 연결하기 Wiring

a. LED 두 다리(극) 중 긴 쪽이 + , 짧은 쪽이 - 에요.(반대로 연결하시면 불이 안 들어와요!)

b. 아두이노의 GND, 5V를 브레드보드의 +,- 줄에 연결하여 확장해 주겠습니다.

b. LED의 +(긴 극)를 저항의 한쪽과 연결해 주세요.

c. 저항의 남은 한쪽은 아두이노의 D5번에 연결해 주세요.

d. LED의 -(짧은 극)을 GND에 연결해 주세요.

e. cds의 한쪽을(극성이 없어요!) 저항을 이용해서 GND에 연결해 주세요.

f. cds의 반대쪽을 5v에 연결해 주세요.

g. 저항을 연결한 cds극을 아두이노의 A0번 핀에 연결해 주세요.

(말로 일일이 설명하니까 복잡해 보이네요. 그림을 참고해 주세요!ㅎㅎ)

- - - - - - - - - -

Step 2. 아두이노 코드 Code review

여러분의 요리가 훨씬 간편해질 수 있도록, 숙성이 필요한 코드는 언제나 제가 준비할게요ㅎㅎ

Q. 감지되는 빛의 양에 맞춰서 자동으로 밝기가 조절되는 기능

void setup()
{
  pinMode(A0, INPUT);
  pinMode(5, OUTPUT);
}

void loop()
{
  int bright = map(analogRead(A0),0,1023,0,255);
  analogWrite(5,bright);
  delay(100);
}

Q. 감지되는 빛의 양이 일정 수준이상 넘어가면 자동으로 꺼지는 기능

void setup()
{
  pinMode(A0, INPUT);
  pinMode(5, OUTPUT);
}

void loop()
{
  int bright = analogRead(A0);
  if(bright > 500){
  digitalWrite(5,LOW);
  }
  else{
  digitalWrite(5,HIGH);
  }
}

Step 3. 동작시키기 Working

● 코드를 아두이노 우노에 업로드해 주세요.

● cds셀에 빛을 비춰보거나, 손으로 셀을 가려보세요. 빛의 밝기에 따라 LED밝기도 변하나요?


코드의 동작 알고리즘

알고리즘은 쉬운 말로 ‘진행절차’라고 할 수 있습니다.

코드가 어떻게 동작되는지 알아볼까요?

Q. 감지되는 빛의 양에 맞춰서 자동으로 밝기가 조절되는 기능

저는 스마트폰화면처럼 낮에는 자동으로 밝기를 올려주고,

밤에는 자동으로 밝기를 줄여주는 기능을 만들고 싶어요.

먼저 원하는 동작을 말로 설명해 보죠.

주변의 빛이 많으면

많은 만큼

LED밝기를 올려주고,

주변의 빛이 적으면

적은 만큼

LED 밝기를 올려주면 되겠네요.

ㅋㅋㅋ이거 사실 어제 했던

가변저항으로 LED밝기 조절했던 코드와 똑같죠?

cds도 빛의 양에 따라 저항이 변하는 '가변저항이니까요'ㅎㅎ

어제처럼 map함수 이용해서 pwm범위로 변환하고

바로 pwm으로 출력하면 끝!

(이해가 안되면 어제 포스팅으로 고고!)

Q. 감지되는 빛의 양이 일정 수준이상 넘어가면 자동으로 꺼지는 기능

저는 밤에 불을 켜주는 스마트전조등을 만들고 싶어요.

먼저 원하는 동작을 말로 설명해 보죠.

주변의 빛이 많으면(낮에)

LED를 끄고,

주변의 빛이 적으면(밤에)

LED를 켜주면 되겠네요.

이제 드디어 IF문이 나옵니다.

FOR문처럼 조건문 중에 하나인 IF문은

"만약 ~라면 ~해라"라는

아주 많이 쓰이는 논리예요.

말로 적은 걸 코드로 표현해 볼게요.

"주변의 빛" = analogRead(A0);

"주변의 빛이 많으면" = if(analogRead(A0)>500)

"LED를 끄고" = digitalWrite(5, LOW);

"주변의 빛이 적으면" = (위의 조건문과 다르다면) else

"LED를 켜라" = digitaWrite(5, HIGH);

(기준값을 500으로 한 이유는 아날로그(0~1023)의 중간값이 500이기 때문이에요. 감도는 여러분이 지정하면 됩니다!)

이렇게 보니까

컴퓨터와 대화하는 것 같지 않나요?ㅋㅋ

'~면, ~라면, ~일 때' 등

문장에 이런 표현 있다면 모두 if문으로 표현할 수 있답니다!!

사용은 이렇게 하면 돼요.

if(조건){

실행할 코드

}

else {

실행할 코드

}

이렇게 하면 if문의 조건이 참일 경우

중괄호 안에 있는 코드가 실행돼요.

만약 오늘처럼 반대의 경우를 표현하고 싶다면

간단하게 else를 사용하면 됩니다.

위의 if문이 참이 되지 않은 경우에

else안의 코드가 실행돼요.

조금씩 코드들이 이해되나요?