디지털 조도 센서 – 윈도우 10 IoT Core로 주변광에 따라 LED 제어하기
이 윈도우 10 IoT Core 프로젝트는 디지털 조도 센서의 읽기 값을 기반으로 실시간으로 LED를 구동하는 방법을 보여줍니다. 센서에 연결된 GPIO 핀을 모니터링하기만 하면 빛이 감지되거나 없을 때마다 LED를 토글합니다. 전체 로직이 UI 없는 단일 C# 파일에 들어있어 코드가 가볍고 빠른 프로토타이핑에 이상적입니다.
프로젝트 개요
목표는 간단합니다: 주변광이 있으면 LED가 켜지고, 빛이 사라지면 LED가 꺼집니다. 모든 로직이 단일 C# 파일에 UI 없이 처리되어 코드가 가볍고 빠른 프로토타이핑에 이상적입니다.
프로젝트 결과 데모 (이미지 플레이스홀더)
보드 설정
아래는 배선도입니다. 코드에서 해당 핀 번호를 업데이트하는 한 핀 번호는 자유롭게 조정 가능합니다.
- 디지털 조도 센서 → GPIO #5
- 적색 LED → GPIO #12
내가 좋아하는 부분: 코딩!
이 애플리케이션은 전체 로직을 담은 단일 페이지만 포함해 프로젝트를 가볍게 유지합니다.
1단계: UWP 프로젝트 생성
- Visual Studio 2017 또는 2015 열기.
- Blank App (Universal Windows) 선택.
- 프로젝트 이름을 DigitalLightSensorApp으로 설정.
2단계: 로직 구현
MainPage.xaml.cs를 열고 기존 using 지시문을 다음으로 교체:
using Windows.UI.Xaml.Controls;
using Windows.Devices.Gpio;
센서와 LED GPIO 핀 멤버 선언:
private GpioPin _sensorPin;
private GpioPin _ledPin;
GPIO 핀 번호 정의:
private int _sensorGpioPinNumber = 5;
private int _ledGpioPinNumber = 12;
핀을 열고 모드를 설정하는 초기화 루틴 생성:
private void Initialize() {
var gpioController = GpioController.GetDefault();
// 센서 – 입력
_sensorPin = gpioController.OpenPin(_sensorGpioPinNumber);
_sensorPin.SetDriveMode(GpioPinDriveMode.Input);
_sensorPin.ValueChanged += HandleSensorLightDetectionChange;
// LED – 출력
_ledPin = gpioController.OpenPin(_ledGpioPinNumber);
_ledPin.SetDriveMode(GpioPinDriveMode.Output);
// 초기 상태
HandleLightStatus();
}
센서 변경에 응답:
private void HandleSensorLightDetectionChange(GpioPin sender, GpioPinValueChangedEventArgs args) {
HandleLightStatus();
}
센서 읽기 값에 따라 LED 토글. 높은 값은 어둠, 낮은 값은 빛이 있음을 의미:
private void HandleLightStatus() {
if (_sensorPin.Read() == GpioPinValue.High) {
_ledPin.Write(GpioPinValue.Low); // LED 끄기
} else {
_ledPin.Write(GpioPinValue.High); // LED 켜기
}
}
InitializeComponent() 후 페이지 생성자에 Initialize 호출 배치:
public MainPage() {
this.InitializeComponent();
Initialize();
}
전체 소스 코드
using Windows.UI.Xaml.Controls;
using Windows.Devices.Gpio;
namespace DigitalLightSensorApp {
public sealed partial class MainPage : Page {
private GpioPin _sensorPin;
private GpioPin _ledPin;
private int _sensorGpioPinNumber = 5;
private int _ledGpioPinNumber = 12;
public MainPage() {
this.InitializeComponent();
Initialize();
}
private void Initialize() {
var gpioController = GpioController.GetDefault();
_sensorPin = gpioController.OpenPin(_sensorGpioPinNumber);
_sensorPin.SetDriveMode(GpioPinDriveMode.Input);
_sensorPin.ValueChanged += HandleSensorLightDetectionChange;
_ledPin = gpioController.OpenPin(_ledGpioPinNumber);
_ledPin.SetDriveMode(GpioPinDriveMode.Output);
HandleLightStatus();
}
private void HandleSensorLightDetectionChange(GpioPin sender, GpioPinValueChangedEventArgs args) {
HandleLightStatus();
}
private void HandleLightStatus() {
if (_sensorPin.Read() == GpioPinValue.High) {
_ledPin.Write(GpioPinValue.Low);
} else {
_ledPin.Write(GpioPinValue.High);
}
}
}
}
위 코드는 주변광 변화에 즉각 반응하며 지속적으로 실행됩니다.
자세한 내용은 Digital Light Sensor 문서 참조.