MQ เป็นเซ็นเซอร์ก๊าซชนิดหนึ่งที่ถูกออกแบบมาเพื่อตรวจจับก๊าซที่ติดไฟได้หลายชนิด เช่น ก๊าซแอลกอฮอล์, ก๊าซธรรมชาติ และก๊าซไฮโดรเจน เซ็นเซอร์นี้ทำงานบนหลักการเปลี่ยนแปลงความต้านทานไฟฟ้าเมื่อสัมผัสกับก๊าซที่ต้องการตรวจจับ
แบบที่ 1 ใช้งานแบบ Digital
1.ต่ออุปกรณ์

MQ-5 > Arduino UNO
GND>GNDVCC>5VDO>Pin 7
2.ลงโปรแกรม
Copy โค้ดด้านล่าง
Arduino
1int sensor = 7;
2int val = 0;
3void setup() {
4 Serial.begin(9600);
5}
6void loop() {
7 val = digitalRead(sensor);
8 if (val == 0) {
9 Serial.println("MQ-5 Detected");
10 }
11 delay(500);
12}1int sensor = 7;
2int val = 0;
3void setup() {
4 Serial.begin(9600);
5}
6void loop() {
7 val = digitalRead(sensor);
8 if (val == 0) {
9 Serial.println("MQ-5 Detected");
10 }
11 delay(500);
12}
แบบที่ 2 ใช้งานแบบ Analog
1.ต่ออุปกรณ์

MQ-5 > Arduino UNO
GND>GNDVCC>5VAO>A0
2.ลงโปรแกรม
Copy โค้ดด้านล่าง
Arduino
1int sensor = A0;
2int val = 0;
3void setup() {
4 Serial.begin(9600);
5}
6void loop() {
7 val = analogRead(sensor);
8 Serial.println(val);
9 delay(500);
10}1int sensor = A0;
2int val = 0;
3void setup() {
4 Serial.begin(9600);
5}
6void loop() {
7 val = analogRead(sensor);
8 Serial.println(val);
9 delay(500);
10}
แบบที่ 3 ใช้งานแบบ Analog หน่วย PPM
1.ต่ออุปกรณ์

