Detector de gases con Arduino y la familia de sensores MQ


arduino-sensor-gas-mq

¿Qué es un sensor de gases MQ?

Los sensores de gases MQ son una familia de dispositivos diseñados para detectar la presencia de distintos componentes químicos en el aire. Podemos conectar estos dispositivos a un autómata o procesador como Arduino.

Existe una gran variedad de sensores MQ. Cada modelo está diseñado para detectar una o más sustancias, pensadas para un uso específico, como por ejemplo detección gases inflamables, calidad del aire o detección de alcohol en aire respirado.

Los sensores de gases MQ suelen proporcionarse con una placa de medición estándar con el comparador LMC662 o similar, que permite obtener la lectura tanto como un valor analógico, como un valor digital cuando se supera un cierto umbral regulado a través de un potenciómetro ubicado en la placa.

Los sensores de gases deben ser calibrados antes de obtener una medida precisa. Aun calibrados estos sensores no disponen de la garantía necesaria para formar parte de un sistema de seguridad.

Anuncio:

No usar estos sensores en aplicaciones de las que dependa la seguridad de personas o equipamientos.

Pese a sus limitaciones, los sensores de gases tipo MQ son muy usados en proyectos de electrónica casera con Arduino. Por ejemplo, podemos hacer encender o apagar un ventilador en función de la calidad del aire, hacer un pequeño detector de alcoholemia, o una alama que suene al detectar humos.

Precio

Los sensores de gas MQ son dispositivos relativamente baratos. El precio varía de un modelo a otro pero, en general, oscila entre 1 a 1.5€, en vendedores internacionales de eBay y AliExpress.

arduino-sensor-gas-mq-componente

¿Cómo funciona un sensor de gases?

Los sensores MQ están compuestos por un sensor electro-químico que varía su resistencia al estar en contacto con las sustancias.

Los sensores de gases son dispositivos con alta inercia, es decir, la respuesta necesita tiempos largos para estabilizarse tras un cambio de concentración de los gases medidos. Ello es debido a la necesidad física de que el gas abandone el material sensible, lo cual es un proceso lento.

Todos los modelos MQ disponen de un calentador necesario para elevar la temperatura del sensor, y que sus materiales adquieran la sensibilidad. Mientras el calentador no alcance la temperatura de funcionamiento, la lectura del sensor no será fiable.

El tiempo de calentamiento depende de cada modelo de sensor. En la mayoría de modelos es suficiente para con unos pocos minutos pero algunos modelos requieren hasta 12 y 48 horas hasta obtener mediciones estable.

Por otro lado, cada modelo necesita su propia tensión para alimentar el calentador. En muchos modelos esta tensión es de 5V, pero algunos modelos tienen condicionantes especiales para la alimentación.

El consumo de los sensores MQ puede ser elevado debido al calor necesario para funcionar el calentador, que puede llegar hasta 800 mW en algunos modelos. Esto es superior a la potencia que puede suministrar el regulador de Arduino, por lo que será necesario proporcionar una fuente de alimentación externa.

A continuación, tenéis una tabla de resumen con los distintos modelos de sensores disponibles, los gases a los que son sensibles, y algunos datos sobre el calentador.

No obstante, consultar detalladamente el Datasheet de cada sensor MQ particular antes de emplearlo para detallar sus especificaciones técnicas, especialmente la tensión de alimentación del calentador, el tiempo de calentamiento, y la curva de sensibilidad del sensor.

