본문 바로가기
Study/Arduino

먼지센서(샤프 GP2Y1010AU0F )

by Answer Choi 2019. 4. 12.
반응형

소스코드

 

테스트를 한 제품은 Waveshare의 Dust Sensor입니다.

 

먼지센서는 샤프 GP2Y1010AU0F 센서를 사용하였는데,

 

Wave Share 먼지센서

Wave Share에서 모듈로 다 만들어서 팔고, 소스코드까지 제공하여 사용하기 쉽습니다.

 

스펙은 0.8um이상의 먼지부터 측정가능합니다.

 

데이터시트를 보면 컨트롤부분 I led Pin을 평상시 low에서 0.28ms 동안 High 바꾸면,

 

A out으로 아날로그 값이 출력됩니다. 읽고나면 다시 low로 바꾸면 됩니다.

 

주의 할 점은 이 값은 11배로 나눠진 값이라 읽고난 값은 11배로 곱해줘야 합니다.

 

  digitalWrite(iled, HIGH);
  delayMicroseconds(280);
  adcvalue = analogRead(vout);
  digitalWrite(iled, LOW);
  
  adcvalue = Filter(adcvalue);

제공되는 소스코드를 보시면 0.28ms동안 I led 핀을 low에서 High로 변경하여 

 

ADC값을 읽어줍니다.

 

그리고 마지막 줄에보면 필터링을 하는데,

int Filter(int m)
{
  static int flag_first = 0, _buff[10], sum;
  const int _buff_max = 10;
  int i;
  
  if(flag_first == 0)
  {
    flag_first = 1;

    for(i = 0, sum = 0; i < _buff_max; i++)
    {
      _buff[i] = m;
      sum += _buff[i];
    }
    return m;
  }
  else
  {
    sum -= _buff[0];
    for(i = 0; i < (_buff_max - 1); i++)
    {
      _buff[i] = _buff[i + 1];
    }
    _buff[9] = m;
    sum += _buff[9];
    
    i = sum / 10.0;
    return i;
  }
}

필터링 소스는 int형 버퍼를 만들어서 초기에는 모두 처음값을 저장하고, 

 

다음부터는 하나씩 밀어내면서 평균을 구하는 소스코드입니다.

 

급작스럽게 변화는 값도 평균값으로 어느정도 맞춰주기 위한 용도입니다.

 

 voltage = (SYS_VOLTAGE / 1024.0) * adcvalue * 11;

필터링된 값은 전압값으로 변경해주는데, 처음 가져올때 11로 나눠준값이라 11로 곱해주고,

 

SYS_VOLTAGE값은 mV로 변경하기위해 5000을 넣어줍니다.

 

이제 마지막으로 밀도 값으로 변환하여 줍니다.

 

if(voltage >= NO_DUST_VOLTAGE)
  {
    voltage -= NO_DUST_VOLTAGE;
    
    density = voltage * COV_RATIO;
  }
  else
    density = 0;

NO_DUST_VOLTAGE는 400인데 변환된 전압에서 0.4V를 빼줍니다.

 

물론 0.4V이하는 0으로 처리됩니다.

 

COV_RATIO는 0.2입니다.

 

측정된 값의 기준은 아래 표와 같습니다.

 

실제 측정값입니다.

 

 

반응형

'Study > Arduino' 카테고리의 다른 글

BLDC 모터제어  (1) 2019.07.31
arduino에서 CT로 전류값 읽기  (2) 2019.03.06
4-20mA 센서 Arduino에서 읽기(진동센서)  (12) 2018.09.03
한글 LCD XLINK1602 아두이노에서 사용하기  (0) 2018.07.26
Arduino bootloader 올리기  (20) 2018.07.20

인기글