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

Committer:
azazeal88
Date:
Thu Oct 05 11:33:31 2017 +0000
Revision:
0:a5033edf6975
Child:
2:05d00b8b071d
First commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
azazeal88 0:a5033edf6975 1 #include "MQ2.h"
azazeal88 0:a5033edf6975 2
azazeal88 0:a5033edf6975 3 void MQ2::begin(){
azazeal88 0:a5033edf6975 4 Ro = MQCalibration();
azazeal88 0:a5033edf6975 5 }
azazeal88 0:a5033edf6975 6
azazeal88 0:a5033edf6975 7 /*
azazeal88 0:a5033edf6975 8 * Reads data from MQ2.
azazeal88 0:a5033edf6975 9 *
azazeal88 0:a5033edf6975 10 * Param data: the pointer to fill.
azazeal88 0:a5033edf6975 11 */
azazeal88 0:a5033edf6975 12 void MQ2::read(MQ2_data_t *data){
azazeal88 0:a5033edf6975 13 data->lpg = MQGetGasPercentage(MQRead()/Ro,GAS_LPG);
azazeal88 0:a5033edf6975 14 data->co = MQGetGasPercentage(MQRead()/Ro,GAS_CO);
azazeal88 0:a5033edf6975 15 data->smoke = MQGetGasPercentage(MQRead()/Ro,GAS_SMOKE);
azazeal88 0:a5033edf6975 16 }
azazeal88 0:a5033edf6975 17
azazeal88 0:a5033edf6975 18 /*
azazeal88 0:a5033edf6975 19 * reads data, returns LPG value in ppm
azazeal88 0:a5033edf6975 20 */
azazeal88 0:a5033edf6975 21 float MQ2::readLPG(){
azazeal88 0:a5033edf6975 22 return MQGetGasPercentage(MQRead()/10,GAS_LPG);
azazeal88 0:a5033edf6975 23 }
azazeal88 0:a5033edf6975 24
azazeal88 0:a5033edf6975 25 /*
azazeal88 0:a5033edf6975 26 * reads data, returns CO value in ppm
azazeal88 0:a5033edf6975 27 */
azazeal88 0:a5033edf6975 28 float MQ2::readCO(){
azazeal88 0:a5033edf6975 29 return MQGetGasPercentage(MQRead()/10,GAS_CO);
azazeal88 0:a5033edf6975 30 }
azazeal88 0:a5033edf6975 31
azazeal88 0:a5033edf6975 32 /*
azazeal88 0:a5033edf6975 33 * reads data, returns Smoke value in ppm
azazeal88 0:a5033edf6975 34 */
azazeal88 0:a5033edf6975 35 float MQ2::readSmoke(){
azazeal88 0:a5033edf6975 36 return MQGetGasPercentage(MQRead()/10,GAS_SMOKE);
azazeal88 0:a5033edf6975 37 }
azazeal88 0:a5033edf6975 38
azazeal88 0:a5033edf6975 39 float MQ2::MQResistanceCalculation(int raw_adc) {
azazeal88 0:a5033edf6975 40 return (((float)RL_VALUE*(1023-raw_adc)/raw_adc));
azazeal88 0:a5033edf6975 41 }
azazeal88 0:a5033edf6975 42
azazeal88 0:a5033edf6975 43 float MQ2::MQCalibration() {
azazeal88 0:a5033edf6975 44 float val=0;
azazeal88 0:a5033edf6975 45 for (int i=0;i<CALIBARAION_SAMPLE_TIMES;i++) { //take multiple samples
azazeal88 0:a5033edf6975 46 val += MQResistanceCalculation(_pin.read_u16()>>6);
azazeal88 0:a5033edf6975 47 wait_ms(CALIBRATION_SAMPLE_INTERVAL);
azazeal88 0:a5033edf6975 48 }
azazeal88 0:a5033edf6975 49 val = val/CALIBARAION_SAMPLE_TIMES; //calculate the average value
azazeal88 0:a5033edf6975 50 val = val/RO_CLEAN_AIR_FACTOR; //divided by RO_CLEAN_AIR_FACTOR yields the Ro //according to the chart in the datasheet
azazeal88 0:a5033edf6975 51 return val;
azazeal88 0:a5033edf6975 52 }
azazeal88 0:a5033edf6975 53
azazeal88 0:a5033edf6975 54 /*
azazeal88 0:a5033edf6975 55 * Sample the MQ2
azazeal88 0:a5033edf6975 56 */
azazeal88 0:a5033edf6975 57 float MQ2::MQRead() {
azazeal88 0:a5033edf6975 58 int i;
azazeal88 0:a5033edf6975 59 float rs=0;
azazeal88 0:a5033edf6975 60 int val = _pin.read_u16()>>6;
azazeal88 0:a5033edf6975 61 for (i=0;i<READ_SAMPLE_TIMES;i++) {
azazeal88 0:a5033edf6975 62 rs += MQResistanceCalculation(val);
azazeal88 0:a5033edf6975 63 wait_ms(READ_SAMPLE_INTERVAL);
azazeal88 0:a5033edf6975 64 }
azazeal88 0:a5033edf6975 65 rs = rs/READ_SAMPLE_TIMES;
azazeal88 0:a5033edf6975 66 return rs;
azazeal88 0:a5033edf6975 67 }
azazeal88 0:a5033edf6975 68
azazeal88 0:a5033edf6975 69 float MQ2::MQGetGasPercentage(float rs_ro_ratio, GasType gas_id) {
azazeal88 0:a5033edf6975 70 switch(gas_id) {
azazeal88 0:a5033edf6975 71 case GAS_LPG: return MQGetPercentage(rs_ro_ratio,LPGCurve);
azazeal88 0:a5033edf6975 72 case GAS_CO: return MQGetPercentage(rs_ro_ratio,COCurve);
azazeal88 0:a5033edf6975 73 case GAS_SMOKE: return MQGetPercentage(rs_ro_ratio,SmokeCurve);
azazeal88 0:a5033edf6975 74 default: return -1.0;
azazeal88 0:a5033edf6975 75 }
azazeal88 0:a5033edf6975 76 }
azazeal88 0:a5033edf6975 77
azazeal88 0:a5033edf6975 78 int MQ2::MQGetPercentage(float rs_ro_ratio, float *pcurve) {
azazeal88 0:a5033edf6975 79 return (pow(10,(((log(rs_ro_ratio)-pcurve[1])/pcurve[2]) + pcurve[0])));
azazeal88 0:a5033edf6975 80 }