ModeloSustancias detectadasCalentador
MQ-2Metano, butano, GLP, humo5V
MQ-3Alcohol, Etanol, humo5V
MQ-303AAlcohol, etanol, humo0.9V
MQ-4Metano, gas natural comprimido (GNP)5V
MQ-5Gas natural, GLP5V
MQ-6Butano, GLP5V
MQ-306AButano, GLP0.9V
MQ-7Monóxido de carbonoAlternado 5V y 1.4V
MQ-307AMonóxido de carbonoAlternado 0.2 y 0.9V
MQ-8Hidrógeno5V
MQ-9Monóxido de carbono, gases inflamablesAlternado 5V y 1.5V
MQ-309AMonóxido de carbono, gases inflamablesAlternado 0.2 y 0.9V
MQ-131Ozono6V
MQ-135Benceno, alcohol, humo, calidad del aire5V
MQ-136Ácido sulfhídrico5V
MQ-137Amoniaco5V
MQ-138Benceno, tolueno, alcohol, acetona,
propano, formaldeido, hidrógeno
5V
MQ-214Metano, gas natural5V
MQ-216Gas natural, gas carbón6V
MG-811Dióxido de cargono6V
AQ-104Calidad del aire *
AQ-2Gases inflamables, humo
AQ-3Alcohol, Benceno
AQ-7Monóxido de carbono

* Conviene amplificación

Esquema de montaje

El esquema eléctrico es sencillo. Alimentamos el módulo conectando GND y 5V a los pines correspondientes de Arduino.

Ahora si queremos usar la lectura digital, conectamos la salida DO a una de las entradas digitales de Arduino.

arduino-sensor-gas-mq-esquema

Opcionalmente, podemos calibrar el umbral de disparo de la salida digital con el potenciómetro instalado en el módulo.

La conexión vista desde Arduino quedaría así,

Si quisiéramos emplear el valor analógico, simplemente conectaríamos la salida AO del sensor a una entrada analógica de Arduino.

Ejemplos de código

Lectura digital

El siguiente ejemplo muestra la lectura digital del sensor. El código es muy, simplemente utilizamos una entrada digital para comprobar el estado del sensor, empleando el puerto serie para informar de la detección. En un ejemplo real, realizaríamos las acciones oportunas ante una detección.

const int MQ_PIN = 2;
const int MQ_DELAY = 2000;

void setup()
{
  Serial.begin(9600);
}


void loop()
{
  bool state= digitalRead(MQ_PIN);

  if (!state)
  {
    Serial.println("Deteccion");
  }
  else
  {
    Serial.println("No detectado");
  }
  delay(MQ_DELAY);
}

Lectura analógica

En el siguiente ejemplo realizamos la lectura analógica del sensor. Al igual que el anterior, es código es muy sencillo. Simplemente empleamos una entrada analógica cualquiera para leer la salida analógica del sensor, y mostramos el resultado por puerto serie.

const int MQ_PIN = A0;
const int MQ_DELAY = 2000;

void setup()
{
  Serial.begin(9600);
}

void loop() 
{
  int raw_adc = analogRead(MQ_PIN);
  float value_adc = raw_adc * (5.0 / 1023.0);

  Serial.print("Raw:");
  Serial.print(raw_adc);
  Serial.print("    Tension:");
  Serial.println(value_adc);

  delay(MQ_DELAY);
}

Leer la concentración

En el siguiente ejemplo, empleamos la lectura analógica para determinar la concentración del gas normalmente en ppm (partes por millón), pero algunos sensores usan otras unidades como mg/L o bpm (partes por billón)

El Datasheet de cada sensor proporciona unas gráficas que permiten obtener la concentración del gas a partir de la relación entre la resistencia del sensor R0 y la resistencia medida Rs. También es necesario conocer la resistencia Rl empleada en el módulo para realizar la lectura del sensor MQ.

Por ejemplo, la siguiente imagen muestra las curvas de concentración de cada gas medido en un sensor MQ-2

arduino-sensor-gas-mq-curvas

Tendréis que tomar como referencia las curvas de concentración del Datasheet del sensor que estéis usando.

Las gráficas se disponen en escala logarítmica para ambos ejes y, en general, son aproximadamente rectas bajo estas escalas. Por lo que la concentración resultará,


Concentracion =  10^{(A \cdot log (Rs/R) + B)}

Para determinar la concentración necesitaremos la recta que la aproxima, para lo cuál debemos coger dos puntos cuales quiera de las gráficas P0 = {X0, Y0} y P1 = {X1, Y1}, resultando la ecuación de la recta


