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:
Wed Nov 08 10:43:37 2017 +0000
Revision:
7:944051b30179
Parent:
5:8b7ba76a7a76
RL_VALUE has been changed to 1 to reflect the sensors that we have (ours are used in teaching). Default is commonly around 5K, but check RL for your specific application!

Who changed what in which revision?

UserRevisionLine numberNew contents of line
azazeal88 0:a5033edf6975 1 #ifndef MQ2_h
azazeal88 0:a5033edf6975 2 #define MQ2_h
azazeal88 0:a5033edf6975 3
azazeal88 0:a5033edf6975 4 #include "mbed.h"
azazeal88 0:a5033edf6975 5
azazeal88 7:944051b30179 6 #define RL_VALUE 1 //define the load resistance on the board, in kilo ohms
azazeal88 1:323f72b59e99 7 #define RO_DEFAULT 10 //Ro is initialized to 10 kilo ohms
azazeal88 1:323f72b59e99 8 #define RO_CLEAN_AIR_FACTOR 9.83f //RO_CLEAR_AIR_FACTOR=(Sensor resistance in clean air)/RO, which is derived from the chart in datasheet
azazeal88 1:323f72b59e99 9 #define CALIBARAION_SAMPLE_TIMES 5 //define how many samples you are going to take in the calibration phase
azazeal88 1:323f72b59e99 10 #define CALIBRATION_SAMPLE_INTERVAL 50 //define the time interal(in milisecond) between each samples
azazeal88 1:323f72b59e99 11 #define READ_SAMPLE_INTERVAL 50 //define how many samples you are going to take in normal operation
azazeal88 1:323f72b59e99 12 #define READ_SAMPLE_TIMES 5 //define the time interal(in milisecond) between each samples
azazeal88 0:a5033edf6975 13
azazeal88 0:a5033edf6975 14 //The curves
azazeal88 1:323f72b59e99 15 static float LPGCurve[] = {2.3f,0.21f,-0.47f};
azazeal88 0:a5033edf6975 16 static float COCurve[] = {2.3f,0.72f,-0.34f};
azazeal88 0:a5033edf6975 17 static float SmokeCurve[] = {2.3f,0.53f,-0.44f};
azazeal88 0:a5033edf6975 18
azazeal88 0:a5033edf6975 19 typedef struct {
azazeal88 0:a5033edf6975 20 float lpg;
azazeal88 0:a5033edf6975 21 float co;
azazeal88 0:a5033edf6975 22 float smoke;
azazeal88 0:a5033edf6975 23 } MQ2_data_t;
azazeal88 0:a5033edf6975 24
azazeal88 0:a5033edf6975 25 typedef enum {
azazeal88 0:a5033edf6975 26 GAS_LPG = 0,
azazeal88 0:a5033edf6975 27 GAS_CO = 1,
azazeal88 0:a5033edf6975 28 GAS_SMOKE = 2
azazeal88 0:a5033edf6975 29 } GasType;
azazeal88 0:a5033edf6975 30
azazeal88 0:a5033edf6975 31
azazeal88 0:a5033edf6975 32 class MQ2 {
azazeal88 0:a5033edf6975 33 public:
azazeal88 0:a5033edf6975 34 MQ2(PinName pin) : _pin(pin){
azazeal88 0:a5033edf6975 35 Ro = RO_DEFAULT;
azazeal88 0:a5033edf6975 36 };
azazeal88 0:a5033edf6975 37 void read(MQ2_data_t *ptr);
azazeal88 0:a5033edf6975 38 float readLPG();
azazeal88 0:a5033edf6975 39 float readCO();
azazeal88 0:a5033edf6975 40 float readSmoke();
azazeal88 0:a5033edf6975 41 void begin();
azazeal88 0:a5033edf6975 42 private:
azazeal88 0:a5033edf6975 43 AnalogIn _pin;
azazeal88 0:a5033edf6975 44 float MQRead();
azazeal88 0:a5033edf6975 45 float MQGetGasPercentage(float rs_ro_ratio, GasType gas_id);
azazeal88 0:a5033edf6975 46 int MQGetPercentage(float rs_ro_ratio, float *pcurve);
azazeal88 0:a5033edf6975 47 float MQCalibration();
azazeal88 5:8b7ba76a7a76 48 float MQResistanceCalculation(int raw_adc);
azazeal88 0:a5033edf6975 49 float Ro;
azazeal88 0:a5033edf6975 50 };
azazeal88 0:a5033edf6975 51
azazeal88 0:a5033edf6975 52 #endif