WIFI로 제어하는 탁상시계 만들기 #4 라이트(Light) 센서

2019. 1. 17. 15:28

Project/Turtle Clock

광(Light)센서를 이용하여 디스플레이 밝기 조절하기

연재 네 번째 글입니다. 이번 글에서는 아날로그 방식의 광량 측정 센서에 대해 소개합니다. 이전 글에서 언급했듯이 이 시계를 사용할 곳은 침실이기 때문에, 디스플레이로 사용하는 세그먼트 LED의 밝기가 수면을 방해할 수 있습니다. 이를 해결하기 위해서 LED를 백라이트로 사용하는 시계들에 많이 사용하는 기능처럼, 주위가 어두워지면 밝기를 낮추도록 광센서를 이용하여 제어하겠습니다.

1. DFRobot Analog Ambient Light Sensor

DFRobot사에서 나오는 아날로그 방식의 광센서입니다. 박스 없이 비닐 포장되어 있습니다.

패키지도 간단합니다. 케이블 및 보드가 들어 있습니다.

이 센서는 이름처럼 아두이노의 아날로그 포트에 연결하여 사용하며 PT550(environmental light sensor)이라는 센서에 터미널, 저항 등을 추가한 브레이크 아웃(break out) 보드입니다. 기능이 단순한 만큼 외형도 단순합니다.

두 개의 홀이 있어서 볼트를 이용하여 고정할 계획입니다.

보드와 케이블은 JST 터미널을 이용하여 결합합니다. 반대쪽은 3핀 점퍼 와이어용 터미널입니다.

DFRobot사는 센서의 보드 디자인이나 케이블 방식을 “Gravity”라는 디자인 방식으로 통일하고 있습니다. 특별한 건 없지만, 센서의 입출력 터미널 부분을 일관된 디자인으로 배치하여 장착이 쉽도록 하였습니다. 위 사진은 아두이노 우노 보드에 삽입된 I/O Expansion Shield인데, 아날로그 센서를 위한 포트 및 전원 관련 핀을 한 자리에 배치하여 보이는 것처럼 장착이 아주 쉽습니다. 전원 공급을 위해 여기 저기 연결할 필요가 없습니다.

센서의 제품 정보는 아래와 같습니다. 그 외에 관련 정보는 아래쪽 링크를 참고하세요.

  • Supply Voltage : 3.3V to 5V
  • Illumination range : 1 Lux to 6000 Lux
  • Responsive time : 15us
  • Interface : Analog
  • Size : 22 x 30mm

nodeMCU와의 연결은 위와 같습니다. 3.3V, 5V 둘 다 지원하기 때문에 전원은 보드에서 공급합니다. nodeMCU 보드는 아날로그 포트가 하나 밖에 없습니다.

핀들이 떨어져 있어서 터미널 단자를 2핀, 1핀으로 변경했습니다.

2. 몇 가지 예제를 통하여 사용법을 알아보겠습니다.
void setup() {
  Serial.begin(115200);
}
//
void loop() {
  int val;
  val = analogRead(A0);
  Serial.println(val);
  delay(200);
}

첫 번째 예제입니다. 센서 값을 읽어 시리얼 모니터에 출력합니다. 아날로그 포트로 입력 받기 때문에 미리 처리할 부분은 없습니다. analogRead() 함수를 이용하여 값을 읽습니다. 아날로그 포트의 이름은 “A0”입니다.

결과는 위와 같습니다. 한 가지 주의할 것이 있는데, 위 결과 값은 당연히 Lux 단위가 아닙니다. 아날로그 포트를 통해 입력 받기 때문에 0 ~ 1023 사이(10bit)의 값만 존재합니다.

#include <Adafruit_LEDBackpack.h>
//
Adafruit_7segment led = Adafruit_7segment();
//
void setup() {
  Wire.begin(D1, D2);
  led.begin(0x70);
}
//
void loop() {
  int val;
  val = analogRead(A0);
  led.print(val, DEC);
  led.writeDisplay();
  delay(200);
}

두 번째 예제는 시리얼 모니터가 아닌 세그먼트 LED를 통해 측정 값을 출력합니다.

3. setBrightness() 함수로 LED 밝기 조절하기

Adafruit 7 세그먼트 LED Backpack을 위한 라이브러리 함수 중에 setBrightness() 함수를 이용하면 디스플레이의 밝기를 조절할 수 있습니다. 총 16단계로 조절 가능하고 인수는 0에서 15까지의 값입니다.

#include <Adafruit_LEDBackpack.h>
//
Adafruit_7segment led = Adafruit_7segment();
//
void setup() {
  Wire.begin(D1, D2);
  led.begin(0x70);
}
//
void loop() {
  led.print(8888, DEC);
  led.displaybuffer[2] = 30; // 16 + 8 + 4 + 2
  led.writeDisplay();
  //
  for ( int i = 0; i > 16; i++) {
   led.setBrightness(i);
    delay(200); 
  }
}

예제입니다. 숫자 “8888”과 모든 도트 포인트를 “On” 한 후, 밝기를 16단계로 조절합니다.

#include <Adafruit_LEDBackpack.h>
//
Adafruit_7segment led = Adafruit_7segment();
//
void setup() {
  Wire.begin(D1, D2);
  led.begin(0x70);
}
//
void loop() {
  int val;
  val = analogRead(A0);
  if (val > 480) {
    led.setBrightness(val / 30);
  } else {
    led.setBrightness(15);
  }
  led.print(8888, DEC);
  led.displaybuffer[2] = 30; // 16 + 8 + 4 + 2
  led.writeDisplay();
  delay(50);
}

광센서를 적용하여 주변 밝기에 따라 LED 디스플레이의 밝기를 조절하는 예제입니다. 변화 폭이 크도록 센서 값이 480 미만일 때만 비례하여 조절됩니다.

프로젝트에 적용할 때는 위와 같이 세밀하게 변경되도록 하지는 않고, 일정 값 이하로 떨어지면 정해진 밝기로 고정되도록 할 예정입니다. 이상으로 아날로그 광센서에 대한 글을 마무리하겠습니다.

Comments