MQ-5 > Arduino UNO
GND>GNDVCC>5VAO>A0
2.ลงโปรแกรม
Copy โค้ดด้านล่าง
Arduino
1/*******************Demo for MQ-5 Gas Sensor Module*****************************
2 Support: Tiequan Shao: support[at]sandboxelectronics.com
3 Lisence: Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)
4 Note: This piece of source code is supposed to be used as a demonstration ONLY.
5 More sophisticated calibration is required for industrial field application.
6 Sandbox Electronics 2011-04-25
7************************************************************************************/
8
9/************************Hardware Related Macros************************************/
10#define MQ_PIN (0) //define which analog input channel you are going to use
11#define RL_VALUE (5) //define the load resistance on the board, in kilo ohms
12#define RO_CLEAN_AIR_FACTOR (6.5) //RO_CLEAR_AIR_FACTOR=(Sensor resistance in clean air)/RO, for MQ-5
13
14/***********************Software Related Macros************************************/
15#define CALIBARAION_SAMPLE_TIMES (50) //define how many samples you are going to take in the calibration phase
16#define CALIBRATION_SAMPLE_INTERVAL (500) //define the time interal(in milisecond) between each samples in the calibration phase
17#define READ_SAMPLE_INTERVAL (50) //define the time interval(in milisecond) between each samples in normal operation
18#define READ_SAMPLE_TIMES (5) //define how many samples you are going to take in normal operation
19
20/**********************Application Related Macros**********************************/
21#define GAS_LPG (0)
22#define GAS_CO (1)
23#define GAS_H2 (2)
24
25/*****************************Globals***********************************************/
26float LPGCurve[3] = {2.3, 0.21, -0.47}; // MQ-5 curve for LPG
27float COCurve[3] = {2.3, 0.72, -0.34}; // MQ-5 curve for CO
28float H2Curve[3] = {2.3, 0.26, -0.36}; // MQ-5 curve for Hydrogen (H2)
29float Ro = 10; //Ro is initialized to 10 kilo ohms
30
31void setup()
32{
33 Serial.begin(9600); //UART setup, baudrate = 9600bps
34 Serial.print("Calibrating...\n");
35 Ro = MQCalibration(MQ_PIN); //Calibrating the sensor. Please make sure the sensor is in clean air
36 Serial.print("Calibration is done...\n");
37 Serial.print("Ro=");
38 Serial.print(Ro);
39 Serial.print("kohm");
40 Serial.print("\n");
41}
42
43void loop()
44{
45 Serial.print("LPG:");
46 Serial.print(MQGetGasPercentage(MQRead(MQ_PIN) / Ro, GAS_LPG) );
47 Serial.print( "ppm" );
48 Serial.print(" ");
49 Serial.print("CO:");
50 Serial.print(MQGetGasPercentage(MQRead(MQ_PIN) / Ro, GAS_CO) );
51 Serial.print( "ppm" );
52 Serial.print(" ");
53 Serial.print("H2:");
54 Serial.print(MQGetGasPercentage(MQRead(MQ_PIN) / Ro, GAS_H2) );
55 Serial.print( "ppm" );
56 Serial.print("\n");
57 delay(200);
58}
59
60float MQResistanceCalculation(int raw_adc)
61{
62 return ( ((float)RL_VALUE * (1023 - raw_adc) / raw_adc));
63}
64
65float MQCalibration(int mq_pin)
66{
67 int i;
68 float val = 0;
69
70 for (i = 0; i < CALIBARAION_SAMPLE_TIMES; i++) {
71 val += MQResistanceCalculation(analogRead(mq_pin));
72 delay(CALIBRATION_SAMPLE_INTERVAL);
73 }
74 val = val / CALIBARAION_SAMPLE_TIMES;
75 val = val / RO_CLEAN_AIR_FACTOR;
76 return val;
77}
78
79float MQRead(int mq_pin)
80{
81 int i;
82 float rs = 0;
83
84 for (i = 0; i < READ_SAMPLE_TIMES; i++) {
85 rs += MQResistanceCalculation(analogRead(mq_pin));
86 delay(READ_SAMPLE_INTERVAL);
87 }
88
89 rs = rs / READ_SAMPLE_TIMES;
90 return rs;
91}
92
93int MQGetGasPercentage(float rs_ro_ratio, int gas_id)
94{
95 if ( gas_id == GAS_LPG ) {
96 return MQGetPercentage(rs_ro_ratio, LPGCurve);
97 } else if ( gas_id == GAS_CO ) {
98 return MQGetPercentage(rs_ro_ratio, COCurve);
99 } else if ( gas_id == GAS_H2 ) {
100 return MQGetPercentage(rs_ro_ratio, H2Curve);
101 }
102
103 return 0;
104}
105
106int MQGetPercentage(float rs_ro_ratio, float *pcurve)
107{
108 return (pow(10, ( ((log(rs_ro_ratio) - pcurve[1]) / pcurve[2]) + pcurve[0])));
109}
1101/*******************Demo for MQ-5 Gas Sensor Module*****************************
2 Support: Tiequan Shao: support[at]sandboxelectronics.com
3 Lisence: Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)
4 Note: This piece of source code is supposed to be used as a demonstration ONLY.
5 More sophisticated calibration is required for industrial field application.
6 Sandbox Electronics 2011-04-25
7************************************************************************************/
8
9/************************Hardware Related Macros************************************/
10#define MQ_PIN (0) //define which analog input channel you are going to use
11#define RL_VALUE (5) //define the load resistance on the board, in kilo ohms
12#define RO_CLEAN_AIR_FACTOR (6.5) //RO_CLEAR_AIR_FACTOR=(Sensor resistance in clean air)/RO, for MQ-5
13
14/***********************Software Related Macros************************************/
15#define CALIBARAION_SAMPLE_TIMES (50) //define how many samples you are going to take in the calibration phase
16#define CALIBRATION_SAMPLE_INTERVAL (500) //define the time interal(in milisecond) between each samples in the calibration phase
17#define READ_SAMPLE_INTERVAL (50) //define the time interval(in milisecond) between each samples in normal operation
18#define READ_SAMPLE_TIMES (5) //define how many samples you are going to take in normal operation
19
20/**********************Application Related Macros**********************************/
21#define GAS_LPG (0)
22#define GAS_CO (1)
23#define GAS_H2 (2)
24
25/*****************************Globals***********************************************/
26float LPGCurve[3] = {2.3, 0.21, -0.47}; // MQ-5 curve for LPG
27float COCurve[3] = {2.3, 0.72, -0.34}; // MQ-5 curve for CO
28float H2Curve[3] = {2.3, 0.26, -0.36}; // MQ-5 curve for Hydrogen (H2)
29float Ro = 10; //Ro is initialized to 10 kilo ohms
30
31void setup()
32{
33 Serial.begin(9600); //UART setup, baudrate = 9600bps
34 Serial.print("Calibrating...\n");
35 Ro = MQCalibration(MQ_PIN); //Calibrating the sensor. Please make sure the sensor is in clean air
36 Serial.print("Calibration is done...\n");
37 Serial.print("Ro=");
38 Serial.print(Ro);
39 Serial.print("kohm");
40 Serial.print("\n");
41}
42
43void loop()
44{
45 Serial.print("LPG:");
46 Serial.print(MQGetGasPercentage(MQRead(MQ_PIN) / Ro, GAS_LPG) );
47 Serial.print( "ppm" );
48 Serial.print(" ");
49 Serial.print("CO:");
50 Serial.print(MQGetGasPercentage(MQRead(MQ_PIN) / Ro, GAS_CO) );
51 Serial.print( "ppm" );
52 Serial.print(" ");
53 Serial.print("H2:");
54 Serial.print(MQGetGasPercentage(MQRead(MQ_PIN) / Ro, GAS_H2) );
55 Serial.print( "ppm" );
56 Serial.print("\n");
57 delay(200);
58}
59
60float MQResistanceCalculation(int raw_adc)
61{
62 return ( ((float)RL_VALUE * (1023 - raw_adc) / raw_adc));
63}
64
65float MQCalibration(int mq_pin)
66{
67 int i;
68 float val = 0;
69
70 for (i = 0; i < CALIBARAION_SAMPLE_TIMES; i++) {
71 val += MQResistanceCalculation(analogRead(mq_pin));
72 delay(CALIBRATION_SAMPLE_INTERVAL);
73 }
74 val = val / CALIBARAION_SAMPLE_TIMES;
75 val = val / RO_CLEAN_AIR_FACTOR;
76 return val;
77}
78
79float MQRead(int mq_pin)
80{
81 int i;
82 float rs = 0;
83
84 for (i = 0; i < READ_SAMPLE_TIMES; i++) {
85 rs += MQResistanceCalculation(analogRead(mq_pin));
86 delay(READ_SAMPLE_INTERVAL);
87 }
88
89 rs = rs / READ_SAMPLE_TIMES;
90 return rs;
91}
92
93int MQGetGasPercentage(float rs_ro_ratio, int gas_id)
94{
95 if ( gas_id == GAS_LPG ) {
96 return MQGetPercentage(rs_ro_ratio, LPGCurve);
97 } else if ( gas_id == GAS_CO ) {
98 return MQGetPercentage(rs_ro_ratio, COCurve);
99 } else if ( gas_id == GAS_H2 ) {
100 return MQGetPercentage(rs_ro_ratio, H2Curve);
101 }
102
103 return 0;
104}
105
106int MQGetPercentage(float rs_ro_ratio, float *pcurve)
107{
108 return (pow(10, ( ((log(rs_ro_ratio) - pcurve[1]) / pcurve[2]) + pcurve[0])));
109}
110