대도시에 살면 미세먼지에서 자유로울 수 없죠. 봄이라면 황사의 습격이 두렵기도 하구요. 이럴때 유용하게 사용할 수 있는 센서 되시겠습니다. 먼지센서.

공기질을 측정할 때 사용하는 MQ 시리즈의 센서는 내부의 작은 히터를 이용해서 입자를 태워 원하는 입자의 농도를 측정합니다. 먼지센서는 이것과는 동작형태가 틀립니다. 적외선 송신기, 수신기를 이용해서 미세입자에 의해 반사되는 빛의 양을 측정하는 방식으로 동작합니다.

저렴하게 구매할 수 있는 먼지센서를 뒤져보니 2가지 종류가 보이네요. 둘 다 테스트가 된 상태가 아니라서 어떤 것이 더 좋은지 모르겠습니다. Datasheet 혹은 인터넷 검색을 활용해서 정밀도나 신뢰도에 대한 자료를 확보한 후 구입하세요.

1. Sharp Dust Sensor (GP2Y1010AU0F)

담배연기 같은 미세입자 검출이 가능한 먼지센서입니다. 전류 소모량이 매우 적고(20mA max, 11mA typical) 7V DC 까지의 전원으로 동작이 가능합니다. 먼지의 농도에 따라 비례적으로 아날로그 출력을 내므로 아두이노의 아날로그 핀으로 값을 읽어 사용할 수 있습니다. 0.5V/0.1mg/m3 의 감도를 가지고 있습니다. 출력 전압에 따라 먼지 농도가 아래 그래프와 같이 변합니다.

Output Voltage vs Dust Density

데이터 시트는 다음 링크를 참고하세요 :  GP2Y1010AU0F data sheet

이 센서는 6개의 핀을 가지고 있습니다.

Dust sharpsensor

왼쪽 3개의 핀이 적외선 LED 컨트롤 핀(1~3)이고 오른쪽 3개의 핀이 Signal 출력 핀(4~6)입니다.

1~3번 핀을 연결할 때 아래와 같이 150ohm 저항과 220uF 커패시터를 함께 연결해줘야 합니다. 적외선 LED 를 이용해 계속 값을 측정하는 것이 아니라, 측정이 필요한 순간에 커패시터에 축적된 전류를 방출해서 사용하는 구조 같습니다. 따라서 먼지 농도를 측정할 때 충분한 시간 간격을 두고 사용해야 겠습니다.

sharpExternalCircuit

아두이노에는 아래와 같이 연결합니다.

Sensor Pin Arduino Pin
1 Vled –> 5V (150ohm resistor)
2 LED-GND –> GND
3 LED –> Digital pin 2
4 S-GND –> GND
5 Vo –> Analog pin 0
6 Vcc –> 5V

연결이 완료되면 아래와 같은 모습이 됩니다.

5186110877_d0acd060cf

소스코드는 아래와 같습니다.

int dustPin=0;
float dustVal=0;
float dustDensity = 0;
 
int ledPower=2;
int delayTime=280;
int delayTime2=40;
float offTime=9680;

void setup(){
  Serial.begin(9600);
  pinMode(ledPower,OUTPUT);
  pinMode(4, OUTPUT);
}
 
void loop(){
  // ledPower is any digital pin on the arduino connected to Pin 3 on the sensor
  digitalWrite(ledPower,LOW); // power on the LED
  delayMicroseconds(delayTime);

  dustVal=analogRead(dustPin); // read the dust value via pin 5 on the sensor
  delayMicroseconds(delayTime2);

  digitalWrite(ledPower,HIGH); // turn the LED off
  delayMicroseconds(offTime);
 
  delay(3000);

  dustDensity = 0.17*(dustVal*0.0049)-0.1;
  Serial.print("Dust density(mg/m3) = ")
  Serial.println(dustDensity);
}

소스를보면 적외선 LED Pin을 LOW 상태로 바꾸고 잠시 후 센서값을 측정한 뒤, 다시 HIGH 상태로 바꿔줍니다. 이 부분을 변경하면 값이 잘못 나올 수도 있을듯…

아날로그 핀을 통해 센서에서 값을 읽으면 먼저 voltage 단위로 변환합니다. 그리고 앞서 보여드렸던 그래프와 같이 전압에 해당되는 농도값을 계산합니다.

dustDensity = 0.17*(dustVal*0.0049)-0.1;

관련된 자료를 보면 이 모듈의 정확도, 신뢰도가 그리 높지는 않다는 의견이 있습니다. 그리고 1~6번 핀에 저항과 커패시터 연결이 제대로 되지 않으면 값이 원하는 범위로 나오지 않는다고도 합니다.

그리고 정확한 측정값을 위해 어느정도 보정(Calibration)작업을 해줘야 한다고 하네요. 처음 시스템이 부팅되고 짧은 시간이 지난 시점에 센서의 값을 읽어들여서  기준값으로 사용하는것을 권장합니다. 주변 환경에 따라(온도등..) 측정 오차가 발생할 수 있으므로 이렇게 측정된 초기값을 미리 기억해서 이후 측정값들을 보정해 주라는 의미입니다.

