본 문서는 GP2Y1010AU0F, GP2Y1014AU0F 등의 광학식 먼지 센서 라이브러리의 사용방법에 관하여 기술합니다.

이론적 배경

센서의 작동원리

광학식 먼지 센서는 중앙에 뚫린 구멍 내부에서 빛을 투과시켜 빛의 산란량 측정한다.

적외선 LED를 켜서 먼지를 비추고, 반대편에 있는 적외선 수신 소자가 먼지로 인해 산란하는 빛의 양을 측정한다.

센서 및 라이브러리의 작동방법

여기서는 GP2Y1014AU0F를 기준으로 설명하겠다.

데이터 시트를 살펴보면 아래와 같은 그래프를 볼 수 있다.

aruino-optical-fine-dust-sensor/1.png” data-lightbox=”falcon9-large” data-title=”Check out the Falcon 9 from < <” »SpaceX”> <” ><” <” »SpaceX”>

이는 적외선 LED를 켠 뒤에 얼마나 기다리고 값을 읽어야 하는지(samplingTime)를 알려주는 그래프이다.

또한, 아래와 같은 그래프도 볼 수 있을 것이다.

aruino-optical-fine-dust-sensor/2.png” data-lightbox=”falcon9-large” data-title=”Check out the Falcon 9 from

<” »SpaceX”> <” ><” <” »SpaceX”>

이는 적외선 LED를 점멸하는 길이를 나타낸 것으로 데이터를 읽고 얼마 뒤에 LED를 꺼야 하는지(deltaTime), LED를 끈 뒤에 얼마나 기다려야 하는지(sleepTime)을 알려준다.

마지막으로, 아래와 같은 표도 확인할 수 있다.

aruino-optical-fine-dust-sensor/3.png” data-lightbox=”falcon9-large” data-title=”Check out the Falcon 9 from < <” »SpaceX”> <” ><” <” »SpaceX”>

위의 그래프에 따르면 먼지가 없을 때의 출력전압(voc)이 얼마인지, 0.1mg당 전압의 상승폭(sensitivity)이 얼마인지를 알 수 있다.

센서를 아두이노 보드에 연결하는 방법

데이터 시트를 다시 살펴보면 아래와 같은 그림을 확인할 수 있다.

aruino-optical-fine-dust-sensor/4.png” data-lightbox=”falcon9-large” data-title=”Check out the Falcon 9 from SpaceX”>

aruino-optical-fine-dust-sensor/5.png” data-lightbox=”falcon9-large” data-title=”Check out the Falcon 9 from SpaceX”>

위의 두 그림을 참고하여 회로를 구성하고, 센서의 LED 핀을 아두이노의 디지털 핀(D2)에, 센서의 VO 핀을 아두이노의 아날로그 핀(A0)에 연결한다.

테스트 코드 작성 (예제)

아래의 코드에 대한 제언

먼지가 없을 때의 출력전압은 먼지를 가라앉히거나 공기청정기를 활용하여 직접 측정하는 것이 가장 정확하지만 본 문서에서는 데이터 시트의 자료를 바탕으로 이야기하도록 한다.

인스턴스에 넘겨줄 값

데이터 시트에 따라 아래와 같은 값을 라이브러리의 객체에 넘겨줘야 한다는 사실을 알 수 있다.

  • ledPin = D2 = 2
  • sensorPin = A0 = 0
  • samplingTime = 0.28ms = 280μs
  • deltaTime = 0.32ms-0.28ms = 0.4ms = 400μs
  • sleepTime = 10ms-0.32ms = 9.68ms = 9680μs
  • voc = 0.9v
  • sensitivity = 0.5v/(0.1mg/m3) = 0.005v/(μg/m3)

라이브러리 사용법

먼지 센서 객체 생성 방법

  • 함수 원형
Opticalfine-dustSensor(int ledPin, int sensorPin);
  • 사용
Opticalfine-dustSensor dSensor(2, 0);

센서 설정 방법

  • 함수 원형
void Setting(float samplingTime, float deltaTime, float sleepTime, float voc, float sensitivity);
  • 사용
dSensor.Setting(280, 40, 9680, 0.9, 0.0005);

공기중 먼지 밀도 측정 방법

  • 함수 원형
float ReadValue();
  • 사용
dSensor.ReadValue();

예제의 소스 코드

/*
  version : v1.0.0-alpha

  MIT License

  Copyright (c) 2019 nulLeeKH 

  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files (the "Software"), to deal
  in the Software without restriction, including without limitation the rights
  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  copies of the Software, and to permit persons to whom the Software is
  furnished to do so, subject to the following conditions:

  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.

  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  SOFTWARE.
*/

#include <OpticalDustSensor.h>

OpticalDustSensor dSensor(2, 0);
//Create dustsensor object to get data from dustsensor
//Attach the dustsensor on D2 to LED and A0 to Vo

float dustDensity;

void setup() {
  Serial.begin(9600);
  //Start serial communication with 9600 bitrate
  
  dSensor.Setting(280, 40, 9680, 0.9, 0.0005);
  //Set measuring time for sensor (Use GP2Y1010AU0F)
}

void loop() {
  dustDensity = dSensor.ReadValue();
  //Get data from dustsensor
  
  Serial.println(dustDensity);
  //Print dust density value received from the sensor into the serial
  
  delay(1000);
  //Get data every 1 seconds
}