Y = A \cdot x + B

Siendo

A = \frac {Y_1-Y_0}{X_1-X_0}

B = Y_0-A \cdot X_0

const int MQ_PIN = A0;		// Pin del sensor
const int RL_VALUE = 5;		// Resistencia RL del modulo en Kilo ohms
const int R0 = 10;          // Resistencia R0 del sensor en Kilo ohms

// Datos para lectura multiple
const int READ_SAMPLE_INTERVAL = 100;    // Tiempo entre muestras
const int READ_SAMPLE_TIMES = 5;		 // Numero muestras

// Ajustar estos valores para vuestro sensor según el Datasheet
// (opcionalmente, según la calibración que hayáis realizado)
const float X0 = 200;
const float Y0 = 1.7;
const float X1 = 10000;
const float Y1 = 0.28;

// Puntos de la curva de concentración {X, Y}
const float punto0[] = { log10(X0), log10(Y0) };
const float punto1[] = { log10(X1), log10(Y1) };

// Calcular pendiente y coordenada abscisas
const float scope = (punto1[1] - punto0[1]) / (punto1[0] - punto0[0]);
const float coord = punto0[1] - punto0[0] * scope;

void setup()
{
	Serial.begin(9600);
}

void loop()
{
	float rs_med = readMQ(MQ_PIN);		// Obtener la Rs promedio
	float concentration = getConcentration(rs_med/R0);	// Obtener la concentración
	
	// Mostrar el valor de la concentración por serial
	Serial.println("Concentración: ");
	Serial.println(concentration);
}

// Obtener la resistencia promedio en N muestras
float readMQ(int mq_pin)
{
	float rs = 0;
	for (int i = 0;i<READ_SAMPLE_TIMES;i++) {
		rs += getMQResistance(analogRead(mq_pin));
		delay(READ_SAMPLE_INTERVAL);
	}
	return rs / READ_SAMPLE_TIMES;
}

// Obtener resistencia a partir de la lectura analogica
float getMQResistance(int raw_adc)
{
	return (((float)RL_VALUE / 1000.0*(1023 - raw_adc) / raw_adc));
}

// Obtener concentracion 10^(coord + scope * log (rs/r0)
float getConcentration(float rs_ro_ratio)
{
	return pow(10, coord + scope * log(rs_ro_ratio));
}
Si te ha gustado esta entrada y quieres leer más sobre Arduino puedes consultar la sección tutoriales de Arduino

Descarga el código

Todo el código de esta entrada está disponible para su descarga en Github.



4.8 12 votes
Article Rating

Anuncio:

Previous Reloj y calendario en Arduino con los RTC DS1307 y DS3231
Next Detector de metales con Arduino y sensor inductivo
36 Comments
oldest
newest
Inline Feedbacks
View all comments
Leonardo
6 years ago

Hola Luis! Muy buen material.. Muchas felicitaciones por todo tu trabajo!
Permitime hacerte dos consultas.. Es correcto colocar X0 en 100? Dado que se muestra que está fuera de rango dicho punto en la gráfica. Como efectuaste la regresión logaritmica?
Saludos! Leonardo

luisllamas
6 years ago
Reply to  Leonardo

Porque son los valores para mi sensor, una vez calibrado. Disculpa, culpa mía por no haberlo explicado bien. He cambiado los valores para que parezcan los del Datasheet del MQ-2 sin calibración, y añadido dos comentarios en la entrada para que quede más claro. Respecto a la regresión logarítmica y la calibración solo puedo decir… ¡uffff, que mal recuerdo tengo de este sensor! Con un medidor de gases de combustión (de los que se usan para medir el rendimiento de una caldera), ajustando con una hoja Excel, .. no había forma de que ninguno de los dos dieran un punto… Read more »

Leonardo
6 years ago
Reply to  luisllamas

