본문 바로가기
-----ETC-----/C++ 임베디드 시스템 프로그래밍 시리즈

[C++ 임베디드 시스템 프로그래밍 시리즈] Day 11: 조도 센서와 제어

by cogito21_cpp 2024. 8. 1.
반응형

조도 센서의 개요

조도 센서는 주변 환경의 밝기를 측정하여 아날로그 또는 디지털 신호로 출력하는 장치입니다. 임베디드 시스템에서는 조도 센서를 사용하여 조명 제어, 디스플레이 밝기 조절 등의 응용 프로그램에 활용할 수 있습니다. 오늘은 조도 센서를 사용하는 방법을 학습하겠습니다.

1. 조도 센서 종류

조도 센서는 출력 신호 형태에 따라 아날로그 센서와 디지털 센서로 나눌 수 있습니다.

  • 아날로그 조도 센서: LDR(Light Dependent Resistor), TEMT6000 등. 아날로그 전압을 출력하며, 이를 ADC를 통해 읽습니다.
  • 디지털 조도 센서: BH1750, TSL2561 등. 디지털 데이터를 출력하며, I2C 등의 인터페이스를 사용합니다.

2. 아날로그 조도 센서 사용

LDR(Light Dependent Resistor) 조도 센서를 사용하여 아날로그 조도를 측정하는 방법을 살펴보겠습니다.

 

LDR 조도 센서

LDR은 빛의 세기에 따라 저항값이 변하는 특성을 가지며, 이를 통해 주변 밝기를 측정할 수 있습니다.

 

하드웨어 연결

  1. LDR 연결:
    • LDR의 한쪽 끝을 VCC(5V 또는 3.3V)에 연결
    • 다른 쪽 끝을 아날로그 입력 핀(A0)과 풀다운 저항(10kΩ)을 통해 GND에 연결

 

예제: LDR 조도 센서 사용

다음 예제는 LDR 조도 센서를 사용하여 조도를 측정하고, 시리얼 모니터에 출력하는 방법을 보여줍니다.

const int ldrPin = A0; // LDR 핀

void setup() {
    Serial.begin(9600); // 시리얼 통신 시작
}

void loop() {
    int ldrValue = analogRead(ldrPin); // 아날로그 값 읽기
    Serial.print("LDR Value: ");
    Serial.println(ldrValue);
    delay(500); // 0.5초 대기
}

 

위 코드에서는 analogRead 함수를 사용하여 아날로그 입력 핀의 값을 읽고, Serial.println 함수를 사용하여 시리얼 모니터에 출력합니다.

 

3. 디지털 조도 센서 사용

BH1750 디지털 조도 센서를 사용하여 디지털 조도를 측정하는 방법을 살펴보겠습니다.

 

BH1750 조도 센서

BH1750은 I2C 인터페이스를 사용하는 디지털 조도 센서로, 높은 정확도를 제공합니다.

 

하드웨어 연결

  1. BH1750 연결:
    • VCC: 3.3V 또는 5V
    • GND: GND
    • SCL: Arduino A5 (I2C 클럭)
    • SDA: Arduino A4 (I2C 데이터)

 

BH1750 라이브러리 설치

BH1750 라이브러리를 설치하여 아두이노에서 쉽게 사용할 수 있습니다.

  1. Arduino IDE 라이브러리 매니저 열기:
    • Sketch -> Include Library -> Manage Libraries...
  2. 라이브러리 검색 및 설치:
    • BH1750를 검색하고, BH1750 라이브러리를 설치합니다.

 

예제: BH1750 조도 센서 사용

다음 예제는 BH1750 조도 센서를 사용하여 조도를 측정하고, 시리얼 모니터에 출력하는 방법을 보여줍니다.

#include <Wire.h>
#include <BH1750.h>

BH1750 lightMeter;

void setup() {
    Serial.begin(9600); // 시리얼 통신 시작
    Wire.begin();
    lightMeter.begin();
}

void loop() {
    uint16_t lux = lightMeter.readLightLevel(); // 조도 값 읽기
    Serial.print("Light: ");
    Serial.print(lux);
    Serial.println(" lx");
    delay(500); // 0.5초 대기
}

 

위 코드에서는 BH1750 라이브러리를 사용하여 BH1750 조도 센서를 초기화하고, readLightLevel 함수를 사용하여 조도를 읽습니다. 측정된 조도 값은 Serial.println 함수를 사용하여 시리얼 모니터에 출력됩니다.

 

4. 조도 센서를 활용한 제어

조도 센서를 활용하여 LED의 밝기를 자동으로 조절하는 예제를 살펴보겠습니다.

 

예제: 조도에 따라 LED 밝기 조절

다음 예제는 조도 센서를 사용하여 주변 밝기에 따라 LED의 밝기를 조절하는 방법을 보여줍니다.

#include <Wire.h>
#include <BH1750.h>

BH1750 lightMeter;
const int ledPin = 9; // PWM 핀

void setup() {
    Serial.begin(9600); // 시리얼 통신 시작
    Wire.begin();
    lightMeter.begin();
    pinMode(ledPin, OUTPUT);
}

void loop() {
    uint16_t lux = lightMeter.readLightLevel(); // 조도 값 읽기
    Serial.print("Light: ");
    Serial.print(lux);
    Serial.println(" lx");

    int brightness = map(lux, 0, 1000, 0, 255); // 조도 값을 밝기 값으로 매핑
    brightness = constrain(brightness, 0, 255); // 밝기 값을 0-255로 제한
    analogWrite(ledPin, brightness); // LED 밝기 조절

    delay(500); // 0.5초 대기
}

 

위 코드에서는 map 함수를 사용하여 조도 값을 LED 밝기 값으로 매핑하고, analogWrite 함수를 사용하여 LED의 밝기를 조절합니다. 주변 환경이 밝을수록 LED의 밝기가 줄어들고, 어두울수록 LED의 밝기가 증가합니다.

 

마무리

오늘은 조도 센서를 사용하여 주변의 밝기를 측정하고, 이를 제어하는 방법을 학습했습니다. LDR 아날로그 조도 센서와 BH1750 디지털 조도 센서를 사용하여 조도를 측정하고, 측정된 값을 처리하는 방법을 익혔습니다. 다음 날에는 모터 제어(PWM)에 대해 더 깊이 알아보겠습니다.

질문이나 추가적인 피드백이 있으면 언제든지 댓글로 남겨 주세요.

Day 12 예고

다음 날은 "모터 제어 (PWM)"에 대해 다룰 것입니다. PWM을 사용하여 모터의 속도와 방향을 제어하는 방법을 학습하고, 실습 예제를 통해 이해를 돕겠습니다.

반응형