초급 예제

누구나 쉽게 따라해볼 수 있는 쉬운 예제들입니다. 가볍게 도전~!

조도센서-빛 측정하기

2015-01-16 14:40:06

조도센서란?



조도센서(Photo Resistor)는 주변 환경의 밝기를 측정할 수 있는 센서입니다.

광에너지(빛)를 받으면 내부에 움직이는 전자가 발생하여 전도율이 변하는 광전효과를 가지는 소자를 사용합니다.

이번 프로젝트에서 사용하는 조도센서는 황화카드뮴을(Cds)를 소자로 사용했기 때문에 Cds 센서라고 부르기도 합니다.
 

Cds센서는 작고 단순한 구조로 되어있기 때문에 가격이 매우 싸고 가장 보편적으로 사용되고 있습니다.

조도 센서는 실생활에서 다방면으로 쓰이고 있으며

쓰이는 예로는 어두워지면 자동으로 켜지는 가로등, 자동차의 헤드라이트, 밝기에 따라 변하는 핸드폰 화면 액정 등이 있습니다.
 

 

 

 

조도센서 사용방법



Cds센서는 센서라고 부르지만 사실은 극성이 존재하지 않는 가변저항입니다.

저항의 수치는 빛의 양에 따라 가변적으로 달라지며 이로 인한 전압차로 조도를 구분할 수 있습니다. 
보통 조도를 측정하는 단위로는 룩스(Lux)를 많이 사용하지만 Cds센서는 정확한 조도 수치를 보여주지 않을뿐더러 값의 변화가 주변 조도에 따라 직선비례하지 않기 때문에 Lux단위의 조도를 측정하기에는 좋지 않습니다. 단순하게 주변이 밝다 어둡다를 상대적으로 비교할 수 있는 정도의 수치만 제공한다고 생각하시면 편합니다. 
 

이 예제에서 사용된 CdS센서는 옥외주차장, 휴식중의 극장 객석 정도의 빛의 양(10 Lux) 에서 약 10KΩ의 저항을 가지며, 아무런 빛이 없는 암실에서 약 200KΩ의 저항을 가집니다.
 

Cds센서가 저항이기 때문에, 빛의 양이 매우 많은 경우, 저항수치가 매우 작아저 과전류가 흐를수 있습니다.

 

조도를 측정하기 위해서는 풀업 회로를 사용하며 풀업 저항 사용시에는 조도센서의 저항값에 따라 전압 분배가 일어나 주변이 밝을수록 측정되는 전압의 크기는 작아집니다. 
 

 

 

 

부품 목록

NO 부품명 수량 상세설명
1 오렌지 보드 1  
2 조도센서 1 PGM5537
3 LED 1 LED(RED)
4 10KΩ 저항 1  
5 330Ω 저항 1  
6 브레드 보드 1  
7 점퍼 케이블 7  

 

부품명 오렌지 보드 조도 센서 LED
파트

 

 

부품명 10KΩ 저항 330Ω 저항 브레드 보드  점퍼 케이블
파트

 

 

 

 

하드웨어 making


 

1. 오렌지보드의  5V핀을 브레드보드의 +버스에 연결합니다.

2. 오렌지보드의 GND핀을 브레드보드의 -버스에 연결합니다.

3. 조도센서를 그림과 같이 세로로 꽂습니다.

4. 10KΩ 저항을 조도센서의 상단 단자에 연결합니다.

5. LED를 애노드 (긴 단자)가 아래쪽으로 향하게하여 꽂습니다.

6. LED의 애노드에 330Ω 저항을 연결합니다.

7. 조도센서의 하단 단자를 -버스에 연결합니다.

8. 10K 저항의 반대편 단자를 +버스에 연결합니다.

9. 조도센서의 상단 단자를 오렌지보드 A0번핀에 연결합니다.

10. LED 애노드와 연결된 저항의 반대 쪽을 오렌지보드 D3번 핀에 연결합니다.

11. LED의 캐소드 (짧은 단자)를  -버스에 연결합니다.


 

 

 