This sensor works similar to optical smoke alarms. The 150R resistor charges up the 220uF cap, the FET discharges the capacitor into the IR emitter and the output from IR diode is read while this high current is flowing. The FET is then turned off and the capacitor is allowed to charge again. Leaving the current flowing through the emitter will not give good results.

The best way to get a result is to measure the voltage just before the current is switched on and then a millisecond after the current is flowing and then subtract one from the other to give a reading. This will offset the ‘dark reading so minimising temperature effects.

2. Dust Sensor (PPD42NS)

b370983e0136653903ce35f027b620dd.image.530x397

앞서 소개한 Shart 먼지 센서는 적외선 LED 핀으로 특정한 신호를 넣어줘야 값을 측정할 수 있는데 이 센서는 인터페이스가 훨씬 간단한 것이 특징입니다. 대신 사용방법(소스코드)이 완전히 틀립니다.

  • Grove compatible interface(extra wire with connecter)
  • Supply voltage range: 5V
  • Minimum detect particle: 1um
  • Detecting particles range: 8000pcs / 283ml
  • PWM output
  • Dimensions: 59(W)x45(H)x22(D) [mm]

설명 상으로는 2개의 output 모드를 지원하고 각 모드는 다른 감도를 가지고 있다고 합니다. 모드를 바꾸는 방법은 아직 자료를 찾지 못했네요. 필요하신분은 구글 검색을 해보셔야 할듯…

일단 연결은 아래와 같이 합니다. 아두이노 디지털 핀으로 연결된 라인을 읽어서 값을 측정할 수 있습니다.

  • JST Pin 1 (Black Wire) => Arduino GND
  • JST Pin 3 (Red wire) => Arduino 5VDC
  • JST Pin 4 (Yellow wire) => Arduino Digital Pin 8

Pin4 의 신호는 보통 HIGH 상태입니다. 이 신호가 PM concentration(Particulate Matters, 입자 농도) 에 비례적으로 LOW로 바뀝니다. 따라서 Lo Pulse Occupancy (LPO, Low 신호가 지속된 시간)를 측정함으로써 PM(=먼지 농도)을 계산 할 수 있습니다.

LPO 시간 측정은 30초 동안 하기를 권장합니다.(30초간 Low 상태가 지속된 시간을 측정함) 만약 해상도를 어느정도 포기할 수 있는 상황이라면 15초간 측정해서 사용하는 것도 가능합니다.

소스코드는 아래를 참고하세요.

/* 
 Grove - Dust Sensor Demo v1.0
 Interface to Shinyei Model PPD42NS Particle Sensor
 Program by Christopher Nafis 
 Written April 2012
 
 http://www.seeedstudio.com/depot/grove-dust-sensor-p-1050.html
 http://www.sca-shinyei.com/pdf/PPD42NS.pdf
 
 JST Pin 1 (Black Wire)  => Arduino GND
 JST Pin 3 (Red wire)    => Arduino 5VDC
 JST Pin 4 (Yellow wire) => Arduino Digital Pin 8
*/

int pin = 8;
unsigned long duration;
unsigned long starttime;
unsigned long sampletime_ms = 30000;//sampe 30s ;
unsigned long lowpulseoccupancy = 0;
float ratio = 0;
float concentration = 0;

void setup() 
{
    Serial.begin(9600);
    pinMode(8,INPUT);
    starttime = millis();//get the current time;
}

void loop() 
{
    duration = pulseIn(pin, LOW);
    lowpulseoccupancy = lowpulseoccupancy+duration;

    if ((millis()-starttime) > sampletime_ms)//if the sampel time == 30s
    {
        ratio = lowpulseoccupancy/(sampletime_ms*10.0);  // Integer percentage 0=>100
        concentration = 1.1*pow(ratio,3)-3.8*pow(ratio,2)+520*ratio+0.62; // using spec sheet curve
        Serial.print(lowpulseoccupancy);
        Serial.print(",");
        Serial.print(ratio);
        Serial.print(",");
        Serial.println(concentration);
        lowpulseoccupancy = 0;
        starttime = millis();
    }
}

주의할 점은 측정값의 편차가 심하다는 점입니다. 단순히 측정값 만을 나열하면 아래와 같이 기복이 심한 그래프가 나옵니다. (아래는 24시간동안 센서를 돌려 나온값으로 만든 그래프)

readings-1avg

수집된 값들을 50개씩 묶어서(12.5분간 측정한 자료에 해당) 평균을 내면 아래와 같은 그래프가 됩니다. 먼지 농도의 변화를 파악하기 훨씬 좋은 상태가 됨을 알 수 있습니다.

readings-50avg

센서 사용시 주의할 점

  • 센서 주변의 빛에 의해 적외선 센서가 영향받지 않도록 빛을 차단하는 케이스 필요
  • 센서가 측정하는 공기질에 영향을 주는 바람, 대류현상을 차단하도록 설치
  • PPD42NS 센서의 경우 내부에 작은 히터가 들어가 있습니다. 히터에 의한 상승기류를 이용한 측정장치이므로 히터 부위가 광학부위보다 아래쪽에 위치하도록 설치해야 합니다.

참고자료