본문 바로가기
모두의 아두이노 센서/아두이노 센서 (불)

BH1750 아두이노 조도 센서 (LCD16X2 키패드실드)

by 로니킴 2021. 5. 17.


본 절은 [BH1750] 아두이노 센서를 사용하기 위해 알아야 할 내용과 실습 방법에 대해 설명한다. 아두이노 센서의 특징, 동작원리, 사양, 연결 핀 배열, 출력 값, 주의사항을 알아본다. 아두이노와 센서를 연결하고, 간단한 코딩으로 센서를 쉽게 실습할 수 있다. 

 

목차

     

     

     


     

    BH1750 아두이노 조도 센서 (LCD16X2 키패드실드)

     

     

     

     

     


    BH1750 센서란?

    BH1750 센서는 조도센서이다. 16비트의 분해능력을 가지고 있으며, IIC통신을 지원한다. 수집 된 빛의 강도 데이터에 따라 LCD 및 키보드의 배경 조명등을 조정할 수 있다 .또한 분해능으로 다양한 광량 변화를 감지 할 수 있다.

     

     

    BH1750.pdf
    0.54MB

     

     

    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) 를 사용한다.  

     

    모두의 아두이노 환경 센서

    아두이노와 센서로 내 건강을 지킬 수 있다!다양한 환경 센서를 실생활 프로젝트에 응용해보자!시중에 판매되고 있는 간이측정기도 센서로 값을 측정합니다. 똑같은 센서를 아두이노에 연결하

    book.naver.com

     

     

     

     



    댓글