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

Committer:
amateusz
Date:
Wed Jan 31 11:55:20 2018 +0000
Revision:
0:f4e3a6f03b9c
inital and final commit

Who changed what in which revision?

UserRevisionLine numberNew 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 };