A library for the MQ2 sensor. Based on https://github.com/labay11 and http://sandboxelectronics.com/?p=165
Dependents: mq2_example mq2_midtermproject ECE595_Group9_FinalProject mq2_example ... more
MQ2.cpp
- Committer:
- azazeal88
- Date:
- 2017-10-05
- Revision:
- 0:a5033edf6975
- Child:
- 2:05d00b8b071d
File content as of revision 0:a5033edf6975:
#include "MQ2.h" void MQ2::begin(){ Ro = MQCalibration(); } /* * Reads data from MQ2. * * Param data: the pointer to fill. */ void MQ2::read(MQ2_data_t *data){ data->lpg = MQGetGasPercentage(MQRead()/Ro,GAS_LPG); data->co = MQGetGasPercentage(MQRead()/Ro,GAS_CO); data->smoke = MQGetGasPercentage(MQRead()/Ro,GAS_SMOKE); } /* * reads data, returns LPG value in ppm */ float MQ2::readLPG(){ return MQGetGasPercentage(MQRead()/10,GAS_LPG); } /* * reads data, returns CO value in ppm */ float MQ2::readCO(){ return MQGetGasPercentage(MQRead()/10,GAS_CO); } /* * reads data, returns Smoke value in ppm */ float MQ2::readSmoke(){ return MQGetGasPercentage(MQRead()/10,GAS_SMOKE); } float MQ2::MQResistanceCalculation(int raw_adc) { return (((float)RL_VALUE*(1023-raw_adc)/raw_adc)); } float MQ2::MQCalibration() { float val=0; for (int i=0;i<CALIBARAION_SAMPLE_TIMES;i++) { //take multiple samples val += MQResistanceCalculation(_pin.read_u16()>>6); wait_ms(CALIBRATION_SAMPLE_INTERVAL); } val = val/CALIBARAION_SAMPLE_TIMES; //calculate the average value val = val/RO_CLEAN_AIR_FACTOR; //divided by RO_CLEAN_AIR_FACTOR yields the Ro //according to the chart in the datasheet return val; } /* * Sample the MQ2 */ float MQ2::MQRead() { int i; float rs=0; int val = _pin.read_u16()>>6; for (i=0;i<READ_SAMPLE_TIMES;i++) { rs += MQResistanceCalculation(val); wait_ms(READ_SAMPLE_INTERVAL); } rs = rs/READ_SAMPLE_TIMES; return rs; } float MQ2::MQGetGasPercentage(float rs_ro_ratio, GasType gas_id) { switch(gas_id) { case GAS_LPG: return MQGetPercentage(rs_ro_ratio,LPGCurve); case GAS_CO: return MQGetPercentage(rs_ro_ratio,COCurve); case GAS_SMOKE: return MQGetPercentage(rs_ro_ratio,SmokeCurve); default: return -1.0; } } int MQ2::MQGetPercentage(float rs_ro_ratio, float *pcurve) { return (pow(10,(((log(rs_ro_ratio)-pcurve[1])/pcurve[2]) + pcurve[0]))); }