아두이노 코딩 : 조도센서(CDS,포토레지스터)로 LED Dimming 하기
Lucy Archive
Lucy / Facilitate4U
2020. 7. 26. 02:29

아두이노 광센서 포토레지스터아두이노 광센서 포토레지스터

Arduino Uno : Dimming LED with light sensor (CDS Sensor, Photoresistor)

  포토레지스터는 빛의 세기를 측정 할 수 있는 센서 중의 하나로 주변 밝기에 따라 저항이 변하는 특성을 가지고 있습니다. 본 포스트에서는

포토레지스터로 주변 밝기를 측정하고, 주변 밝기에 따라 LED의 밝기를 조절하는 예제

를 소개합니다.

포토레지스터

  아래 소개 할 예제에 사용된 포토레지스터는 [각주:1]GL5537 입니다. 아래 그림은 GL5537의 외형과 센서 테이블을 보여 주고 있습니다. GL5537 과 같은 센서는 우측 그래프에서 보는 것처럼 오차 범위가 넓어 정밀 센서가 아닙니다. 데이터 시트 상에서 10 lux 의 경우 18kΩ ~ 50Ω 의 범위를 가지는 것을 확인 할 수 있습니다. 이런 오차율이 큰 센서로 프로그래밍을 하는 경우 대략적인 밝기에 대한 값과 밝아지면 저항이 작아지고, 어두워지면 저항이 커지는 등의 특성을 파악 후 실제 측정 값을 기준으로 프로그래밍을 하시는 것이 편합니다.

GL5537 외형 및 저항 변화 테이블GL5537 외형 및 저항 변화 테이블

GL5537 주요 스펙

  • Resistance at 10Lux : 18 kΩ ~ 50 kΩ (at 25℃)
  • Resistance at 0 Lux : 2.0 MΩ
  • Power Dissipation : 100mW (at 25℃)
  • Max Voltage : 150V (at 25℃)


Hardware

준비물

본 예제의 구성품은 아래와 같습니다.

  • Arduino Uno x 1 EA
  • GL5537 x 1 EA
  • DIP Type Resistor 4.7kΩ x 1EA (GL5537 연결용 직렬 저항 1kΩ ~ 20kΩ 의 값 권장)
  • DIP Type LED x 1EA
  • DIP Type Resistor 470Ω x 1EA (LED 연결용 직렬 저항 200Ω ~ 1kΩ 의 값 권장)
  • Bread Board x 1EA
  • Jumper WIres

회로도 및 연결

본 예제의 회로 구성은 아래와 같습니다.

  • A5 : GL5537 센서 입력
    • Input Voltage = (5V x Rsensor) / (Rsensor + 4.7kΩ)
  • D11 : PWM 출력 포트로 사용

※ GL5537 에 연결된 직렬 저항은 아래의 사항이 검토 되어야 합니다.

  • GL5537 최소 밝기 일 때 흐르는 전류를 조정
    • 레귤레이터 보호 (최대 출력 전류 이하의 범위가 되도록)
    • CDS 소자 보호 (Power Dissipation 1/4 이하가 되도록 권장)
  • 밝기 측정 범위 조정
    • ex) 측정할 밝기 범위의 중간 값 밝기의 저항으로 연결시 평균 밝기 일 때 2.5V 가 입력 됩니다.

예제1 : CDS 특성 값 변화 측정

외부 밝기에 따라 CDS 센서 값의 변화를 측정하기 위한 코드입니다. 

코드

외부 밝기에 따라 아래의 3가지 출력 파라미터를 가집니다.
  • adcValue : A5 입력으로 들어오는 전압의 ADC (0 ~ 1023)값
  • inputVolage : A5 로 들어오는 실제 전압을 계산한 값
    • 0V ~ 5V 범위의 전압을 계산 및 저장하기 위해 float 형으로 선언
  • cdsResistor : CDS 센서의 현재 저항 값

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#define sensorPin A5 // 센서 입력 포트 번호
#define pwmPin 11 // LED 출력 포트
 