소프트웨어 coding


  1. /*
  2.   제목    : 조도센서로 어두워지면 LED 켜기
  3.   내용   : 조도센서를 손으로 가려 어둡게 만들면 LED가 켜지도록 해봅시다.
  4. */
  5.  
  6. // 조도센서를 A0핀으로 선언하고 led핀을 3번핀으로 선언합니다.
  7. int cds = A0;
  8. int led = 3;
  9.  
  10. // 실행시 가장 먼저 호출되는 함수이며, 최초 1회만 실행됩니다.
  11. // 변수를 선언하거나 초기화를 위한 코드를 포함합니다.
  12. void setup() {
  13.   Serial.begin(9600);          // 조도센서의 동작 상태를 확인하기 위하여 시리얼 통신을 설정합니다. (전송속도 9600bps)
  14.   pinMode(led, OUTPUT);   // LED 핀을 OUTPUT으로 설정합니다.
  15. }
  16.  
  17. // setup() 함수가 호출된 이후, loop() 함수가 호출되며,
  18. // 블록 안의 코드를 무한히 반복 실행됩니다.
  19. void loop() {
  20.   // 조도센서로 부터 측정된 밝기 값을 읽어 cdsValue라는 변수에 저장합니다.
  21.   int cdsValue = analogRead(cds);
  22.  
  23.   // 측정된 밝기 값를 시리얼 모니터에 출력합니다.
  24.   Serial.print("cds =  ");
  25.   Serial.println(cdsValue);
  26.  
  27.   // 조도센서로 부터 측정된 밝기 값이 500보다 크다면, 아래의 블록을 실행합니다.
  28.   // 기준 밝기값은 주변 환경에 따라 바꿔주세요.
  29.   if (cdsValue > 500) {
  30.     digitalWrite(led, HIGH);
  31.     Serial.println("LED ON (cds > 500)");
  32.   }
  33.  
  34.   // 조도센서로 부터 측정된 밝기 값이 500보다 작다면, 아래의 블록을 실행합니다.
  35.   else {
  36.     digitalWrite(led, LOW);
  37.     Serial.println("LED OFF (cds < 500)");
  38.   }
  39.   delay(200);
  40. }

 

TIP 위 코드에서는 밝다 어둡다의 기준값을 500으로 설정했지만 기준값은 주변 환경에 따라 달라질 수 있습니다.

먼저 조도센서로 현재 상태에서 밝을때와 어두울 때의 값을 측정한 후 그 사이의 중간값으로 기준값을 설정해주세요.

 

 

 

 

analogRead()

 

analogRead()함수는 A0번 핀부터 A5번 사이에 연결된 핀에서 아날로그 신호값을 읽을 때 사용하는 함수입니다.

출력값은 0~1023사이의 숫자로 표현되며 조도센서를 풀업회로로 연결했을 시 어두울 때 측정값이 올라가고 밝을 때는 측정값이 내려갑니다.

 

 

 

 

코드 실행

 

위 코드를 실행시키면 조도센서로 밝기를 측정한 후 측정 값이 500이상(어두우면)이면 LED가 켜지고, 500이하(밝으면) LED가 꺼집니다.

 

 

 

 

 

조도에 따라 LED밝기 조절하기

  1. /*
  2.   제목    : 조도에 따라 LED밝기 조절하기
  3.   내용   : 어두운 정도에 따라 점점 더 밝아지는 LED를 만들어 봅시다.
  4. */
  5.  
  6. // 조도센서를 A0핀으로 선언하고 led핀을 3번핀으로 선언합니다.
  7. int cds = A0;
  8. int led = 3;
  9.  
  10. // 실행시 가장 먼저 호출되는 함수이며, 최초 1회만 실행됩니다.
  11. // 변수를 선언하거나 초기화를 위한 코드를 포함합니다.
  12. void setup() {
  13.   Serial.begin(9600);          // 조도센서의 동작 상태를 확인하기 위하여 시리얼 통신을 설정합니다. (전송속도 9600bps)
  14.   pinMode(ledOUTPUT);   // LED 핀을 OUTPUT으로 설정합니다.
  15. }
  16.  
  17. // setup() 함수가 호출된 이후, loop() 함수가 호출되며,
  18. // 블록 안의 코드를 무한히 반복 실행됩니다.
  19. void loop() {
  20.   // 조도센서로 부터 측정된 밝기 값을 읽어 cdsValue라는 변수에 저장합니다.
  21.   int cdsValue = analogRead(cds);
  22.  
  23.   // 측정된 밝기 값를 시리얼 모니터에 출력합니다.
  24.   Serial.print("cds =  ");
  25.   Serial.println(cdsValue);
  26.  
  27.   //map함수와 constrain을 사용하여 조도센서의 밝기 범위를 0~1023에서 0~255로 변경
  28.   cdsValue = map(cdsValue, 0, 1023, 0, 255);
  29.   cdsValue = constrain(cdsValue, 0, 255);
  30.   analogWrite(led,cdsValue);
  31.   delay(200);
  32. }

 

 

 

 

