BH1750. I2C 버스를 갖춘 주변광 센서.

BH1750. I2C 버스를 갖춘 주변광 센서.

BH1750. I2C 버스를 갖춘 주변광 센서.

BH1750은 상당히 높은 해상도와 감도를 갖춘 주변 조명 센서입니다. 인간의 눈과 유사한 방식으로 가시광선 앞에서 작동하며 적외선에 영향을 받지 않으며 조명 유형의 색온도에도 의존하지 않습니다. 즉, 자연광과 빛에서 잘 작동합니다. 다양한 종류의 인공 조명. 마이크로컨트롤러와 디지털 방식으로 통신합니다. I2C 버스, 그래서 그것을 읽는 회로로부터 일정한 거리에 배치되면 간섭에 강합니다. 응답 시간은 가장 불리한 상황에서 200ms 미만으로 매우 낮습니다.

목차

    BH1750 주변광 센서

    전자적인 관점에서 보면 구현은 매우 간단합니다. 간단히 전원(2,4V~3,6V 사이)을 연결하고 I2C 버스. 선택적으로 버스 주소를 변경하여 두 장치를 연결할 수 있습니다(낮은 수준의 ADDR은 0B0100011 또는 0x23이고 높은 수준의 ADDR은 0B1011100 또는 0x5C임). VDI 라인은 다음과 같은 재설정 기능에 사용될 수 있습니다. 마이크로 컨트롤러.

    BH1750을 연결하려면 아두 이노, 3,3V 출력으로 전원을 공급받는 것 외에도 레벨 변환기를 사용하는 것이 가장 정확합니다. 풀업 저항기I2C 버스. 구성 요소는 버스에 대한 직접 연결을 지원하지만 I2C 버스 레벨 변환을 고려하지 않고 회로 크기를 결정하는 것은 바람직하지 않습니다.

    BH1750 주변 조명 센서. 응용회로

    정밀도에 비해 매우 저렴하기 때문에 인기가 높기 때문에 처음 사진에서 볼 수 있듯이 잘 알려진 GY-30과 같은 여러 모듈이 있습니다. 마이크로 컨트롤러로 프로토타입을 제작할 때 더 편안하게 연결하기 위해 일반적으로 다음을 위한 레벨 변환기가 포함됩니다. I2C 버스 5V 출력 대신 더 높은 전압(최대 3,3V)으로 전원을 공급하는 전압 조정기 아두 이노.

    BH1750에는 연속 및 개별의 두 가지 읽기 모드가 있으며 이는 활성 및 저전력 또는 절전의 두 가지 상태에 해당합니다. 연속 읽기 모드를 사용하는 경우 BH1750은 샘플링 후에도 활성 상태를 유지하지만 개별 측정을 수행한 후에는 자동으로 절전 및 저전력 모드로 들어갑니다. 연속 모드의 첫 번째 판독에는 최대 180ms가 소요되고 이후 판독에는 분해능에 따라 16ms~120ms가 소요됩니다.

    센서는 4lux, 1lux 및 0,5lux의 간격(해상도)으로 측정할 수 있습니다. BH1750은 데이터 시트에서 1럭스(황혼에 해당) 미만의 조명을 구별할 수 있고 측정에 영향을 미칠 수 있는 노이즈에 더 강한 10럭스의 해상도를 사용할 것을 권장합니다.

    1럭스와 4럭스의 분해능은 16비트 데이터를 사용하여 정수 부분을 나타내므로 최대 65535럭스의 측정이 가능합니다(직사광선이 없는 맑은 날). 0,5lux 모드는 소수 부분에 최하위 비트(0,5lux~0,5lux 측정)를 사용하므로 나머지 15비트로 최대값 32767lux(직사광선이 없는 외부)를 표현할 수 있습니다.

    이론적인 태양광 조도와 BH1750의 평균 용량 비교
    기사를 작성한 장소와 날짜(태양광이 아닌 법적 시간)의 이론적 태양광 조명과 1750lux에서 BH1의 평균 용량

    일반적으로 주변광을 측정하는 광학 창은 전체 가시 스펙트럼에 해당하며 목표는 인간과 비슷한 감도 분포를 달성하는 것입니다. 광학 창이 감소하면(빛은 더 낮은 파장 범위에서 측정됨) 판독 시간을 늘려 광학 창의 영향 조정을 취소하는 모드를 사용하여 BH1750의 감도를 높일 수 있습니다(최대 0,11럭스). 비례하여. 이 특수(특대) 모드에서는 별도의 판독이 수행되므로 측정 조건을 특별히 변경하지 않고 상황에 따라 이를 허용해야 합니다(예를 들어 센서는 매우 안정적으로 유지되어야 하며 조명 조건이 다른 영역으로 이동해서는 안 됩니다).

    BH1750 작업 코드

    에스타
    5>

    • 0B00000000 (0x00) 저전력 또는 유휴 모드.

    • 0B00000001 (0x01) 켜졌습니다.

    • 0B00000111 (0x07) 초기화. BH1750 데이터 로그를 지웁니다.

    해결
    5>

    • 0B00010011 (0x13) 4lux 분해능에서 연속 측정(16ms와 판독 시간 사이)

    • 0B00010000 (0x10) 1lux 분해능에서 연속 측정(판독 시간 120ms)

    • 0B00010001 (0x11) 0,5lux 분해능에서 연속 측정(판독 시간 120ms)

    • 0B00100011 (0x23) 4럭스 분해능에서의 측정(판독 시간 16ms)

    • 0B00100000 (0x20) 1럭스 분해능에서의 측정(판독 시간 120ms)

    • 0B00100001 (0x21) 0,5럭스 분해능에서의 측정(판독 시간 120ms)

    광학창의 변화에 ​​대한 조정
    5>

    • 0B011MT [0,1,2,3,4] MTREG(측정 시간 REGister) 레지스터의 낮은 비트입니다.

    • 0B01000MT [5,6,7] MTREG는 상위 비트를 등록합니다.

    Arduino에서 BH1750 읽기

    BH1750을 사용하여 주변 조명을 측정하려면 아두 이노 도서관이 사용된다 철사 와의 통신을 관리하는 I2C 버스. 프로세스는 이러한 유형의 통신에서 일반적인 프로세스이며, 먼저 다음과 같이 활성화됩니다(프로그램에서 한 번). Wire.begin(), BH1750과의 통신은 다음과 같이 시작됩니다. Wire.beginTransmission() 그리고 당신의 주소 I2C (각각 ADDR이 높은지 낮은지에 따라 0x5C 또는 0x23), 해당 코드를 다음과 같이 전송하여 구성됩니다. Wire.write() 버스는 다음과 같이 출시됩니다. Wire.endTransmission()

    연속 읽기 모드 중 하나를 사용하는 경우 Wire.beginTransmission()을 사용하여 주소가 있는 데이터를 가져옵니다. I2C BH1750에 액세스하려면 16바이트(해상도는 XNUMX비트)를 입력하라는 메시지가 표시됩니다. Wire.requestFrom() 읽은 내용을 사용하여 Wire.read(), 부호 없는 정수로 로드되어 첫 번째 바이트를 8비트씩 회전합니다. 버스는 이후에 출시됩니다. Wire.endTransmission(). 최종 결과는 반환된 값을 정밀도 계수(광학 창이 변경되지 않은 경우 1,2)로 나누어 얻습니다.

    개별 읽기 모드를 사용하는 경우 BH1750은 슬립 모드로 진입하며, 활성 모드로 복귀하려면 구성(동일한 읽기 모드 또는 새로운 모드) 또는 전원 켜기 코드(0x01)를 전송하면 됩니다. 종료 코드(1750x0)는 BH00을 강제로 절전 모드로 전환하는 데 사용할 수 있습니다.

    해상도에 따라 달라지는 센서 판독 시간을 준수하는 것이 중요합니다. 대기 시간이 중요하지 않은 경우 읽기 완료를 보장하기 위해 예상되는 최대값보다 약간 더 큰 모든 사례에 대한 값으로 통합될 수 있습니다.

    BH1750의 코드 작성을 보다 편안하게 만들려면 아두 이노, 가장 관련성이 높은 작업 코드는 다음 헤더 문서에서 찾을 수 있습니다.

    다음 예제 코드는 조도 센서의 가장 일반적인 읽기 모드를 보여줍니다. I2C BH1750. 분해능은 1lux이고 판독 모드는 연속입니다. 예제에서는 직렬 콘솔을 사용하여 보여줍니다. 아두 이노, 측정된 값으로부터 얻은 각 결과.

    위에서 말했듯이 1lux 및 4lux 분해능 모드는 모두 16비트 데이터를 사용하여 측정값을 정수로 표현합니다. 반면, 0,5럭스 모드에서는 마지막 비트가 소수 부분을 나타냅니다. 즉, 전체 측정에 기여하는 값이 1의 거듭제곱만큼 오른쪽으로 이동합니다. 4럭스 또는 XNUMX럭스 모드에서는 마지막 비트(LSB)는 2의 가치가 있습니다0, 두 번째 21, 다음 22...0,5lux 모드에서 마지막 비트(LSB)는 2의 가치가 있습니다-1, 두 번째 20, 다음 21...

    이 데이터 구조에 따르면 두 번의 판독이 수행되어야 한다는 점을 고려하면 I2C 바이트의 16비트 값을 얻으려면 바이트의 가장 중요한 비트, 즉 읽을 첫 번째 비트를 로드하고 8럭스 해상도 모드와 1럭스 해상도 모드에서 왼쪽으로 4비트 회전해야 합니다. 7lux에서는 0,5비트에 불과합니다. 0,5lux 모드에서 읽는 방법을 통일하려면 최상위 바이트를 부호 없는 정수로 로드하고, 왼쪽으로 8비트 회전하고, 최하위 바이트를 로드하고 전체 부호 없는 정수를 왼쪽으로 1비트 회전할 수 있습니다. 나타내는 소수 부분의 값 LSB(최하위 비트) 나중에 적용하려면.

    논리적으로 1럭스 또는 4럭스 모드의 경우 부호 없는 정수를 사용해야 합니다(unsigned int) 무엇을 위해 아두 이노 예약하지 마세요 MSB(최상위 비트) 음수가 아닌 실제 측정값으로 직접 연산을 수행할 수 있습니다. ~ 안에 아두이노 듀 정수는 32비트를 사용하므로 필요하지 않지만 동일한 프로그램도 사용하면 작동합니다. unsigned int.

    다음 코드는 0,5lux 모드가 사용되는 방법을 보여줍니다.

    BH1750 센서 및 Arduino를 사용하여 주변광을 측정하는 예에 대한 문서 다운로드.

    코멘트 남기기

    당신은 놓쳤을 수도 있습니다