Oh my god this is a crusty piece of air quality sensor. I barely works. It is good only for some major smoke detection, not really pariculte matter. Don't buy it, but if you already did here is a working library for it. Enjoy.

Dependents:   Nucleo_praktyki

GP2Y1010AU0F.cpp

Committer:
amateusz
Date:
2018-01-31
Revision:
0:f4e3a6f03b9c

File content as of revision 0:f4e3a6f03b9c:

#include "mbed.h"

class GP2Y1010AU0F
{
public:
    GP2Y1010AU0F(PinName aout, PinName iled): _iled(iled), _aout(aout),  _aout_at_no_dust(0.7) {
    };

    void measure() {
        _measurement_ready = false;
        _measure();
    };

    bool getVoltage(float & value) {
        if (_measurement_ready == false) return NULL;
        else {
            float dust_density = 0;
            dust_density = ((float)_last_measurement)/(65535.0f/3.3f/9.25f);
            value = dust_density;
            return true;
        }
    }; // ug / m^3

    float convertVoltageToMg(float voltage) {
        voltage -= _aout_at_no_dust; // [V] from 0
        voltage /= _dust_sensitivity; // [0.1mg] == [100ug] / m^3
        voltage *= 100.0f;
        return voltage;
    }

    void tryTosetAoutAtNoDust(float newNoDustVoltage) {
        if (newNoDustVoltage < _aout_at_no_dust)
            _aout_at_no_dust = (newNoDustVoltage + 5*_aout_at_no_dust) / 6;
//        printf("Aout at no dust: %.3f\r\n", _aout_at_no_dust);
    }

    float getAoutAtNoDust() {
        return _aout_at_no_dust;
    }

private:
    AnalogIn _aout;
    DigitalOut _iled;
    Timeout _turnILEDOffTimeout;
    Timeout _sampleAOUTTimeout;
    Timeout _measurementReadyTimeout;
    unsigned short _last_measurement;
    bool _measurement_ready;
    static const float _dust_sensitivity = 0.5; // [V] / [mg/m^3]
    float _aout_at_no_dust; // [V] ?

    void _measure() {
        _sampleAOUTTimeout.attach(callback(this, &GP2Y1010AU0F::_sampleAOUT), .00028);
        _turnILEDOffTimeout.attach(callback(this, &GP2Y1010AU0F::_turnILEDOff), .00032);
        _measurementReadyTimeout.attach(callback(this, &GP2Y1010AU0F::_ready), .037);

        _turnILEDOn();
    };
    void _turnILEDOn() {
        _iled.write(1);
//    pc.printf("O");
    };
    void _turnILEDOff() {
        _iled.write(0);

//    pc.printf("C\r\n");
    };
    void _sampleAOUT() {
        _last_measurement = _aout.read_u16();
//    pc.printf("S");
    };
    void _ready() {
        _measurement_ready = true;
    };
};