This library is made for MQ-4 gás sensor.

Dependents:   MQ4_example Navitec-Firmware

MQ4.h

Committer:
renanbmx123
Date:
2018-07-17
Revision:
0:401959f72658

File content as of revision 0:401959f72658:

#ifndef MQ4_h
#define MQ4_h

#include "mbed.h"

#define RL_VALUE                    10                                           //define the load resistance on the board, in kilo ohms
#define RO_DEFAULT                  10                                           //Ro is initialized to 10 kilo ohms
#define RO_CLEAN_AIR_FACTOR         4.4f                                        //RO_CLEAR_AIR_FACTOR=(Sensor resistance in clean air)/RO, which is derived from the chart in datasheet
#define CALIBARAION_SAMPLE_TIMES    5                                           //define how many samples you are going to take in the calibration phase
#define CALIBRATION_SAMPLE_INTERVAL 50                                          //define the time interal(in milisecond) between each samples
#define READ_SAMPLE_INTERVAL        50                                          //define how many samples you are going to take in normal operation
#define READ_SAMPLE_TIMES           5                                           //define the time interal(in milisecond) between each samples

//The curves
// {log(X1) ,log(Y),[log(Y1) - log(Y2)] / [log(X2) - log(X1)]} get values from datasheet             
static float LPGCurve[]   = {2.3f,0.43f,-0.33f};
static float H2Curve[]    = {2.3f,0.57f,-0.16f};
static float CH4Curve[]   = {2.3f,0.27f,-0.38f};

typedef struct {
  float lpg;
  float h2;
  float ch4;
} MQ4_data_t;

typedef enum  {
    GAS_LPG = 0,
    GAS_H2 = 1,
    GAS_CH4 = 2
} GasType;


class MQ4 {
public: 
    MQ4(PinName pin) : _pin(pin){
      Ro = RO_DEFAULT;
    };
    void read(MQ4_data_t *ptr);
    float readLPG();
    float readH2();
    float readCH4();
    float get_Ro();
    void begin();
private:
    AnalogIn _pin;
    float MQRead();
    float MQGetGasPercentage(float rs_ro_ratio, GasType gas_id);
    int MQGetPercentage(float rs_ro_ratio, float *pcurve);
    float MQCalibration();
    float MQResistanceCalculation(int raw_adc);
    float Ro;
    
};

#endif