본문 바로가기
모두의 아두이노

[아두이노][센서] 실시간 측정! BH1750과 LCD로 환경 모니터링 만들기

by 로니킴 2024. 11. 16.


이 프로젝트는 아두이노와 BH1750 조도 센서를 활용하여 초보자도 쉽게 따라 할 수 있도록 구성되었습니다. 단계별 설명을 통해 하드웨어 연결부터 소프트웨어 코딩, 동작 확인까지 모든 과정을 다룹니다. 이제 아두이노 세계로 한 걸음 나아가 보세요!

 

목차

     

     

     


    [아두이노][조도 센서] 실시간 측정! BH1750과 LCD로 환경 모니터링 만들기

     

    BH1750 조도 센서를 사용한 프로젝트는 간단하면서도 실용적인 조도 측정 시스템을 구축할 수 있는 훌륭한 시작점입니다. 이 프로젝트는 I2C 프로토콜을 활용하여 아두이노와 센서를 연결하고, 측정된 조도 데이터를 LCD 화면에 실시간으로 표시하는 방법을 다룹니다. 센서의 높은 정밀도와 간단한 구성 덕분에 초보자도 쉽게 따라할 수 있으며, 스마트 홈 조명 제어, 환경 모니터링, 데이터 로깅과 같은 다양한 응용 분야로 확장할 수 있습니다.

    이번 프로젝트를 통해 I2C 통신의 기본 개념과 실용적인 활용법을 익힐 수 있었으며, LCD 출력과 데이터를 시각적으로 표시하는 방법도 배우게 됩니다. 이를 기반으로 추가 센서를 결합하거나 데이터를 원격으로 전송하는 고급 프로젝트로 발전시킬 수 있습니다.

     

     

     


     

    1. BH1750 조도센서란?

     

    BH1750 조도센서는 주변 광원의 밝기를 정밀하게 측정하여 디지털 데이터로 변환하는 16비트 I2C 기반 센서입니다. 1 lux에서 최대 65,535 lux까지의 넓은 측정 범위를 지원하며, 스마트폰 백라이트, 자동 조명, 환경 감지와 같은 분야에서 활용됩니다. 사람의 눈과 유사한 스펙트럼 반응을 갖고 있어 실제 환경에서 조명을 보다 정확히 측정할 수 있습니다. 백열등, 형광등, LED와 같은 다양한 광원에서도 안정적으로 작동하며, 외부 광원의 영향을 최소화합니다. 또한 파워 다운 모드를 통해 저전력 소모를 실현해 배터리 구동 환경에서도 유용합니다. 추가적인 외부 부품 없이 설계 가능하며, 소형 구조로 제한된 공간에서도 쉽게 통합할 수 있습니다. 1.8V 논리 입력을 지원해 다양한 전압 환경에서 안정적으로 작동합니다. 이 센서는 LCD 디스플레이 밝기 제어, 디지털 카메라 조명 측정과 같은 광범위한 프로젝트에 적용 가능합니다. BH1750은 아두이노와 같은 마이크로컨트롤러와 쉽게 연동되어 초보자와 전문가 모두에게 적합한 선택입니다.


     

    BH1750은 ROHM Semiconductor에서 제작한 디지털 방식의 고정밀 조도 센서로, I2C 인터페이스를 통해 주변 조도의 정확한 값을 측정할 수 있습니다. 이 센서는 1 lux에서 최대 65,535 lux까지의 넓은 측정 범위를 제공하며, LCD 백라이트 조정, 스마트폰 화면 밝기 조절, 자동 조명 시스템 등 다양한 응용 분야에 활용됩니다. 또한, 사람의 눈이 인지하는 빛에 가까운 스펙트럼 반응을 가지고 있어 조명 조건의 변화를 정밀하게 측정할 수 있습니다.

    BH1750의 주요 특징

    1. 광범위한 조도 측정: 1 lux에서 최대 65,535 lux까지 측정 가능.
    2. 정밀한 스펙트럼 반응: 사람의 눈 감각에 가까운 반응.
    3. I2C 통신 지원: 빠르고 간단한 데이터 송수신.
    4. 저전력 소모: 파워 다운 기능을 통한 에너지 절약.
    5. 외부 광원의 영향 감소: 백열등, 형광등, LED 등 다양한 광원에서도 안정적 측정.
    6. 소형 설계: 외부 부품이 불필요해 공간 절약 가능.
    7. 내장 ADC: 광 다이오드에서 얻은 신호를 디지털 데이터로 변환.

    주요 활용 분야

    • 모바일 기기의 백라이트 자동 조정
    • 스마트 홈 조명 시스템
    • 카메라와 디지털 기기
    • LCD 디스플레이 조명 제어
    • 환경 감지 시스템

    BH1750은 소형 설계와 정밀한 조도 측정 기능 덕분에 공간이 제한된 환경에서도 쉽게 통합될 수 있는 유용한 센서입니다. 또한, 3.3V와 5V 전원 공급을 모두 지원하여 다양한 전압 수준에서도 안정적인 동작이 가능합니다.


     

     

    2. BH1750의 동작 원리

     

    BH1750은 광 다이오드(PD)**와 ADC(아날로그-디지털 변환기)를 통해 광 신호를 디지털 데이터로 변환합니다. 초기 전원 공급 시 센서는 "Power Down" 모드로 진입하며, I2C 명령어로 활성화됩니다. H-Resolution Mode는 높은 해상도(1 lux)를 제공하며, 120ms의 측정 시간을 소요합니다. 반면, L-Resolution Mode는 빠른 측정을 위해 해상도를 4 lux로 낮추고, 약 16ms만에 데이터를 제공합니다. 조도 값은 16비트 디지털 데이터로 변환되며, ±20%의 정확도로 전달됩니다. 데이터는 I2C를 통해 SDA(데이터 라인)와 SCL(클록 라인)으로 전송됩니다. 센서는 0x23 또는 0x5C의 슬레이브 주소를 사용해 간단히 명령을 처리합니다. 또한 50Hz/60Hz 노이즈 제거 기능이 포함되어 정확한 값을 측정합니다. 어두운 환경에서도 측정 가능한 H-Resolution Mode2는 최소 0.11 lux까지 감지할 수 있습니다. BH1750은 효율적이고 정밀한 설계로 다양한 조명 환경에서 신뢰할 수 있는 성능을 제공합니다.


    BH1750의 작동 원리는 광 다이오드(PD)와 ADC(아날로그-디지털 변환기)를 기반으로 합니다. 주변의 빛 강도를 감지한 후 이를 전압 신호로 변환하고, 내장 ADC를 통해 디지털 신호로 변환하여 아두이노와 같은 마이크로컨트롤러로 전송합니다.

    동작 과정

    1. 파워 온: 센서는 초기 상태에서 전원 공급 시 "Power Down" 상태로 진입.
    2. 측정 명령: I2C 명령어를 통해 측정 모드 설정.
    3. 측정 및 데이터 전송:
      • H-Resolution Mode: 1 lux의 해상도로 측정, 약 120ms 소요.
      • L-Resolution Mode: 4 lux의 해상도로 빠르게 측정, 약 16ms 소요.
    4. 데이터 변환: 조도 값은 16비트 디지털 데이터로 제공되며, 측정값의 정확도는 ±20%의 범위에서 보장됩니다.

     

    측정 모드 설명

    • H-Resolution Mode:
      • 정밀한 조도 측정 (1 lux 해상도).
      • 어두운 환경(10 lux 이하)에서 적합.
      • 노이즈 감소 기능 포함 (50Hz/60Hz).
    • L-Resolution Mode:
      • 빠른 측정을 위해 설계 (4 lux 해상도).
      • 측정 주기 단축 (약 16ms).
    • Power Down Mode: 전력 소모를 최소화하며, 필요 시 I2C 명령어로 재활성화 가능.

     

    I2C 인터페이스

    BH1750은 7비트 슬레이브 주소(0x23 또는 0x5C)를 사용하며, 명령어를 통해 다양한 측정 모드를 설정할 수 있습니다. I2C 통신은 SDA(데이터 전송)와 SCL(클록 신호) 라인을 통해 이루어지며, 명령 전송 및 데이터 수신은 간단한 타이밍 시퀀스를 따릅니다.

     

    실제 동작 예시

    1. I2C 명령 전송: "Continuous H-Resolution Mode"를 활성화.
    2. 데이터 수신: 약 120ms 후 고해상도의 16비트 데이터 값을 수신.
    3. 값 계산: 수신된 데이터는 실제 조도 값(lux)으로 변환됩니다.
      • 계산 예: 데이터 값이 0x1388이라면, 실제 조도 값은 약 5000 lux입니다.

    BH1750의 고해상도 측정 기능과 I2C 통신 방식은 센서의 응용 가능성을 높이며, 환경의 빛 강도를 정밀하게 감지하고, 디지털화하여 다양한 프로젝트에 활용할 수 있도록 설계되었습니다.


     

     

    3. 구입하기

    BH1750 조도센서는 다양한 온라인 쇼핑몰에서 손쉽게 구입할 수 있으며, 가격은 약 5,000원에서 10,000원 사이로 형성되어 있습니다. 알리익스프레스와 같은 해외 사이트에서는 약 $2~$5로 구매 가능하지만, 배송 기간이 길고 추가 배송비가 부과될 수 있습니다.

     

    구입 시 I2C 인터페이스를 지원하는 모델인지 확인해야 하며, 정품 여부와 판매처의 신뢰도를 검토하는 것이 중요합니다. 초보자라면 국내 쇼핑몰에서 구매하여 빠른 배송과 제품 보증을 받는 것이 추천됩니다. 또한, 데이터시트와 기본 회로 설명이 포함된 패키지를 선택하면 프로젝트 진행에 큰 도움이 될 수 있습니다. 마지막으로, PCB 연결 단자가 완전히 납땜된 모듈 형태인지 확인해 설치와 사용을 간소화할 수 있도록 선택하세요.

     


     

     

     

    4. 하드웨어 연결하기

     

    이번 단계에서는 BH1750 조도센서를 아두이노와 LCD 쉴드를 활용해 조도 값을 시각적으로 표시하는 방법을 설명합니다. 연결 시 BH1750은 I2C 프로토콜을 통해 데이터를 전송하며, LCD 쉴드는 아두이노에 직접 장착되어 간단하게 통합됩니다.

     


    하드웨어 연결 방법

    1. 하드웨어 연결 방법
      1. 아두이노와 LCD 키패드 쉴드 연결:
        • LCD 키패드 쉴드는 아두이노 우노 보드 위에 직접 장착됩니다. 이때, LCD는 아두이노의 디지털 핀 4, 5, 6, 7, 8, 9번을 사용하며, 키패드는 아날로그 A0 핀을 통해 입력을 받습니다.
      2. BH1750 조도 센서와 아두이노 연결:
        • 아두이노 A4 (SDA) 핀 → BH1750의 SDA
        • 아두이노 A5 (SCL) 핀 → BH1750의 SCL
        • 아두이노 5V 핀 → BH1750의 VCC
        • 아두이노 GND 핀 → BH1750의 GND
        BH1750은 I2C 통신을 사용하므로, 아두이노의 A4, A5 핀을 통해 연결됩니다. 이때, LCD 키패드 쉴드와 BH1750 센서 모두 I2C 통신을 사용하므로, 두 장치의 I2C 주소가 충돌하지 않도록 주의해야 합니다.

    연결 시 고려 사항

    • I2C 주소 확인: BH1750 센서의 기본 I2C 주소는 0x23이며, LCD 키패드 쉴드의 I2C 주소와 충돌하지 않는지 확인해야 합니다. 만약 주소가 충돌한다면, BH1750 센서의 ADDR 핀을 통해 주소를 변경할 수 있습니다.
    • 전원 공급: BH1750 센서는 3.3V 또는 5V 전원을 사용할 수 있으므로, 아두이노의 5V 핀을 통해 전원을 공급합니다. LCD 키패드 쉴드도 아두이노를 통해 전원을 공급받으므로, 전원 공급에 문제가 없도록 확인해야 합니다.
    • 배선 정리: I2C 통신 라인(SDA, SCL)과 전원 라인(VCC, GND)을 깔끔하게 정리하여 신호 간섭을 최소화합니다. 특히, I2C 통신 라인은 풀업 저항이 필요할 수 있으므로, 모듈에 내장된 저항이 있는지 확인하거나 외부에 4.7kΩ 저항을 추가로 연결합니다.

    완료 후 예상 동작

    LCD 쉴드의 화면에 BH1750으로 측정한 주변 조도가 lux 단위로 실시간 표시됩니다. 예를 들어, 조명을 강하게 비추면 조도 값이 증가하고, 어두운 환경에서는 감소하는 변화를 LCD를 통해 확인할 수 있습니다. 이 연결 구성은 조명 자동화 시스템이나 환경 측정을 위한 프로젝트에 이상적인 시작점이 됩니다.


     

     

     

    5. 소프트웨어 코딩하기

     

     센서를 제어하기 위한 소프트웨어 준비 과정은 다음과 같은 단계로 이루어집니다


    1. 코드 설명

    01 연결

    - 아두이노와 PC 연결

    - 아두이노 IDE 실행

    - 메뉴 → 툴 → 보드:아두이노 UNO 확인

    - 메뉴 → 스케치 → 확인/컴파일

     

    02 컴파일 확인

    스케치>확인/컴파일(CTRL+R) 를 선택해서 컴파일을 진행합니다.

     

    03 아두이노 우노 업로드

    컴파일이 이상없이 완료되면 스케치>업로드(CTRL+U) 를 선택해서 컴파일 파일을 업로드 합니다.

     

    04 동작 확인

    센서의 동작을 확인할 수 있습니다.

     


    2. 코드 설명

    a. 초기 설정 및 LCD 초기화

    BH1750 센서와 LCD를 초기화합니다. LCD의 초기 화면에 "Initializing..." 메시지를 표시하여 준비 상태를 사용자에게 알립니다. 이 초기화 단계는 아두이노 보드의 전원이 켜질 때 한 번 실행되며, LCD는 16x2 크기로 설정됩니다. 초기화가 완료되면 LCD 화면은 지워지고 센서 데이터가 출력될 준비를 합니다.

    b. 센서 데이터 측정 및 변환

    BH1750 센서를 통해 주변 조도 데이터를 읽습니다. 조도 값은 lux 단위로 반환되며, 읽은 값을 저장하여 LCD에 표시합니다. 데이터는 1초 간격으로 갱신되며, 주변 광량에 따라 실시간으로 변합니다. 이 과정에서 센서가 측정한 값은 I2C 통신을 통해 아두이노로 전달됩니다.

    c. LCD 화면에 조도 상태 표시

    LCD 화면은 두 줄로 구성되어 있습니다. 첫 번째 줄에는 **"BH1750 Sensor"**라는 제목을 표시하고, 두 번째 줄에는 측정된 조도 값과 단위("lux")가 출력됩니다. 예를 들어, 조도가 밝을 때는 "Light: 1200 lux"가 표시되고, 어두운 환경에서는 "Light: 50 lux"로 출력됩니다.

    이 과정을 통해 사용자는 주변 조도 상태를 실시간으로 확인할 수 있으며, 이는 조명 자동화 시스템 또는 환경 모니터링 프로젝트에서 유용하게 활용됩니다.

     

    // 필요한 라이브러리 불러오기
    #include <Wire.h>             // I2C 통신 라이브러리
    #include <BH1750.h>           // BH1750 센서 제어 라이브러리
    #include <LiquidCrystal.h>    // LCD 제어 라이브러리
    
    // LCD 핀 정의 (RS, EN, D4, D5, D6, D7)
    LiquidCrystal lcd(8, 9, 4, 5, 6, 7); 
    
    // BH1750 센서 객체 생성
    BH1750 lightSensor;
    
    // 함수 선언
    void setupLCD();
    void setupBH1750();
    void displayLightLevel(uint16_t lightLevel);
    
    void setup() {
      setupLCD();       // LCD 초기화
      setupBH1750();    // BH1750 초기화
    }
    
    void loop() {
      uint16_t lux = lightSensor.readLightLevel(); // 조도 값 읽기
      displayLightLevel(lux);                      // 조도 값 LCD에 출력
      delay(1000);                                 // 1초 대기
    }
    
    // LCD 초기화 함수
    void setupLCD() {
      lcd.begin(16, 2);                           // LCD 크기 설정 (16x2)
      lcd.print("Initializing...");               // 초기화 메시지 출력
      delay(1000);                                // 초기화 지연
      lcd.clear();                                // 화면 초기화
    }
    
    // BH1750 초기화 함수
    void setupBH1750() {
      Wire.begin();                               // I2C 통신 시작
      lightSensor.begin();                        // BH1750 시작
    }
    
    // 조도 값 출력 함수
    void displayLightLevel(uint16_t lightLevel) {
      lcd.clear();                                // LCD 화면 초기화
      lcd.setCursor(0, 0);                        // 첫 번째 줄로 이동
      lcd.print("BH1750 Sensor");                 // 제목 출력
      lcd.setCursor(0, 1);                        // 두 번째 줄로 이동
      lcd.print("Light: ");                       // "Light:" 출력
      lcd.print(lightLevel);                      // 조도 값 출력
      lcd.print(" lux");                          // 단위 출력
    }

    코드 흐름

    1. setup 함수: LCD와 BH1750을 초기화합니다.
    2. loop 함수: 조도 값을 읽고 LCD에 표시한 뒤, 1초마다 갱신합니다.
    3. 개별 함수: LCD 초기화(setupLCD), BH1750 초기화(setupBH1750), 조도 값 표시(displayLightLevel)로 구성되어 있습니다.

    이 코드는 유지보수와 확장성이 뛰어나며, 초보자도 쉽게 사용할 수 있는 구조입니다.

     

    예시: BH1750 조도 측정 및 LCD 출력

    초기 LCD 화면 출력 예시

    1. 아두이노를 실행하면 LCD에 아래와 같이 초기 메시지가 표시됩니다:
      Initializing...
    2. 1초 후 초기화가 완료되면 화면이 지워지고 조도 값이 실시간으로 표시됩니다:
    BH1750 Sensor
    Light: 450 lux

     

    조도 값 변화 시 출력 예시

    • 밝은 환경에서 조도 값이 증가:
       
      BH1750 Sensor
      Light: 1200 lux
    • 어두운 환경에서 조도 값이 감소:
       
      BH1750 Sensor
      Light: 50 lux
    • 매우 어두운 환경에서:
       
      BH1750 Sensor
      Light: 5 lux

    LCD 화면은 실시간으로 갱신되며, 주변 광량에 따라 표시되는 값이 변화합니다. 이를 통해 환경 변화에 따른 조도를 직관적으로 확인할 수 있습니다.


     

     

    6. 동작 확인

     

    BH1750 조도 센서와 LCD 쉴드를 연결한 후, 올바르게 작동하는지 확인하려면 아래 단계를 따라야 합니다.

     


    1. 하드웨어 상태 확인

    1. 아두이노와 BH1750, LCD 쉴드 간의 모든 연결이 올바른지 점검합니다.
      • BH1750의 SDASCL 핀이 아두이노의 A4, A5 핀에 정확히 연결되었는지 확인합니다.
      • LCD 쉴드가 아두이노 보드 위에 정확히 장착되어 있는지 점검합니다.
    2. 전원이 정상적으로 공급되고 있는지 확인합니다. 아두이노의 전원 LED가 켜져 있어야 합니다.

    2. 소프트웨어 업로드 및 테스트

    1. 코드 업로드: 아두이노 IDE를 열고, BH1750과 LCD를 제어하는 코드를 업로드합니다.
    2. 초기화 메시지 확인: LCD 화면에 "Initializing..." 메시지가 표시되었다가 1초 후 지워지면 초기화가 완료된 것입니다.
    3. 조도 값 확인: LCD에 실시간 조도 값이 표시됩니다. 예를 들어:
      • 밝은 조명 아래에서는 **"Light: 1200 lux"**가 출력됩니다.
      • 어두운 환경에서는 **"Light: 30 lux"**와 같은 낮은 값이 표시됩니다.

    3. 동작 테스트

    1. 손전등이나 조명을 사용해 센서 가까이에서 광량을 조절합니다.
      • 밝기를 증가시키면 LCD에 표시되는 값이 증가해야 합니다.
      • 어둡게 하면 값이 감소하는지 확인합니다.
    2. 아두이노 IDE의 시리얼 모니터를 열어 조도 값을 출력하도록 코드를 수정한 경우, 시리얼 모니터에서도 동일한 값이 표시되는지 비교합니다.

    4. 문제 해결

    • 조도 값이 일정하게 표시되지 않는 경우:
      • I2C 연결 상태를 확인합니다(SDA와 SCL 핀 연결).
      • BH1750 라이브러리가 제대로 설치되었는지 점검합니다.
    • LCD 화면이 동작하지 않는 경우:
      • LCD 핀 설정이 올바른지 확인합니다.
      • 전원이 충분히 공급되고 있는지 점검합니다.

    BH1750 센서가 올바르게 작동하면 주변 조도의 변화를 실시간으로 LCD에 확인할 수 있습니다.


     

     

    7. 마무리

     

    BH1750 조도 센서와 LCD 쉴드를 활용한 프로젝트는 주변 조도의 변화를 실시간으로 모니터링할 수 있는 유용한 경험을 제공합니다. 이 과정에서 I2C 통신의 기본 원리와 센서 데이터를 LCD에 출력하는 방법을 익힐 수 있었습니다. 조도 값을 lux 단위로 정확히 측정하고, 이를 LCD 화면에 직관적으로 표시하여 환경 조명 제어 프로젝트에 실질적인 응용 가능성을 확인했습니다.

     

    이 프로젝트는 다양한 조명 제어 응용 프로그램으로 확장 가능합니다. 예를 들어, 특정 조도 이하에서 자동으로 조명을 켜거나, 스마트 홈 시스템과 연동하여 에너지 효율을 최적화할 수 있습니다. 또한, 측정 데이터를 시리얼 모니터를 통해 저장하거나, 블루투스를 활용해 스마트폰으로 전송하는 등 다양한 기능을 추가할 수 있습니다.

    더 나아가, 온도 및 습도 센서를 추가하여 조도와 함께 환경 데이터를 종합적으로 분석하는 시스템으로 발전시킬 수도 있습니다. 이번 프로젝트는 아두이노와 센서를 활용한 데이터 측정과 출력의 기초를 탄탄히 다질 수 있는 좋은 출발점이었습니다.

    반응형


    댓글