Muchísimas gracias Luis! Estoy pasando por una situación muy semejante, estoy haciendo una especie de datalogger sobre un tipo de estufa rusa.. creo que almacenaré los datos del ADC para procesarlos fuera y no perder las mediciones.. Muchísimas gracias nuevamente y felicitaciones por tu trabajo.. Da muchísimo gusto leer tus artículos, realmente hubiera sido muy bueno haberlos tenido de soporte varios años atrás.. Saludos desde Argentina!

Sebastián
6 years ago

Demasiado agradecido por tu labor. Estaré atento a tus proyectos y recomendaré este sitio. De nuevo gracias.

Santy Media
6 years ago

Muy Agradecido!! Gran Trabajo!!

Andres Scabuso
6 years ago

Eternamente agradecido. Realmente me sirvio demasiado.

luisllamas
5 years ago

Si, hasta 800mW. Estos sensores lleva un calentador y consumen una barbaridad. En general, tienes que usar alimentación independiente.

Sebastian
5 years ago

Hola alguno sirve para gas refrigerante de aire acondicionado?

Javi
5 years ago

Hola, hay una errata en el codigo,

donde dice…….lectura analogica;

bool raw_adc = analogRead(MQ_PIN);

es…..

float raw_adc = analogRead(MQ_PIN);

PigmaDominguez
5 years ago

Hola buen día, muy interesante tu post, ¿Me podrias Apoyar a calibrar el sensor mq-135?, Empiezo a trabajar con el sensor Mq135 y necesito leer Amoniaco.

No entiendo bien lo de la regresión y seguir la grafica del Datasheet.

espero me puedas apoyar.

LourdesT
5 years ago

hola que tal? buen material, como fijaste los valores de R0 y RL?

Grimaldo
5 years ago

Saludos, Luis. Te quiero consultar si este sensor sirve para detectar concentraciones de CO2 de 5% del total de gas en un ambiente cerrado, si es fiable o necesito otro sensor que sea mas específico. Gracias, Saludos.

Emanuel
5 years ago

Hola Luis, excelente material, muy buen trabajo, te hago una consulta
Como Calculaste o de donde sacaste los Valores de RL_VALUE y R0 :
const int RL_VALUE = 5; // Resistencia RL del modulo en Kilo ohms
const int R0 = 10; // Resistencia R0 del sensor en Kilo ohms

Ernesto
5 years ago

necesito hacer el programa de sensor de gas con lectura análogica de arduino uno que indique la concentración de gases mediante 4 leds.
de diferente color 1 verde(seguro), dos amarillos(primera y segunda precaucion), y rojoy cuando este en rojo que encienda la alarma. alguien que me ayude?

Miguel
4 years ago

Luis. Felicidades !!
Tengo una duda.

Podemos almacenar los datos de un sensor (por ejemplo monoxido de nitrogeno) en ua targeta SD o similar. Para luego descargar los datos medidos??

Joel
3 years ago
Reply to  Miguel

Hay sensor que mida el Dióxido de Nitrógeno y de Azufre para Arduino? Saludos

ziceck
4 years ago

Qué concentración es la que está leyendo? en la gráfica se muestran varias, pero no entendí la concentración de que gas es la que se calcula en el ejemplo.

Gustavo
4 years ago

hola casi no se de esto me podrían ayudar con la función de transferencia de el sensor mq-9 o saber cuantas pmm tengo por cada mini voltio o algo asi

Covadonga Gutiérrez
4 years ago

Hola: Soy profesora de Secundaria de la especialidad de Física y Química y me ha resultado muy interesante tu entrada porque me encuentro en la actualidad involucrada en un proyecto con estudiantes consistente en el lanzamiento de globos a la estratosfera con diferentes finalidades; una de las que nos estamos planteando es la de medir la composición del aire o la concentración de alguno de sus componentes en función de la altura. Lo que publicas aquí me resulta especialmente útil aunque me gustaría saber también si conoces el caso de algún análisis o proyecto en que lo hayan utilizado para… Read more »

Álvaro Rodrigo Henríquez Pacheco
4 years ago

