본 절은 [BH1750] 아두이노 센서를 사용하기 위해 알아야 할 내용과 실습 방법에 대해 설명한다. 아두이노 센서의 특징, 동작원리, 사양, 연결 핀 배열, 출력 값, 주의사항을 알아본다. 아두이노와 센서를 연결하고, 간단한 코딩으로 센서를 쉽게 실습할 수 있다.
목차
BH1750 아두이노 조도 센서 (LCD16X2 키패드실드)
BH1750 센서란?
BH1750 센서는 조도센서이다. 16비트의 분해능력을 가지고 있으며, IIC통신을 지원한다. 수집 된 빛의 강도 데이터에 따라 LCD 및 키보드의 배경 조명등을 조정할 수 있다 .또한 분해능으로 다양한 광량 변화를 감지 할 수 있다.
BH1750 조도센서는 자체적으로 아날로그 신호를 디지털 신호로 변환해주는 16비티의 ADC 기능이 내장되어 있다. 즉, 16비트는 2^16 이므로 65,536 이 된다.
이 센서가 출력하는 데이터는 lx 에서 직접 출력된다. 균일 한 빛을 발하는 물체가 1 평방 미터 안에 1 lx 광속을 얻으면 그 광도는 1 lx 가 된다.
밤 : 0.001 0.02 lx
달빛의 밤 : 0.002 ~ 0.3 lx
흐린 실내 : 5 ~ 50 lx
흐린 야외 : 50 ~ 500 lx
맑은 실내 : 100 ~ 1000 lx
BH1750 아두이노 센서 특징
센서의 특징은 다음과 같다. BH1750 은 환경 조명에 따라 화면 밝기를 조작하기 위해 일반적으로 사용되는 디지털 주변 광 센서 입니다. 이 센서는 최대 65535lx의 빛의 LUX 값을 정확하게 측정 할 수 있습니다.
제품 모델 | BH1750 |
측정범위 | 0 ~ 65535 lx |
핀배치 | VCC, GND, SCL, SDA, ADDR |
작동전압 | 3 ~ 5V |
- 전원 공급 장치 : 2.4V-3.6V (일반적으로 3.0V)
- 더 적은 전류 소비 : 0.12mA
- 측정 범위 : 1-65535lx
- 통신 : I2C 버스
- 정확도 : +/- 20 %
- 디지털 데이터에서 아날로그 조도를 변환하기위한 내장 A / D 컨버터.
- IR 방사의 매우 작은 영향
- 인간의 눈에 가깝게 반응
- 파워 다운 기능에 의한 저 전류
- 50Hz / 60Hz 광 노이즈 제거 기능
- 1.8V 로직 입력 인터페이스
- 외부 부품이 필요 없음
- 16비트 ADC가 내장되어 있어 높은 분해능의 센서 결과 값을 출력
- 고정밀 측정 1 lux 수행 다양한 밝기
- 표준 NXP IIC 통신 프로토콜
- 2 가지 유형의 I2 C 슬레이브 주소 선택 가능
- 광원에 대한 의존성이 적음 (백열등, 형광등, 할로겐 등, 백색 LED, 태양 광 등)
- 광학 창 영향 측정 결과 조정 가능 (이 기능을 이용하여 최소 0.11lx, 최대 100000lx 감지 가능)
- 작은 측정 편차 (+/- 20 %)
- 적외선의 영향은 매우 적음
BH1750 센서 동작 원리
센서의 조도 출력 값은 Lux로 출력이 되며, 마이크로컨트롤러와 I2C 인터페이스를 이용하여 측정된 조도값을 읽어 올 수 있다. 또한 센서의 스펙트럼 반응은 최대한 사람의 눈의 반응을 따라하도록 디자인된 센서이다. 1~65,535 룩스(lux)의 센싱범위를 가진다.
센서는 I2C 통신 프로토콜을 사용하므로 마이크로 컨트롤러와 함께 사용하기가 매우 쉽다. SCL 및 SDA 핀은 I2C 용이다. 센서가 직접 럭스 값을 제공하기 때문에 LUX 값을 측정하기위한 계산이 필요하지 않다. 실제로는 빛이 닿는 양에 따라 강도를 측정한다. 2.4V~3.6V의 전압 범위에서 작동하며 0.12mA의 매우 작은 전류를 소비한다.
BH1750의 하드웨어는 매우 간단하다. 주요 구성 요소는 BH1750FVI IC이다. 이 모듈은 3.3V에서 작동하므로 전압 조정기가 사용됩니다. I2C 라인의 경우 4.7K의 풀업 저항이 사용된다.
BH1750에서 I2C 버스를 통해 럭스 값을 얻는다. IC의 ADC는 아날로그 조도를 디지털 럭스 값으로 변환한다. 이제 이 데이터는 I2C 핀 SCL 및 SDA를 사용하여 마이크로 컨트롤러로 전송된다. SCL은 클럭 펄스를 제공하는 데 사용되며 SDA는 럭스 값을 전송하는 데 사용된다. IC는 사람의 눈과 동일한 응답을 제공하는 포토 다이오드를 사용한다. IC의 내부 로직 클럭에 사용되는 IC 내부 발진기도 있다.
♣ 광속의 단위luminous flux : lm(루멘) 광원으로부터 나오는 모든 빛(가시광)의 총량을 나타낸다. - 1 lm은 초 하나를 켜두고 1미터 떨어져서 느낄 수 있는 빛의 양 ♣ 조도의 단위IIluminance : lx 또는 lux(룩스) 조도는 빛 밝기의 정도, 대상면에 비춰지는 빛의 양을 나타낸다. 1 lx란 1㎡의 면적 위에 1lm의 광속이 균일하게 비춰질 때를 말한다. - 1 lx는 촛불 1개의 조도 ♣ 광도의 단위luminous intensity : cd(칸데라) 광도는 방향성을 가지는 빛의 세기(빛의 강도)의 양을 나타내며, 즉, 광원으로부터 어떤 방향으로 얼마만큼의 빛이 방출되는지를 나타낸다. - 백열 전구 40w = 40 cd ♣ 휘도의 단위luminance : cd/㎡, nt(니트) 어떤 방향으로부터 본 물체의 밝기를 휘도라 한다. 눈부심의 정도, 대상면에서 반사되는 빛의 양이다. |
♣ 광합성광량자속밀도 Photosynthetic photon flux density : PPFD umol/m2/s 단위를 쓰며, 초당 면적에 가해지는 광자량으로 식물이 느끼의 빛의 세기를 나타낸다. ♣ 광포화점light saturation point 아무리 빛을 주더라도 식물이 받아들일 수 있는 한계값. 광량이 강해질수록 생육 속도가 급격해지다가 일정 지점에서 더디어지는 시점의 빛의 양 이산화탄소, 온도 등도 이와 같은 현상을 보인다. ♣ 광보상점light compensation point 식물이 생장하기 위해 요구되는 초소한의 빛의 양. 이산화탄소의 흡수량과 방출량이 같아져서 식물체가 외부 공기 중에서 실질적으로 흡수하는 인사화탄소의 양이 0이 되는 빛의 강도 |
BH1750 센서 구입하기
[BH1750 센서]는 알리익스프레스, 네이버 쇼핑몰, 아마존 등에서 센서를 구입할 수 있다
BH1750 하드웨어 연결
다음과 같이 BH1750 아두이노 센서를 연결할 수 있다.
BH1750 핀 구성
핀 번호 | 핀 이름 | 설명 |
1 | VCC | 모듈의 전원 공급은 2.4V ~ 3.6V 일 수 있으며 일반적으로 3.0V가 사용된다. |
2 | GND | 회로의 접지에 연결된 모듈의 접지 |
삼 | SCL | I2C 통신을 위한 클럭 펄스를 제공하는 데 사용되는 직렬 클럭 라인 |
4 | SDA | I2C 통신을 통해 데이터를 전송하는 데 사용되는 직렬 데이터 주소 |
5 | 주소 | 두 개 이상의 모듈이 연결된 경우 주소를 선택하는 데 사용되는 장치 주소 핀 |
I2C 버스 인터페이스를 사용하기 때문에 전원, SCL, SDA 신호선만 연결하면 된다. 참고로 ADDR 핀을 아무것도 연결하지 않거나 GND에 연결하고 I2C 스캐너를 돌리면, I2C 주소가 0x23으로 나오며, ADDR를 +5V로 연결하면 0x5C로 나온다.
BH1750 소프트웨어 코딩
하드웨어 연결이 완료되면, 아두이노 IDE를 이용해 아두이노 센서 소스코드를 코딩할 수 있다.
센서 코드는 다음과 같다.
/**
Arduino BH1750 Digital Light Sensor
@ 모두의 아두이노 환경 센서 (Arduino Sensors for Everyone)
https://book.naver.com/bookdb/book_detail.nhn?bid=18030644
@ author STEAMEDU123 <steamedu123@gmail.com>
*/
#include <Wire.h>
#include <BH1750.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
BH1750 LightSensor;
void setup(void) {
lcd.begin(16, 2);
initBH1750Sensor();
}
void loop(void) {
uint16_t lux = LightSensor.readLightLevel();
displayLCD(lux);
delay(1000);
}
void initBH1750Sensor() {
Wire.begin();
LightSensor.begin();
}
void displayLCD(uint16_t lux) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("BH1750 Sensor");
lcd.setCursor(0, 1);
lcd.print("Light: ");
lcd.print(lux);
lcd.print(" lux");
}
BH1750 센서 동작확인
하드웨어 연결, 소프트웨어 코딩이 완료되면 다음과 같이 동작 화면을 확인할 수 있다.
------------------------------------------------------
개발환경 : WINDOWS 10
아두이노 IDE : 1.8.13
------------------------------------------------------
01 연결
- 아두이노와 PC 연결
- 아두이노 IDE 실행
- 메뉴 → 툴 → 보드:아두이노 UNO 확인
- 메뉴 → 스케치 → 확인/컴파일
02 컴파일 확인
스케치>확인/컴파일(CTRL+R) 를 선택해서 컴파일을 진행한다.
만약 컴파일 에러가 발생한다면 라이브러리를 설치한다.
03 아두이노 우노 업로드
컴파일이 이상없이 완료되면 스케치>업로드(CTRL+U) 를 선택해서 컴파일 파일을 업로드 한다.
04 동작 확인
다음과 같이 동작을 확인할 수 있다.
BH1750 센서 모드변경
센서는 다음과 같이 모드를 변경할 수 있다.
BH1750_CONTINUOUS_HIGH_RES_MODE 분해능이 1 Lux인 연속 측정 모드
BH1750_CONTINUOUS_HIGH_RES_MODE_2 분해능이 0.5 Lux인 연속 측정 모드
BH1750_CONTINUOUS_LOW_RES_MODE 분해능이 4 Lux인 연속 측정 모드
BH1750_ONE_TIME_HIGH_RES_MODE 분해능이 1 Lux인 한번 측정 모드
BH1750_ONE_TIME_HIGH_RES_MODE_2 분해능이 0.5 Lux인 한번 측정 모드
BH1750_ONE_TIME_LOW_RES_MODE 분해능이 4 Lux인 한번 측정 모드
BH1750 조도 센서에는 연속 측정 모드와 한번만 측정하고 파워 다운 모드로 빠지는 모드로 크게 둘로 나뉘고 각각의 모드에서도 측정을 보다 정밀하게 하거나 낮게 하는 3 단계의 정밀 측정 모드가 있습니다. 보다 정밀하게 측정하려면 측정 대기 시간이 길어지고 낮은 분해능(resolution)으로 측정 하면 보다 빠르게 측정할 수 있다.
분해능을 0.5lx 모드로 측정을 하면 값이 1lx 모드로 측정한 값보다 2배 높게 나온다.
분해능을 4lx(Lux) 모드로 측정하면 값이 1lx 모드로 측정한 값보다 4배 작게 나오는 것이 아니라 값이 같게 나온다.
/**
Arduino BH1750 Digital Light Sensor
@ 모두의 아두이노 환경 센서 (Arduino Sensors for Everyone)
https://book.naver.com/bookdb/book_detail.nhn?bid=18030644
@ author STEAMEDU123 <steamedu123@gmail.com>
*/
#include <Wire.h>
#include <BH1750.h>
#include <LiquidCrystal.h>
#define BTN_RIGHT 0
#define BTN_UP 1
#define BTN_DOWN 2
#define BTN_LEFT 3
#define BTN_SELECT 4
#define BTN_NONE 5
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
BH1750 LightSensor(0x23);
void setup(void) {
lcd.begin(16, 2);
initBH1750Sensor();
}
void loop(void) {
uint16_t lux = LightSensor.readLightLevel();
int lcd_key = read_LCD_buttons();
setLightMeterMode(lcd_key);
displayLCD(lux);
delay(1000);
}
void initBH1750Sensor() {
Wire.begin();
}
int read_LCD_buttons()
{
int adc_key_in = analogRead(0);
if (adc_key_in > 1000) return;
if (adc_key_in < 50) return BTN_RIGHT; // 0
if (adc_key_in < 195) return BTN_UP; // 99
if (adc_key_in < 380) return BTN_DOWN; // 256
if (adc_key_in < 555) return BTN_LEFT; // 409
if (adc_key_in < 790) return BTN_SELECT; // 639
return BTN_NONE;
}
void setLightMeterMode(int lcd_key) {
lcd.clear();
lcd.setCursor(0, 0);
switch (lcd_key) {
case BTN_SELECT:
LightSensor.begin(BH1750::CONTINUOUS_HIGH_RES_MODE);
lcd.print("CONTINUOUS HIGH");
break;
case BTN_LEFT:
LightSensor.begin(BH1750::CONTINUOUS_HIGH_RES_MODE_2);
lcd.print("CONTINUOUS HIGH2");
break;
case BTN_UP:
LightSensor.begin(BH1750::CONTINUOUS_LOW_RES_MODE);
lcd.print("CONTINUOUS LOW");
break;
case BTN_DOWN:
LightSensor.begin(BH1750::ONE_TIME_HIGH_RES_MODE);
lcd.print("ONETIME HIGH");
break;
case BTN_RIGHT:
LightSensor.begin(BH1750::ONE_TIME_HIGH_RES_MODE_2);
lcd.print("ONETIME HIGH 2");
break;
case BTN_NONE:
lcd.print("NONE");
break;
}
}
void displayLCD(uint16_t lux) {
lcd.setCursor(0, 1);
lcd.print("Light: ");
lcd.print(lux);
lcd.print(" lux");
}
마무리
아두이노와 센서를 연결하고, 간단한 코딩으로 센서를 쉽게 실습할 수 있다.
모두의 아두이노 환경 센서 책
[모두의 아두이노 환경 센서] 책은 예스24, 인터넷 교보문고, 알라딘, 인터파크도서, 영풍문고, 반디앤루니스 , 도서11번가 등에서 구입할 수 있다. 이 책에서는 PMS7003, GP2Y1010AU0F, PPD42NS, SDS011 미세먼지 센서, DHT22 온습도 센서, MH-Z19B 이산화탄소 센서, ZE08-CH2O 포름알데히드 센서, CCS811 총휘발성유기화합물 TVOC, GDK101 방사선(감마선) 센서, MQ-131 오존(O3) 센서, MQ-7 일산화탄소, MICS-4514 이산화질소 센서, MICS-6814 암모니아 센서, DGS-SO2 아황산가스(SO2) 센서, BME280 기압 센서, GUVA-S12SD 자외선(UV) 센서, MD0550 기류 센서, QS-FS01 풍속 센서(Wind speed) 를 사용한다.
'모두의 아두이노 센서 > 아두이노 센서 (불)' 카테고리의 다른 글
GYML8511 아두이노 UV 센서 (0) | 2021.05.19 |
---|---|
KY-026 아두이노 불꽃 센서 (LCD16X2 키패드실드) (0) | 2021.05.19 |
Grove Si1145 자외선 UV IR 가시광 센서 (LCD16X2 키패드실드) (0) | 2021.05.19 |
ML8511 (SEN0175) 아두이노 UV 센서 (LCD16X2 키패드실드) (0) | 2021.05.19 |
TSL2561 아두이노 조도 센서 (LCD16X2 키패드실드) (0) | 2021.05.19 |
KY-018 아두이노 조도 센서 (LCD16X2 키패드실드) (0) | 2021.05.16 |
댓글