///////////////////////////////////////////////////////////////////////////// // Sharp GP2Y1014AU0F Dust Sensor Demo // // Board Connection: // GP2Y1014 Arduino // V-LED Between R1 and C1 // LED-GND C1 and GND // LED Pin 7 // S-GND GND // Vo A5 // Vcc 5V // // Serial monitor setting: // 9600 baud ///////////////////////////////////////////////////////////////////////////// #include "MegunoLink.h" //Including Library for data plotting visualization TimePlot MyPlot; // Choose program options. //#define PRINT_RAW_DATA #define USE_AVG // Arduino pin numbers. const int sharpLEDPin = 7; // Arduino digital pin 7 connect to sensor LED. const int sharpVoPin = A5; // Arduino analog pin 5 connect to sensor Vo. // For averaging last N raw voltage readings. #ifdef USE_AVG #define N 100 static unsigned long VoRawTotal = 0; static int VoRawCount = 0; #endif // USE_AVG // Set the typical output voltage in Volts when there is zero dust. static float Voc = 0.6; // Use the typical sensitivity in units of V per 100ug/m3. const float K = 0.5; ///////////////////////////////////////////////////////////////////////////// // Helper functions to print a data value to the serial monitor. void printValue(String text, unsigned int value, bool isLast = false) { Serial.print(text); Serial.print("="); Serial.print(value); if (!isLast) { Serial.print(", "); } } void printFValue(String text, float value, String units, bool isLast = false) { Serial.print(text); Serial.print("="); Serial.print(value); Serial.print(units); if (!isLast) { Serial.print(", "); } } ///////////////////////////////////////////////////////////////////////////// // Arduino setup function. void setup() { // Set LED pin for output. pinMode(sharpLEDPin, OUTPUT); // Start the hardware serial port for the serial monitor. Serial.begin(9600); // Wait two seconds for startup. delay(2000); Serial.println(""); Serial.println("GP2Y1014AU0F Demo"); Serial.println("================="); } // Arduino main loop. void loop() { // Turn on the dust sensor LED by setting digital pin LOW. digitalWrite(sharpLEDPin, LOW); // Wait 0.28ms before taking a reading of the output voltage as per spec. delayMicroseconds(280); // Record the output voltage. This operation takes around 100 microseconds. int VoRaw = analogRead(sharpVoPin); // Turn the dust sensor LED off by setting digital pin HIGH. digitalWrite(sharpLEDPin, HIGH); // Wait for remainder of the 10ms cycle = 10000 - 280 - 100 microseconds. delayMicroseconds(9620); // Print raw voltage value (number from 0 to 1023). #ifdef PRINT_RAW_DATA printValue("VoRaw", VoRaw, true); Serial.println(""); #endif // PRINT_RAW_DATA // Use averaging if needed. float Vo = VoRaw; #ifdef USE_AVG VoRawTotal += VoRaw; VoRawCount++; if ( VoRawCount >= N ) { Vo = 1.0 * VoRawTotal / N; VoRawCount = 0; VoRawTotal = 0; } else { return; } #endif // USE_AVG // Compute the output voltage in Volts. Vo = Vo / 1024.0 * 5.0; printFValue("Vo", Vo*1000.0, "mV"); // Convert to Dust Density in units of ug/m3. float dV = Vo - Voc; if ( dV < 0 ) { dV = 0; Voc = Vo; } float dustDensity = dV / K * 100.0; printFValue("DustDensity", dustDensity, "ug/m3", true); Serial.println(""); Serial.println(dustDensity); if (dustDensity >= 4) { MyPlot.SendData("Dust Sensor", dustDensity, Plot::Red, Plot::Solid, 3, Plot::Circle); } else if ((dustDensity >=3) && (dustDensity < 4)) { MyPlot.SendData("Dust Sensor", dustDensity, Plot::Yellow, Plot::Solid, 3, Plot::Circle); } else { MyPlot.SendData("Dust Sensor", dustDensity, Plot::Green, Plot::Solid, 3, Plot::Circle); } delay(1000); } // END PROGRAM