햇빛이나 조명이 강한 곳에서 휴대 전화를 가져 가면 조명 조건에 따라 자동으로 밝기를 조정합니다. 오늘날 대부분의 디스플레이 장치는 TV이든 휴대폰이든 관계없이 내부에 주변 광 센서가있어 밝기를 자동으로 조정합니다. 오늘이 튜토리얼에서는 이러한 센서 BH1750 광 센서 모듈을 사용하여 Arduino 와 인터페이스하고 16x2 LCD를 통해 Lux 값을 보여줍니다.
BH1750 디지털 광 센서 모듈 소개
BH1750는 A는 디지털 주변 광 센서 나 조도 센서 자동으로 사용할 수 있습니다, 휴대폰, LCD 디스플레이에서 디스플레이의 밝기를 조정하거나 야외 조명 조건에 따라 자동차의 헤드 라이트 온 / 오프를 켭니다.
센서는 I 2 C 직렬 통신 프로토콜을 사용하므로 마이크로 컨트롤러와 함께 사용하기가 더 쉽습니다. I2C 통신의 경우 SDI 및 SDA 핀이 있습니다. BH1750 주변 광 센서 의 핀아웃 은 다음과 같습니다.
이 센서의 출력은 LUX (lx)이므로 추가 계산이 필요하지 않습니다. Lux는 빛의 강도를 측정하는 단위입니다. 특정 영역에 비추는 빛의 양에 따라 강도를 측정합니다. 1 럭스는 평방 미터당 1 루멘과 같습니다.
이 센서는 2.4V ~ 3.6V (일반적으로 3.0V)의 전압에서 작동하며 0.12mA의 전류를 소비 합니다. 이 센서는 넓은 범위와 고해상도 (1-65535lx)를 가지고 있으며 측정 편차도 작습니다 (약 +/- 20 %). 외부 구성 요소없이 독립적으로 작동 할 수도 있습니다.
LDR 센서는 조명 조건에 따라 장치를 제어하는데도 사용할 수 있지만 정확하지는 않습니다. 우리는 LDR 센서를 사용하여 많은 조명 제어 애플리케이션을 구축했습니다.
- LDR을 사용한 Arduino 광 센서 회로
- LDR 및 555 타이머 IC를 사용하는 다크 검출기
- 빛을 감지하는 간단한 LDR 회로
- RGB LED와 LDR을 사용한 Arduino Color Mixing Lamp
Arduino
BH1750 Light 센서와 Arduino 를 연결하는 회로도 는 아래와 같습니다.
BH1750의 I2C 통신 핀 SDA 및 SCL은 I 2 C 통신을 위해 각각 Arduino 핀 A4 및 A5에 연결됩니다. 센서의 작동 전압은 3.3v이므로 BH1750의 VCC 및 GND는 Arduino의 3.3V 및 GND에 연결됩니다. LCD의 경우 데이터 핀 (D4-D7)은 Arduino의 디지털 핀 D2-D5에 연결되고 RS 및 EN 핀은 Arduino의 D6 및 D7에 연결됩니다. LCD의 V0은 포트에 연결되고 10k 포트는 LCD의 밝기를 제어하는 데 사용됩니다.
BH1750 광 센서 인터페이스를위한 Arduino 프로그래밍
이 LUX 센서를 Arduino와 함께 사용하기위한 프로그래밍 부분 은 매우 쉽습니다. 이 센서에 사용할 수있는 라이브러리가 있지만 그것 없이도 사용할 수 있습니다.
먼저 LCD 및 I 2 C 프로토콜 용 헤더 파일 을 포함했습니다.
#포함
에서 설정 기능, 우리는 모두 LCD와 센서를 초기화하고 LCD에 오프닝 메시지를 인쇄했습니다.
void setup () { Wire.begin (); lcd.begin (16,2); lcd.print ("BH1750 Light"); lcd.setCursor (0,1); lcd.print ("강도 센서"); 지연 (2000); }
여기서 BH1750_Read 및 BH1750_Init 함수 는 각각 Lux 값을 읽고 쓰는 데 사용됩니다. Wire.beginTransmission () 함수는 전송을 시작하는 데 사용되며 Wire.requestFrom (어드레스 2) 함수는 2 레지스터의 개수를 나타내는 레지스터를 판독하는 데 사용된다.
추가로 Wire.endTransmission () 을 사용하여 전송을 종료하고 Wire.write () 함수를 사용하여 해당 레지스터의 주소를 입력하여 원하는 레지스터로 이동합니다.
int BH1750_Read (int 주소) { int i = 0; Wire.beginTransmission (주소); Wire.requestFrom (주소, 2); while (Wire.available ()) { buff = Wire.read (); i ++; } Wire.endTransmission (); 반환 i; } void BH1750_Init (int address) { Wire.beginTransmission (address); Wire.write (0x10); Wire.endTransmission (); }
에서 루프 기능, 우리는 LCD를 통해 실시간 럭스 값을 인쇄. 먼저 BH1750_Read 함수 의 반환 값을 2와 비교 한 다음 2와 같으면 Lux 값을 인쇄하기 시작합니다. 여기서 BH1750_Read 함수는 레지스터 카운트 값을 반환하고 2 개의 레지스터 만 읽고 있기 때문에 값은 2와 비교됩니다. 따라서 2에 도달하면 프로그램은 광도의 LUX 값을 인쇄하기 시작합니다.
그런 다음 공식을 사용하여 두 레지스터에서 값을 가져와 측정 정확도 인 1.2로 나눕니다.
void loop () { int i; uint16_t 값 = 0; BH1750_Init (BH1750 주소); 지연 (200); if (2 == BH1750_Read (BH1750address)) { value = ((buff << 8) -buff) /1.2; lcd.clear (); lcd.print ("LUX의 강도"); lcd.setCursor (6,1); lcd.print (값); } 지연 (150); }
마지막으로 Arduino의 전원을 켜고 프로그램을 Arduino에 업로드하십시오. 프로그램이 업로드 되 자마자 LCD는 LUX 단위로 광도를 표시하기 시작합니다. 아래 비디오에 나와 있는 것처럼 센서 주변의 광도를 변경하여 값을 변경할 수도 있습니다.