map()함수와 constrain()

 

map함수특정 범위를 지정한 범위로 변경하고자 할 때 사용하는 함수입니다.

위 코드에서는 analogRead()로 측정되는 범위(0~1023)를 LED의 밝기로 쓸 수 있는 범위(0~255)로 변경하여 조도센서로 측정되는 값이 바로 LED의 밝기로 사용될 수 있도록 변경합니다.

 

 

출력값은 0~1023사이의 숫자로 표현되며 조도센서를 풀업회로로 연결했을 시 어두울 때 측정값이 올라가고 밝을 때는 측정값이 내려갑니다.

 

만약 현재 밝기가 200~800사이로 측정이 된다면 위 코드에서 map의 범위를 0, 1023대신 200, 800으로 쓴다면 좀 더 확실한 LED밝기 변화를 볼 수 있습니다.

 

constrain()은 범위를 제한할 때 쓰는 함수입니다.

constrain(cdsValue,0,255)를 선언함으로써 cdsValue의 값을 0부터 255사이의 숫자로 제한합니다.

 

 

 

 

코드 실행

 

위 코드를 실행시키면 조도센서로 측정한 밝기(0~1023사이)를 map함수와 constrain()함수를 사용하여 0~255사이의 값으로 변환한 다음 analogWrite()를 사용하여 LED의 밝기로 변환합니다.

 

 

 

 

 

kocoafabeditor

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

조도 센서, 아두이노, 오렌지보드

김연주 2015-12-29 16:25:36

if(cdsValue>50) 이부분, cdsValue>500 정도로 하여야 손으로 가리고 안가리고에 따라 LED가 껐다가,켜졌다가 하더라구요. 그리고 else {
// LED가 연결된 핀의 로직레벨을 LOW (0V)로 설정하여, LED가 꺼지도록 합니다.
digitalWrite(led, LOW);
// LED상태를 시리얼 모니터에 출력합니다.
Serial.println("LED ON (cds < 50)");
} 이부분은 LED OFF가 맞을것 같네요!

kocoafab 2015-12-30 18:22:39

@김연주 감사합니다. ^^

kocoafab 2015-12-30 18:23:59

cdsValue의 경우 환경에 따라 오차가 있어, 조정이 좀 필요합니다.

레얄 2017-04-06 11:06:16

이 조도센서 코드로 오렌지보드 ble로 핸드폰블루투스연결할려고 하거든요
오렌지보드 ble 핸드폰 연결은 어떻게 해요???
그리고 블루투스 연동시 제가 핸드폰에서 led 점,소등하는 것과 빛의 양에따라 자동으로 led점,소등하는 거에 혼선문제없이 설정할려고 하거든요

rkdfo 2018-03-18 17:07:04

소프트웨어 코딩과 하드웨어 메이킹을 둘다하는건가요?아니면 소프트웨어 코딩이나 하드웨어 메이킹 하나만 하는건가요?

kocoafabeditor 2018-10-11 16:06:19

하드웨어 연결을 먼저 한 후에 소프트웨어 코딩을 통해 연결된 하드웨어를 동작시킵니다~!

steven0108 2019-09-07 21:16:33

일반led대신 네오픽셀 사용하는 예제좀 올려주세요!!!

이승우 2019-10-16 14:55:11

신기하누,재밌누,할만하누,야구의기초 누