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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers GP2Y1010AU0F.cpp Source File

GP2Y1010AU0F.cpp

00001 #include "mbed.h"
00002 
00003 class GP2Y1010AU0F
00004 {
00005 public:
00006     GP2Y1010AU0F(PinName aout, PinName iled): _iled(iled), _aout(aout),  _aout_at_no_dust(0.7) {
00007     };
00008 
00009     void measure() {
00010         _measurement_ready = false;
00011         _measure();
00012     };
00013 
00014     bool getVoltage(float & value) {
00015         if (_measurement_ready == false) return NULL;
00016         else {
00017             float dust_density = 0;
00018             dust_density = ((float)_last_measurement)/(65535.0f/3.3f/9.25f);
00019             value = dust_density;
00020             return true;
00021         }
00022     }; // ug / m^3
00023 
00024     float convertVoltageToMg(float voltage) {
00025         voltage -= _aout_at_no_dust; // [V] from 0
00026         voltage /= _dust_sensitivity; // [0.1mg] == [100ug] / m^3
00027         voltage *= 100.0f;
00028         return voltage;
00029     }
00030 
00031     void tryTosetAoutAtNoDust(float newNoDustVoltage) {
00032         if (newNoDustVoltage < _aout_at_no_dust)
00033             _aout_at_no_dust = (newNoDustVoltage + 5*_aout_at_no_dust) / 6;
00034 //        printf("Aout at no dust: %.3f\r\n", _aout_at_no_dust);
00035     }
00036 
00037     float getAoutAtNoDust() {
00038         return _aout_at_no_dust;
00039     }
00040 
00041 private:
00042     AnalogIn _aout;
00043     DigitalOut _iled;
00044     Timeout _turnILEDOffTimeout;
00045     Timeout _sampleAOUTTimeout;
00046     Timeout _measurementReadyTimeout;
00047     unsigned short _last_measurement;
00048     bool _measurement_ready;
00049     static const float _dust_sensitivity = 0.5; // [V] / [mg/m^3]
00050     float _aout_at_no_dust; // [V] ?
00051 
00052     void _measure() {
00053         _sampleAOUTTimeout.attach(callback(this, &GP2Y1010AU0F::_sampleAOUT), .00028);
00054         _turnILEDOffTimeout.attach(callback(this, &GP2Y1010AU0F::_turnILEDOff), .00032);
00055         _measurementReadyTimeout.attach(callback(this, &GP2Y1010AU0F::_ready), .037);
00056 
00057         _turnILEDOn();
00058     };
00059     void _turnILEDOn() {
00060         _iled.write(1);
00061 //    pc.printf("O");
00062     };
00063     void _turnILEDOff() {
00064         _iled.write(0);
00065 
00066 //    pc.printf("C\r\n");
00067     };
00068     void _sampleAOUT() {
00069         _last_measurement = _aout.read_u16();
00070 //    pc.printf("S");
00071     };
00072     void _ready() {
00073         _measurement_ready = true;
00074     };
00075 };