Buenas, excelente página, me queda la duda de ¿cómo determinaste que Ro era 10?
Por lo que veo en el programa para medir la concentración solo utilizaste 2 puntos de la curva del datasheet, ¿esto no afecta en la exactitud de la medición?.

Saludos!

Zully
4 years ago

Disculpa Luis una consulta, en qué unidades te arroja la concentraciones, y como es que llevaste a cabo tu calibración del sensor pues utilizando esas líneas de código para el mismo tipo de sensor me dan valores muy grandes.

Javier
4 years ago

Hola Luis, muy bueno todo tu trabajo!! estoy intentando configurar el sensor MG811 para lectura de CO2 pero no encuentro un datasheet decente.
Tienes algo hecho para este sensor?
Muchas gracias y saludos

Adrian
4 years ago

Gran trabajo Luis. Me gustaría saber de donde sacas la ecuación de cálculo de Rs. Estoy haciendo un proyecto y me gustaría poder demostrar-la. Gracias por tus explicaciones

Antonio Solé Díaz
4 years ago

Hola Luis En primer lugar: gracias por la plataforma es gratificante encontrar lugares como este. Escribo porque estoy redactando un proyecto de electricidad para alumbrado de un Local de venta de carbón y tras analizar si tiene o no riesgo de explosión según REBT ITC 29 he concluido que no, pero quiero establecer unos límites en función del polvo de carbón presente en la atmósfera. Argumento que el local no es de riesgo de explosión por presencia de polvo inflamable si este se mantiene por debajo de unos valores. Yo soy desconocedor de arduinos pero el promotor de la actividad… Read more »

Roberto
4 years ago

Hola Luis. Sigo fervientemente tu blog porque es fantástico.
Mi nivel de comprensión no es muy alto y no se como interpretar lo de ajustar los valores a los sensores.
He utilizado el Sketch de lectura analógica para los sensores MQ_2, MQ_7, MQ_9 y MQ_135.
Los valores que obtengo en ambiente limpio son respectivamente: 105, 75, 42 y 57
Y para lectura de concentración: 5163, 2697, 1565 y 2040
¿Cómo utilizo estos valores para establecer una alarma a partir de un valor X?
Ya se que no se puede exigir una fidelidad absoluta, pero para jugar un poco….
Gracias

Cristhian Gomez
4 years ago

si aun sigue en función:
quisiera saber si me pueden ayudar como se calcula el benceno

Jaime
4 years ago

Hola buenas.
Está muy guay la guía, pero me surgió una duda.
Si quisieras mandar una alarma cuando detecta el sensor a tu teléfono o a un servidor ¿Cómo sería?

Bego
3 years ago

Hola! Estoy realizando un proyecto y me gustaría que el sensor detectara el nivel de etileno, ¿qué sensor debería utilizar? Muchas gracias

Pedro
3 years ago

Hola Luis. Te quiero felicitar por tu página. Has hecho un trabajo increíble. Se me ha pedido crear un proyecto para un colegio que mida los valores de VOC (compuestos orgánicos volátiles), aldehídos, NO, NO2, O3, SO2, CO2 y CO, a parte del clásico temperatura, humedad y partículas en suspensión. Para los primeros, VOC, Aldehídos, NO, … he estado buscando algún shield que abarcase todos, pero me temo que no existe nada parecido y habría que usar un sensor para cada cosa (8 elementos, 8 sensores…). ¿Es eso cierto? O existe algún shield que englobe todos… Muchas gracias. Te estaría… Read more »

Fede
2 years ago

Hola solamente quería felicitarte por el post, y el sitio en general. Tienen excelentes desarrollos y explicaciones. Gracias!

Sensor BME680; medir la calidad del aire. – Haciendo Hardware con Software
1 year ago

[…] obstante existen sensores específicos para el CO2 y si estamos intentando algo tan serio como controlar la ventilación en un aula es recomendable […]

José
1 year ago

Luis, gracias bien explicado se me hace un poco complicado que pantalla utilizar para lectura del co2 en arduino uno gracias