Share this example!

Share this example with your friends on your favorite profile:

You can easily embed this example to your blog or website by copying the following code:

<iframe style="height: 510px; width: 100%; margin: 10px 0 10px;" allowTransparency="true" src="https://codebender.cc/embed/example/MySensor/DustSensorDSM" frameborder="0"></iframe>


You can also embed the Serial Monitor section! Just use this HTML code.

<iframe style="height: 510px; width: 100%; margin: 10px 0 10px;" allowTransparency="true" src="https://codebender.cc/embed/serialmonitor" frameborder="0"></iframe>



  • 2019-11-17 Blaze Mustang

    Took me an hour to get this code running lol. Here is the fixed version by me:

    // Enable debug prints
    #define MY_DEBUG

    // Enable and select radio type attached
    #define MY_RADIO_RF24
    //#define MY_RADIO_NRF5_ESB
    //#define MY_RADIO_RFM69
    //#define MY_RADIO_RFM95

    #include <mysensors.h>
    #include <spi.h>

    #define CHILD_ID_DUST_PM10 0
    #define CHILD_ID_DUST_PM25 1
    #define DUST_SENSOR_DIGITAL_PIN_PM10 6
    #define DUST_SENSOR_DIGITAL_PIN_PM25 3

    unsigned long SLEEP_TIME = 30*1000; // Sleep time between reads (in milliseconds)
    //VARIABLES
    int val = 0; // variable to store the value coming from the sensor
    float valDUSTPM25 =0.0;
    float lastDUSTPM25 =0.0;
    float valDUSTPM10 =0.0;
    float lastDUSTPM10 =0.0;
    unsigned long duration;
    unsigned long starttime;
    unsigned long endtime;
    unsigned long sampletime_ms = 30000;
    unsigned long lowpulseoccupancy = 0;
    float ratio = 0;
    long concentrationPM25 = 0;
    long concentrationPM10 = 0;

    MyMessage dustMsgPM10(CHILD_ID_DUST_PM10, V_LEVEL);
    MyMessage msgPM10(CHILD_ID_DUST_PM10, V_UNIT_PREFIX);
    MyMessage dustMsgPM25(CHILD_ID_DUST_PM25, V_LEVEL);
    MyMessage msgPM25(CHILD_ID_DUST_PM25, V_UNIT_PREFIX);

    void presentation()
    {

    // Send the sketch version information to the gateway and Controller
    sendSketchInfo("Dust Sensor DSM501", "1.4");

    // Register all sensors to gateway (they will be created as child devices)
    present(CHILD_ID_DUST_PM10, S_DUST);
    send(msgPM10.set("ppm"));
    present(CHILD_ID_DUST_PM25, S_DUST);
    send(msgPM25.set("ppm"));

    pinMode(DUST_SENSOR_DIGITAL_PIN_PM10,INPUT);
    pinMode(DUST_SENSOR_DIGITAL_PIN_PM25,INPUT);

    }

    void loop()
    {

    //get PM 2.5 density of particles over 2.5 μm.
    concentrationPM25=(long)getPM(DUST_SENSOR_DIGITAL_PIN_PM25);
    Serial.print("PM25: ");
    Serial.println(concentrationPM25);
    Serial.print("\n");

    if ((concentrationPM25 != lastDUSTPM25)&&(concentrationPM25>0)) {
    send(dustMsgPM25.set((long)ceil(concentrationPM25)));
    lastDUSTPM25 = ceil(concentrationPM25);
    }
    //get PM 1.0 - density of particles over 1 μm.
    concentrationPM10=getPM(DUST_SENSOR_DIGITAL_PIN_PM10);
    Serial.print("PM10: ");
    Serial.println(concentrationPM10);
    Serial.print("\n");
    //ppmv=mg/m3 * (0.08205*Tmp)/Molecular_mass
    //0.08205 = Universal gas constant in atm·m3/(kmol·K)
    int temp=20; //external temperature, if you can replace this with a DHT11 or better
    long ppmv=(concentrationPM10*0.0283168/100/1000) * (0.08205*temp)/0.01;

    if ((ceil(concentrationPM10) != lastDUSTPM10)&&((long)concentrationPM10>0)) {
    send(dustMsgPM10.set((long)ppmv));
    lastDUSTPM10 = ceil(concentrationPM10);
    }

    //sleep to save on radio
    sleep(SLEEP_TIME);

    }

    long getPM(int DUST_SENSOR_DIGITAL_PIN) {

    starttime = millis();

    while (1) {

    duration = pulseIn(DUST_SENSOR_DIGITAL_PIN, LOW);
    lowpulseoccupancy += duration;
    endtime = millis();

    if ((endtime-starttime) > sampletime_ms)
    {
    ratio = (lowpulseoccupancy-endtime+starttime)/(sampletime_ms*10.0); // Integer percentage 0=>100
    long concentration = 1.1*pow(ratio,3)-3.8*pow(ratio,2)+520*ratio+0.62; // using spec sheet curve
    Serial.print("lowpulseoccupancy:");
    Serial.print(lowpulseoccupancy);
    Serial.print("\n");
    Serial.print("ratio:");
    Serial.print(ratio);
    Serial.print("\n");
    Serial.print("DSM501A:");
    Serial.println(concentration);
    Serial.print("\n");

    lowpulseoccupancy = 0;
    return(concentration);
    }
    }
    }

  • 2016-04-16 codebender

    This example was tested on 2016-06-11 and it failed to compile on common Arduino boards