#define SeriesResistorOfCDS 4700 //CDS 센서 직렬 저항
 
int iMin;
int iMax;
 
void setup(){
    pinMode(pwmPin, OUTPUT);
    Serial.begin(9600);
    while(!Serial){
        ;
    }
    delay(1000);
    Serial.println("Initialize Finished...");
    delay(1000);
}
 
void loop(){
 
    int adcValue = analogRead(sensorPin);
 
    // map 함수의 파라미터는 테스트 환경의 값에서 최적화 하였습니다.
    float inputVoltage = fMap(float(adcValue), 0102305);
    float cdsResistor = (SeriesResistorOfCDS*inputVoltage)/(5-inputVoltage);
 
    Serial.print("ADC value : ");
    Serial.println(adcValue);
    Serial.print("A5 Input Voltage : ");
    Serial.println(inputVoltage);
    Serial.print("CDS Sensor Resistor : ");
    Serial.println(cdsResistor);
    Serial.println("");
 
    delay(100);
}
 
float fMap(float x, float in_min, float in_max, float out_min, float out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
cs

실행 결과

제가 작업하는 공간의 밝기를 측정 한 결과입니다. 측정은 평상시 밝기와 CDS 센서를 손으로 가린 경우 2가지를 비교하였습니다. 예제2 에서 이 값을 이용하여 LED 밝기를 변경하는 최대 최소 범위의 기준 값으로 사용할 예정입니다.

  • 평상시
    • ADC Value : 170
    • CDS 저항 : 940 Ω
  • CDS 센서를 손으로 가린 경우
    • ADC Value : 490
    • CDS 저항 : 4.3 kΩ

CDS 센서 측정 결과CDS 센서 측정 결과 (좌) 평상시, (우) 손으로 센서를 가렸을 때


예제2 : 주변 밝기로 LED 밝기 제어

CDS 센서의 빛을 손으로 가리면서 LED 밝기를 제어하는 프로그램입니다. 평상시와 손으로 CDS 센서를 막았을 때 LED 밝기를 최소, 최대 범위로 스윕하기 위해 예제1의 값을 기준으로 PWM 출력 파라미터를 설정하였습니다.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#define sensorPin A5 // 센서 입력 포트 번호
#define pwmPin 11 // LED 철력 포트
 
void setup(){
    pinMode(pwmPin, OUTPUT);
    delay(1000);
}
 
void loop(){
 
    int value = analogRead(sensorPin);
    // map 함수의 파라미터는 테스트 환경의 값에서 최적화 하였습니다.
    int temp = map(value, 1805000255);
    if((temp < 0))
        temp = 0;
    else if (temp > 255)
        temp = 255;
    analogWrite(pwmPin, temp);
    delay(10);
}
cs

13번 줄 map(value, 180, 500, 0, 255) 의 180 과 500은 예제1에서 측정한 테스트 환경에서 최소 값과 최대 값을 반영하였습니다. 

14번 ~ 17번 줄 if구문은 평상시 보다 밝은 경우는 LED를 끄고, 손으로 막은 경우 보다 어두운 경우는 LED를 최대 밝기로 지정하기 위해 작성된 if문입니다.

실행 결과

아래 영상과 같이 CDS 센서 위에 손을 가까이 댈수록 LED 가 밝아지는 것을 확인 할 수 있습니다.


마무리

본 포스트에서

아두이노 아날로그 입력으로 CDS 센서를 사용하고, 아날로그 출력으로 LED 밝기를 제어

하는 예제를 소개하였습니다. 아두이노의 아날로그 입력 및 출력 방법에 대한 내용이 필요하시면 아래의 관련 포스트를 참고해주세요.

끝까지 읽어 주셔서 감사합니다.^^

관련포스트

👉 아두이노 아날로그 입출력 관련글 목록 보기

👉 아두이노 센서 관련글 목록 보기

👉 아두이노 관련글 전체 목록 보기


  1. GL5537 데이터시트 : http://www.datasheet.kr/download.php?id=756924 [본문으로]