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.
GP2Y1010AU0F.cpp@0:f4e3a6f03b9c, 2018-01-31 (annotated)
- Committer:
- amateusz
- Date:
- Wed Jan 31 11:55:20 2018 +0000
- Revision:
- 0:f4e3a6f03b9c
inital and final commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
amateusz | 0:f4e3a6f03b9c | 1 | #include "mbed.h" |
amateusz | 0:f4e3a6f03b9c | 2 | |
amateusz | 0:f4e3a6f03b9c | 3 | class GP2Y1010AU0F |
amateusz | 0:f4e3a6f03b9c | 4 | { |
amateusz | 0:f4e3a6f03b9c | 5 | public: |
amateusz | 0:f4e3a6f03b9c | 6 | GP2Y1010AU0F(PinName aout, PinName iled): _iled(iled), _aout(aout), _aout_at_no_dust(0.7) { |
amateusz | 0:f4e3a6f03b9c | 7 | }; |
amateusz | 0:f4e3a6f03b9c | 8 | |
amateusz | 0:f4e3a6f03b9c | 9 | void measure() { |
amateusz | 0:f4e3a6f03b9c | 10 | _measurement_ready = false; |
amateusz | 0:f4e3a6f03b9c | 11 | _measure(); |
amateusz | 0:f4e3a6f03b9c | 12 | }; |
amateusz | 0:f4e3a6f03b9c | 13 | |
amateusz | 0:f4e3a6f03b9c | 14 | bool getVoltage(float & value) { |
amateusz | 0:f4e3a6f03b9c | 15 | if (_measurement_ready == false) return NULL; |
amateusz | 0:f4e3a6f03b9c | 16 | else { |
amateusz | 0:f4e3a6f03b9c | 17 | float dust_density = 0; |
amateusz | 0:f4e3a6f03b9c | 18 | dust_density = ((float)_last_measurement)/(65535.0f/3.3f/9.25f); |
amateusz | 0:f4e3a6f03b9c | 19 | value = dust_density; |
amateusz | 0:f4e3a6f03b9c | 20 | return true; |
amateusz | 0:f4e3a6f03b9c | 21 | } |
amateusz | 0:f4e3a6f03b9c | 22 | }; // ug / m^3 |
amateusz | 0:f4e3a6f03b9c | 23 | |
amateusz | 0:f4e3a6f03b9c | 24 | float convertVoltageToMg(float voltage) { |
amateusz | 0:f4e3a6f03b9c | 25 | voltage -= _aout_at_no_dust; // [V] from 0 |
amateusz | 0:f4e3a6f03b9c | 26 | voltage /= _dust_sensitivity; // [0.1mg] == [100ug] / m^3 |
amateusz | 0:f4e3a6f03b9c | 27 | voltage *= 100.0f; |
amateusz | 0:f4e3a6f03b9c | 28 | return voltage; |
amateusz | 0:f4e3a6f03b9c | 29 | } |
amateusz | 0:f4e3a6f03b9c | 30 | |
amateusz | 0:f4e3a6f03b9c | 31 | void tryTosetAoutAtNoDust(float newNoDustVoltage) { |
amateusz | 0:f4e3a6f03b9c | 32 | if (newNoDustVoltage < _aout_at_no_dust) |
amateusz | 0:f4e3a6f03b9c | 33 | _aout_at_no_dust = (newNoDustVoltage + 5*_aout_at_no_dust) / 6; |
amateusz | 0:f4e3a6f03b9c | 34 | // printf("Aout at no dust: %.3f\r\n", _aout_at_no_dust); |
amateusz | 0:f4e3a6f03b9c | 35 | } |
amateusz | 0:f4e3a6f03b9c | 36 | |
amateusz | 0:f4e3a6f03b9c | 37 | float getAoutAtNoDust() { |
amateusz | 0:f4e3a6f03b9c | 38 | return _aout_at_no_dust; |
amateusz | 0:f4e3a6f03b9c | 39 | } |
amateusz | 0:f4e3a6f03b9c | 40 | |
amateusz | 0:f4e3a6f03b9c | 41 | private: |
amateusz | 0:f4e3a6f03b9c | 42 | AnalogIn _aout; |
amateusz | 0:f4e3a6f03b9c | 43 | DigitalOut _iled; |
amateusz | 0:f4e3a6f03b9c | 44 | Timeout _turnILEDOffTimeout; |
amateusz | 0:f4e3a6f03b9c | 45 | Timeout _sampleAOUTTimeout; |
amateusz | 0:f4e3a6f03b9c | 46 | Timeout _measurementReadyTimeout; |
amateusz | 0:f4e3a6f03b9c | 47 | unsigned short _last_measurement; |
amateusz | 0:f4e3a6f03b9c | 48 | bool _measurement_ready; |
amateusz | 0:f4e3a6f03b9c | 49 | static const float _dust_sensitivity = 0.5; // [V] / [mg/m^3] |
amateusz | 0:f4e3a6f03b9c | 50 | float _aout_at_no_dust; // [V] ? |
amateusz | 0:f4e3a6f03b9c | 51 | |
amateusz | 0:f4e3a6f03b9c | 52 | void _measure() { |
amateusz | 0:f4e3a6f03b9c | 53 | _sampleAOUTTimeout.attach(callback(this, &GP2Y1010AU0F::_sampleAOUT), .00028); |
amateusz | 0:f4e3a6f03b9c | 54 | _turnILEDOffTimeout.attach(callback(this, &GP2Y1010AU0F::_turnILEDOff), .00032); |
amateusz | 0:f4e3a6f03b9c | 55 | _measurementReadyTimeout.attach(callback(this, &GP2Y1010AU0F::_ready), .037); |
amateusz | 0:f4e3a6f03b9c | 56 | |
amateusz | 0:f4e3a6f03b9c | 57 | _turnILEDOn(); |
amateusz | 0:f4e3a6f03b9c | 58 | }; |
amateusz | 0:f4e3a6f03b9c | 59 | void _turnILEDOn() { |
amateusz | 0:f4e3a6f03b9c | 60 | _iled.write(1); |
amateusz | 0:f4e3a6f03b9c | 61 | // pc.printf("O"); |
amateusz | 0:f4e3a6f03b9c | 62 | }; |
amateusz | 0:f4e3a6f03b9c | 63 | void _turnILEDOff() { |
amateusz | 0:f4e3a6f03b9c | 64 | _iled.write(0); |
amateusz | 0:f4e3a6f03b9c | 65 | |
amateusz | 0:f4e3a6f03b9c | 66 | // pc.printf("C\r\n"); |
amateusz | 0:f4e3a6f03b9c | 67 | }; |
amateusz | 0:f4e3a6f03b9c | 68 | void _sampleAOUT() { |
amateusz | 0:f4e3a6f03b9c | 69 | _last_measurement = _aout.read_u16(); |
amateusz | 0:f4e3a6f03b9c | 70 | // pc.printf("S"); |
amateusz | 0:f4e3a6f03b9c | 71 | }; |
amateusz | 0:f4e3a6f03b9c | 72 | void _ready() { |
amateusz | 0:f4e3a6f03b9c | 73 | _measurement_ready = true; |
amateusz | 0:f4e3a6f03b9c | 74 | }; |
amateusz | 0:f4e3a6f03b9c | 75 | }; |