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.h@5:8b7ba76a7a76, 2017-10-06 (annotated)
- Committer:
- azazeal88
- Date:
- Fri Oct 06 08:57:00 2017 +0000
- Revision:
- 5:8b7ba76a7a76
- Parent:
- 3:ed294e830904
- Child:
- 7:944051b30179
RC1
Who changed what in which revision?
User | Revision | Line number | New 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 | 0:a5033edf6975 | 6 | #define RL_VALUE 5 //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 |