부품설명

자주 사용하는 부품들의 사용법에 대하여 알아봅니다.

포토레지스터 x LED-밝기조절

2014-07-28 05:27:09

개요

 

핸드폰을 사용하시다 보면 주변이 어두울 때 밝기가 밝아지는 경우가 있을 것입니다.
또는 밤이 되면 자동으로 켜지는 가로등을 본 적이 있을 것입니다.
모두 포토레지스터와 같은 빛 감지 센서를 사용한 것입니다. 
여러분도 포토레지스터를 사용하면 밤에 잘 때 자동으로 켜지는 수면등을 만들 수 도 있을 것입니다.






출처 : blossompassion.tistory.com / www.electroschematics.com



 

본 예제를 통해서 포토레지스터를 연결한 후 이 센서를 통해 LED ON/OFF를 조절해봅시다.
그리고 저항 값을 바꾸기 위한 전압분배 회로에 대해서도 알아봅시다.

 

 

 

 

 

부품목록

 

본 학습에는 총 7종류의 부품이 필요합니다.
각각의 부품에 대한 자세한 설명은 하단의 상세설명 링크를 통하여 파악하실 수 있습니다.


 
NO 부품명 수량
1 아두이노 우노 R3 1
2 브레드보드 1
3 330Ω 저항 1
4 10KΩ 저항 1
5 포토 레지스터 1
6 5mm LED 1
7 점퍼케이블 5
 
부품명 아두이노 우노 R3 브레드보드 330Ω 저항 10KΩ 저항 포토 레지스터
파트 X1       X1       X1       X1        X1       
 
부품명 5mm LED 점퍼케이블
파트 X1 X5

 

 

 

하드웨어 making

 

조감도

 

브레드보드

 

 

전자 회로도

 

 

소프트웨어 coding

 

/*
 제목		: 포토 레지스터로 LED 밝기 조절하기
 내용		: 포토 레지스터를 이용해 LED의 밝기를 조절해 봅시다. 
 */

// 포토 레지스터를 아날로그 0번 핀에 연결합니다.
const int sensorPin = A0;
// LED를 디지털 9번 핀에 연결합니다.
const int ledPin = 9;
// 포토 레지스터에서 측정된 수치를 저장할 변수를 전역 변수로 선언합니다.
int lightLevel;

// 실행시 가장 먼저 호출되는 함수이며, 최초 1회만 실행됩니다.
void setup() {
	//9번 핀을 출력 핀으로 설정합니다.
	pinMode(ledPin, OUTPUT);
	
}

// setup() 함수가 호출된 이후, loop() 함수가 호출되며,
// 블록 안의 코드를 무한히 반복 실행합니다.
void loop() {
	// 포토 레지스터를 통해 측정된 값을 lightLevel 변수에 저장합니다. 
	lightLevel = analogRead(sensorPin);   
	// LED의 밝기를 조절하는 함수입니다.
	manualTune();  
	// lightLevel에 따라 LED의 밝기를 조절합니다.
	analogWrite(ledPin, lightLevel);    
}

// LED 밝기 조절 함수
void manualTune() {
	// 밝기 정하기
	// 500 ~ 1023범위에 있는 lightLevel를 0~255범위로 바꿉니다.
	lightLevel = map(lightLevel, 500, 1023, 0, 255); 
	// lightLevel의 값의 범위를 0부터 255까지로 제한합니다.
	lightLevel = constrain(lightLevel, 0, 255);       
}

 

 

 

소프트웨어 & 하드웨어 설명

 

1. 사전설명

 



아날로그 입력 0번 핀은 포토레지스터와 10KΩ 저항 사이에 연결 되어 있습니다.
두 개의 저항을 직렬로 연결 함으로써 전압을 분배 했습니다. 이 경우 A0의 전압은 두 개의 저항값에 의해서 달라집니다. 
10kΩ 저항은 저항값이 바뀌지 않지만 포토레지스터는 손가락으로 만질 경우 저항값이 바뀝니다. 
바뀐 저항값에 A0이 읽는 전압이 바뀌고 읽은 값을 기반으로 LED에 전압을 출력하기 때문에 
LED의 밝기를 조절할 수 있는 것입니다.

 

 

2. 스케치

 

// 실행시 가장 먼저 호출되는 함수이며, 최초 1회만 실행됩니다.
void setup() {
  //9번 핀을 출력 핀으로 설정합니다.
  pinMode(ledPin, OUTPUT);
  
}

아날로그 입력핀은 입력이라고 따로 명시 하지 않아도 됩니다.
아날로그 핀은 입력용으로만 사용됩니다.
또, analogRead 함수가 호출될 때 자동으로 pinMode( , INPUT)이 호출 되기 때문입니다.

 

// LED 밝기 조절 함수
void manualTune() {
  // 밝기 정하기
  // 500 ~ 1023범위에 있는 lightLevel를 0~255범위로 바꿉니다.
  lightLevel = map(lightLevel, 500, 1023, 0, 255); 
  // lightLevel의 값의 범위를 0부터 255까지로 제한합니다.
  lightLevel = constrain(lightLevel, 0, 255);       
}

아날로그 입력 핀은 0 ~ 1023 값을 읽을 수 있습니다.
하지만 PWM모드로 사용되는 출력핀에서는 0~ 255 값만을 출력 할 수 있습니다.
읽어온 값을 출력 값의 범위에 받도록 바꿔야 합니다. 그럴 때 사용하는 함수가 map, constrain 입니다.

map 함수는 A0에서 읽어온 lightLevel값을 0~255로 매핑합니다. 
map 함수는 상한과 하한을 벗어난 값을 사용하면 출력도 지정된 출력 범위를 벗어나게 됩니다.
그래서 constrain함수를 사용합니다.

constrain함수의 경우 만일 변수 value의 값이 min보다 낮은 값일 경우
min값을 반환하고, max보다 높은 값일 경우 max값을 반환합니다. 

이 회로는 사실 약 300 ~ 800 정도 범위의 값을 A0 범위에서 받습니다. 
즉 0 ~ 1023을 전체 범위로 할 경우 완전히 꺼지지 않을 수 있습니다. 
이런 경우를 대비해서 0대신 500이라는 값을 넣었습니다.
500, 1023를 여러 숫자로 바꿔 보세요.

 

 

 

 

 

 

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

포토레지스터, LED, 아두이노

hihyo 2014-08-01 16:06:38

포토 레지스터는 다양한 활용이 가능하겠네요

jy 2014-08-01 16:51:28

신기하네요

번개 2016-01-30 21:28:53

포토 레지스터를 가리면 꺼집니다. 반대로 작동하게 하려면 어떻게 코딩을 해야 합니까?

kocoafab 2019-01-07 09:39:36

현재 위에 있는 회로는 풀다운 회로다 보니 어두워 지면 값이 내려가고, 밝아지면 값이 올라가게 됩니다.

그렇기 때문에 가리면 불이 꺼지게 되는데, 밝았을 때와 어두웠을 때 값을 바꾸기 위해서는 map함수를 수정하여 값을 반대로 변환하게 하면 됩니다.
lightLevel = map(lightLevel, 500, 1023, 0, 255); 이부분에서 0과 255를 바꿔서 넣게 되면 밝았을 때 값과 어두웠을 때 값이 바뀌게 되어 기존 동작에 반대로 동작하게 되실 겁니다.

tech 2021-07-29 01:48:14

소스를 바꿔도 반대로 동작하지 않습니다... 해결좀 해주세요.... 어렵네요