MQ9 Gas Sensor

post hero image

Introduction

MQ Gas Sensor Series

MQ gas sensor series include different models for detecting different kind of gases. Take a look at the following table and choose wisely the right MQ sensor for your project.

NameDetectable gas
MQ2Methane, Butane, LPG, smoke
MQ3Alcohol, Ethanol, smoke
MQ4Methane, CNG Gas
MQ5Natural gas, LPG
MQ6LPG, butane gas
MQ7Carbon Monoxide
MQ8Hydrogen Gas
MQ9Carbon Monoxide, flammable gasses
MQ131Ozone
MQ135Air Quality (CO, Ammonia, Benzene, Alcohol, smoke)
MQ136Hydrogen Sulfide gas
MQ137Ammonia
MQ138Benzene, Toluene, Alcohol, Acetone, Propane, Formaldehyde gas, Hydrogen
MQ214Methane, Natural gas

The MQ9 sensor can detect carbon monoxide density from 10ppm to 1000ppm and flammable gases density from 100ppm to 10000ppm. Note that ppm stands for part per million. MQ9 has an internal heater which starts warming up if a 5V voltage is applied. The internal resistance of this sensor changes as the density of the detectable gases changes.

Arduino

MQ9 sensor needs 24 to 48 hours of preheating time. Connect the power supply and leave for the required time until it gets ready. You also need to calibrate the sensor.

Hardware requirements & setup

  1. Arduino Uno board or any Arduino-like board
  2. MQ9 Gas Sensor sensor
  3. Hook-up wires of different colors
  4. Breadboard

MQ sensor has 5 pins:

  1. VCC (connect to 5V)
  2. GND
  3. DO pin returns HIGH if the concentration of gas is higher than a certain value*
  4. AO pin returns an analog value based on the concentration of the gas

* This value can be set by the potentiometer on the board

MQ9 to Arduino wiring schema

Before moving on, let’s clarify some important notes:

  1. Do not expose this sensor to water and frost
  2. Applying a voltage higher than 5V (or to the wrong pins) may damage the sensor
  3. Exposing the sensor to a high concentration of gases for a long time may have a negative effect on its performance
  4. Shaking or vibrating the sensor may decrease its accuracy

Calibrate MQ9

Before using the module you have to calibrate it. This sensor measures the gas concentration based on resistance ratio, which includes R0 and Rs. R0 is sensor resistance in 1000ppm concentration of LPG (Liquefied Petroleum Gas). While Rs is internal resistance of the sensor which changes by gas concentration.

In clean air, after preheating, upload the following code and wait for about 15 minutes until R0 reaches a fixed value.

/*
  MQ9 Calibration
  modified on 19 Feb 2019
  by Saeed Hosseini
  https://electropeak.com/learn/
*/
void setup() {
  Serial.begin(9600);
}

void loop() {
  // 'RS_air' is Rs in clean air
  // 'R0' is R0 in 1000 ppm LPG
  float sensor_volt, RS_air, R0, sensorValue;

  // Average
  for (int x = 0 ; x < 100 ; x++) {
    sensorValue = sensorValue + analogRead(A0);
  }
  sensorValue = sensorValue / 100.0;

  //-----------------------------------------------/
  sensor_volt = (sensorValue / 1024) * 5.0;
  RS_air = (5.0 - sensor_volt) / sensor_volt; // Depend on RL on your module
  R0 = RS_air / 9.9; // According to MQ9 datasheet table
  Serial.print("sensor_volt = ");
  Serial.print(sensor_volt);
  Serial.println("V");
  Serial.print("R0 = ");
  Serial.println(R0);
  delay(1000);
}

As you see in the code above, you have averaged from 100 data to achieve a stable value. Then you measure the sensor voltage and according to RL resistance (in our case, 5K), you calculate Rs. According to the table available in the datasheet, R0 can be found.

Simple Gas Detector

In the following code, you need to replace R0 with the value you get from the previous step.

const short int LED = LED_BUILTIN, DO_pin = 8, A0_pin = A0;

void setup() {
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
  pinMode(DO_pin, INPUT);
}

void loop() {
  int alarm = 0;
  float sensor_volt;
  float RS_gas;
  float ratio;
  // replace this value with the one you get from calibration
  float R0 = -0.10;

  int sensorValue = analogRead(A0_pin);
  sensor_volt = ((float)sensorValue / 1024) * 5.0;
  RS_gas = (5.0 - sensor_volt) / sensor_volt; // Depend on RL on yor module
  ratio = RS_gas / R0; // ratio = RS/R0


  Serial.print("sensor_volt = ");
  Serial.println(sensor_volt);
  Serial.print("RS_ratio = ");
  Serial.println(RS_gas);
  Serial.print("Rs/R0 = ");
  Serial.println(ratio);
  Serial.print("\n\n");

  alarm = digitalRead(DO_pin);
  digitalWrite(LED, alarm);

  delay(1000);
}

Conclusion

Gas sensors can be very useful especially if used in combination with smart ways of communication like nRF24L01+ wireless module.

You must always remind that a project is always made up by different smaller projects. Every time you learn how to use a sensor, you also learn new ways to combine different sensors and use them together to solve more and more complicated problems.

Documentation

Useful links: