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
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 };
Generated on Fri Jul 15 2022 02:07:20 by 1.7.2