#define GET_DUST_VOLTAGE_INTV 200 // >= 10 msec #define AVG_DUST_VOLTAGE_QCNT 30 #define DUST_CLEAN_VOLTAGE 0.44 // Voc, 추후 보정기능 추가 필요 //BrickBoard_MP01 dustSensor(PC); int dustVoutPin = A0; int iredControlPin = 2; int qVoutReadValue[AVG_DUST_VOLTAGE_QCNT]; int qIdx = 0; float dustDensity = 0; unsigned long sumVoutReadValue; unsigned long avgVoutReadValue; unsigned long prevMillisOfVoutReadValue = 0; unsigned long prevMillisOfDisplay = 0; /* references : http://www.iamamaker.kr/ko/tutorials/arduino/%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8-%EB%AF%B8%EC%84%B8%EB%A8%BC%EC%A7%80-%EC%84%BC%EC%84%9Cgp2y1010au0f-%EC%BD%94%EB%94%A9%ED%95%98%EA%B8%B0/ */ void setup() { Serial.begin(9600); /*digital output:*/ pinMode(iredControlPin, OUTPUT); /*analog input:*/ pinMode(dustVoutPin, INPUT); } void loop() { float dustVout = getAvgDustVoltage(); //display if (millis() - prevMillisOfDisplay >= 500) { prevMillisOfDisplay = millis(); if (dustVout > DUST_CLEAN_VOLTAGE) { dustDensity = (dustVout - DUST_CLEAN_VOLTAGE) / 0.005; } else { dustDensity = 0; } Serial.print("Dust Voultage="); Serial.print(dustVout); Serial.print("[v]"); Serial.print(" / Dust Density="); Serial.print(dustDensity); Serial.print("[ug/m3]"); if(dustDensity<31){ Serial.println(" => [Great(~30)]"); } else if(dustDensity>30 && dustDensity<81){ Serial.println(" => [Good(31~80)]"); } else if(dustDensity>81 && dustDensity<151){ Serial.println(" => [Bad(81~150)]"); } else{ Serial.println(" => [Too Bad(151~)]"); } } } float getAvgDustVoltage() { sumVoutReadValue = 0; if (millis() - prevMillisOfVoutReadValue >= GET_DUST_VOLTAGE_INTV) { prevMillisOfVoutReadValue = millis(); digitalWrite(iredControlPin, LOW); delayMicroseconds(280); qVoutReadValue[qIdx] = analogRead(dustVoutPin); delayMicroseconds(40); digitalWrite(iredControlPin, HIGH); qIdx = (qIdx + 1) % AVG_DUST_VOLTAGE_QCNT; for (int i = 0; i < AVG_DUST_VOLTAGE_QCNT; i++) { sumVoutReadValue = sumVoutReadValue + qVoutReadValue[i]; } avgVoutReadValue = sumVoutReadValue / AVG_DUST_VOLTAGE_QCNT; } return (float)(avgVoutReadValue * (5.0 / 1024.0)); }