테스트를 한 제품은 Waveshare의 Dust Sensor입니다.
먼지센서는 샤프 GP2Y1010AU0F 센서를 사용하였는데,
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 |