광(Light)센서를 이용하여 디스플레이 밝기 조절하기
연재 네 번째 글입니다. 이번 글에서는 아날로그 방식의 광량 측정 센서에 대해 소개합니다. 이전 글에서 언급했듯이 이 시계를 사용할 곳은 침실이기 때문에, 디스플레이로 사용하는 세그먼트 LED의 밝기가 수면을 방해할 수 있습니다. 이를 해결하기 위해서 LED를 백라이트로 사용하는 시계들에 많이 사용하는 기능처럼, 주위가 어두워지면 밝기를 낮추도록 광센서를 이용하여 제어하겠습니다.
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핀으로 변경했습니다.
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를 통해 측정 값을 출력합니다.
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 미만일 때만 비례하여 조절됩니다.
프로젝트에 적용할 때는 위와 같이 세밀하게 변경되도록 하지는 않고, 일정 값 이하로 떨어지면 정해진 밝기로 고정되도록 할 예정입니다. 이상으로 아날로그 광센서에 대한 글을 마무리하겠습니다.