Módulo MQ-135 Sensor de Gas - Medidor de gases nocivos (CO2 entre otros) con módulo lcd i2c

 Buenas!

En esta entrada vamos a estudiar cómo fabricar nuestro propio medidor de CO2 y otros gases nocivos con un sensor específico para ello y nuestro Arduino UNO.

Sensor MQ135

El sensor en concreto es el MQ-135. Es un sensor analógico que se basa en un componente electroquímico que cuando se calienta incrementa  la temperatura interna y de esta manera puede reaccionar a la exposición de  los gases provocando un cambio en el valor de la resistencia, ya que el sensor se comporta como una resistencia.  Debido a este componente electroquímico es preciso esperar un tiempo para que la salida de la medición sea lo más precisa según se especifica en el datasheet sobretodo tras un largo período de inactividad.

 

Detalle del sensor MQ-135

Permite detectar algunos gases (peligrosos) como Amoniaco, Dióxido de Nitrógeno,  Dióxido y Monóxido de carbono. El sensor puede detectar concentraciones de gas entre 10ppm y 1000ppm (Partes por millón (ppm) es una unidad de medida con la que se mide la concentración) 

Las especificaciones del modelo que he adquirido para hacer este proyecto son las siguientes

  • Operating voltage: 5V
  • Operating current: 150mA
  • Power consumption: 900mW
  • Load resistance: 20kΩ
  • Heater resistance: 31Ω+5%
  • Sensing resistance: 2kΩ - 20kΩ
  • Preheat time: 24h (lo cual quiere decir que debemos dejarlo encendido por primera vez 24 horas de forma contínua, y posteriormente una vez lo apaguemos cuando vayamos a encenderlo, esperar unos 15 minutos antes de comenzar las lecturas). "For the best detecting results, gas sensor has to be preheated. The best preheat time for the sensor is above 48 hours. For the detailed information about the sensor specifications, refer to the datasheet."
  • Concentration scope: 200 – 10000ppm (parts per million)
  • Output: analog, digital
  • Dimensions: 33x21x22mm (1.3x0.8x0.9in) 
Si nos vamos al datasheet podemos leer "Resistance value of MQ-135 is difference to various kinds and various concentration gases. So,When using this components, sensitivity adjustment is very necessary. we recommend that you calibrate the detector for 100ppm NH3 or 50ppm Alcohol concentration in air and use value of Load resistance that( RL) about 20 KΩ(10KΩ to 47 KΩ)."

Importancia de la medición de CO2

De manera general existen una serie de niveles medidos en ppm que describen la pureza del aire que respiramos basándonos en los niveles de Co2, como se describe aquí que son los siguientes:

  • Entre 250-400ppm  Es la concentración normal en el aire en el exterior
  • 400-1,000ppm  Concentración típica de espacios interiores ocupados con una buena ventilación
  • 1,000-2,000ppm  Aire pobre, somnolencia.
  • 2,000-5,000 ppm   Dolores de cabeza, somnolencia, sensación de aire cargado, pérdida de atención, incremento de latidos del corazón y ligeras sensaciones de naúseas.
  • 5,000   Límite de exposición en el trabajo (8 horas).
  • >40,000 ppm   La exposición puede derivar en falta de oxígeno suficiente y por tanto fallo cerebral, coma,  

En concreto en el contexto actual y siguiendo las recomendaciones de la "Guía para ventilación en aulas" proporcionadas por el Instituto de Diagnóstico Ambiental y Estudios del Agua, IDAEA-CSIC Mesura  en España, donde una de las medidas para prevenir el potencial contagio es la "Ventilación o purificación del aire, para eliminar o reducir la concentración de virus en el aire"

La concentración de CO2 en espacios interiores cerrados aumenta rápidamente en presencia de personas, que exhalan CO2 al respirar. La renovación de aire con aire exterior reduce las concentraciones de CO2 en el interior

Existen métodos para medir la ventilación en un espacio concreto, que se basan en medidas de CO2. En el aire exterior, las concentraciones de CO2 son de aproximadamente 420 ppm. En interiores, en espacios ocupados, las concentraciones de CO2 son elevadas por el CO2 exhalado por los ocupantes. Dichas concentraciones se pueden utilizar para calcular la renovación de aire en un espacio y condiciones dadas.

En el exterior la concentración 'normal' de CO2 suele rondar los 400 ppm (partes por millón). En un aula, los niveles normales de dióxido de carbono deben estar entre los 500 ppm y los 700 ppm: si se superan hay que ventilar de forma inmediata.

Nota: Indicar que esta entrada del blog presenta un proyecto que puede dar solución a la medición de CO2 en ppm pero que carece de la fiabilidad de un equipo ya pensado para ello, de los que se pueden conseguir en almacenes online, por ello se recomienda en caso de necesidad adquirir uno certificado y comprobar los valores de medición dados por este proyecto y no confiar ciegamente en la información aquí proporcionada, es una aproximación a la solución pero no podemos descartar que sea lejana a la realidad. No te fíes de la salida de este sensor y usa esta información bajo tu propio riesgo y responsabilidad.

En concreto hay al menos los siguientes puntos:

  • Para el calibrado del sensor según las gráficas que se detallan en el datasheet se parte de un valor de temperatura y humedad uniformes  y es preciso realizarlo en el exterior
  • Si estás buscando precisión, lo mejor es calibrarlo con un instrumento
  • Este sensor no mide solo CO2 sino también la concentración de otros gases, por lo que si existen distintas fuentes de emisión de gases el valor proporcionado puede que no corresponda a la realidad. 
  • Una alimentación de Arduino por debajo de 7 Voltios, por ejemplo 5 Voltios, puede causar que los niveles de 5 V de la placa varíen, fluctúen o caigan causando inestabilidad y lecturas análogas inexactas cuando se utilice analogRead() en su programación. Por lo que se recomienda alimentar el microcontrolador con 7V al menos.

 

Diagrama de conexión

Para facilitar la visualización de los resultados de la conexión haremos uso del módulo LED 16X2 i2c .

La dirección I2C por defecto del módulo puede ser 0x3F o en otros casos 0x27. Es muy importante identificar correctamente la dirección I2C de nuestro modulo, pues de otra forma nuestro programa no funcionará correctamente, para saber qué dirección tiene podemos ejecutar un sketch

Para conectar el módulo LCD i2c con  Arduino solo utilizamos los pines I2C del Arduino (SDA y SCL) y alimentación (GND y 5V), los pines I2C varían de acuerdo al modelo de Arduino para el arduino UNO que es con el que trabajamos por defecto en este espacio son las entadas analógicas A4 y A5.

En cuanto al módulo medidor de gases lo conectaremos al pin digital numero 2 en la salida D0 o DOUT (digital) depende del modelo o a A0 o AOUT si queremos establecer medidas selectivas del componente a medir por niveles. El resto de conexiones es para alimentar a 5 V según las especificaciones del módulo en su datasheet VCC y a referencia GND de Arduino. También se pueden combinar las dos entradas, aunque la digital no nos servirá para nuestro propósito en este proyecto.


Detalle de la conexión de los módulos de medición de gases a pin digital y lcd i2c con Arduino UNO.


 En este caso el valor de la salida será HIGH o LOW si el sensor supera los umbrales marcados por el potenciómetro (botón que gira con destornillador de estrella aumentando la sensibilidad -izquierda- o disminuyéndola - derecha) que se encuentra en la parte trasera de la placa, es decir si detecta el gas obtenemos el valor HIGH, pero no podemos detallar cuánta cantidad.

Si elegimos conectar la salida analógica como es el caso de la siguiente figura,
 
Detalle de la conexión con salida analógica del sensor de gas

Podremos establecer umbrales de detección mediante código, para ello debemos "traducir" el valor dado por el sensor a ppm, para lo cual es preciso disponer de una serie de datos y realizar la calibración de nuestro módulo sensor de gas.

Calibración del sensor de gas

La primera vez que conectemos el sensor a 5V y GND, deberemos de dejarlo al menos 24 horas en funcionamiento sin desconectarlo. 
 
A continuación hay que realizar un calibrado del sensor para tener seguridad en la obtención de una referencia adecuada en la medición. Según se indica en el datasheet:
 
"we recommend that you calibrate the detector for 100ppm NH3 or 50ppm Alcohol concentration in air and use value of Load resistancethat( RL) about 20 KΩ(10KΩ to 47 KΩ)."

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
 
Existe una librería que podemos descargar para poder leer los valores más fácilmente, MQUnifiedSensor. Y un ejemplo que nos permite hacer uso del MQ-135.  Sin embargo esta librería parece ser que solo permite explotar los datos a través del monitor serie, lo cual no nos interesa, de momento.

En resumen existen varias variables y constantes que se especifican en el datasheet
  • RL: o la resistencia de carga con un valor de 20000 ohm según las especificaciones del fabricante a quien se lo hayamos comprado (mirar el datasheet) aunque puede oscilar entre 10k y 20k según el datasheet.
  • RS: o la resistencia variable que se calcula en cada iteración de acuerdo a una fórmula que veremos a continuación
  • a, factor de escala, que se extrapola en base a la curva de la función que mide las ppm de NH3, es un valor constante
  • b, exponente que también se extrapola, es un valor constante
  • ppm: partes por millón
  • R0: el valor de la resistencia cuando se expone el sensor a una concentración específica de gas.
La fórmula es

La medida del sensor no nos da directamente las ppm que es lo queremos mostrar para tener una referencia exacta, por lo que hay que realizar el cálculo.

Por otro lado Ro es una constante que equivale al valor de la resistencia del sensor cuando se lo expone a una concentración específica de gas que se está midiendo. En nuestro caso para CO2 es la medida del sensor a 100 ppm de NH3.

La única opción es realizar el cálculo aproximado por nosotros mismos con el sensor encendido 24 horas la primera vez que se utiliza, y tomando valores promediados para extrapolar el valor correcto de Ro.Podemos obtener Ro despejando la ecuación anterior para obtener :
 
a y b son constantes conocidas que podemos obtener de las regresiones de las ecuaciones (en el código tenemos ya unas de referencia), Rs la calculamos (ver la sección siguiente de código) durante unos 10 minutos y obtenemos el valor medio, y ppm es la concentración más actual de Co2, lo cual podemos obtener de la medición diaria según lo que indican en el siguiente enlace 

En la siguiente sección de Código incluimos el valor para realizar esta estimación de Ro que es diferente para cada sensor que compremos y que deberemos realizar una única vez.

Código

Para el módulo lcd i2c, debemos incluir la librería (e instalarla) como hemos hecho con otros módulos en otras ocasiones

#include <LiquidCrystal_I2C.h> 

Y definir un objeto liquid crystal con la especificación del número de columnas (16) y filas (2)

LiquidCrystal_I2C lcd(0x3F,16,2); 

Todo el código en el siguiente enlace y un extracto continuación:

#include <LiquidCrystal_I2C.h>


//PANTALLA LCD_ Crear el objeto lcd  dirección  0x3F y 16 columnas x 2 filas
// Se conecta a4 y A5,
LiquidCrystal_I2C lcd(0x3F,16,2);
#define mensaje_lcd(cadena,fila,columna,acero){ if(acero){ lcd.clear();} lcd.setCursor(fila,columna); lcd.print(cadena); }
#define a 5.2735 //factor de escala
#define b -0.3503 //exponente
#define RL 20000 //Resistencia de carga de 20kohm
//#define R0 20767.17 //Resistencia constante que se ha obtenido mediante el proceso de calibración
//equivale al valor de la resistencia del sensor cuando se expone a una concentración de 100 ppm amoniaco en aire limpio
float R0 = 20767.17;

/******
 *
 * SETUP
 */
void setup() {
  // put your setup code here, to run once:
//LCD Pantalla
        lcd.init();
        lcd.begin(16,2);
      //dht.begin();
   Serial.begin(9600);
   Serial.print(F("Resistencia de carga de 20kohm: "));
   
   Serial.println(RL);
    Serial.print(F("Resistencia constante: "));
    Serial.println(R0);
 
  //Encender la luz de fondo.
  lcd.backlight();
  mensaje_lcd(F("Medicion co2"),0,0,1);
  mensaje_lcd(F("Hola!"),0,1,0);
  delay(4000);
  mensaje_lcd(F("Calibrando..."),0,1,0);
  R0 = calibracionR0(); //solo se realiza una vez, después comentar
 
 
 
  mensaje_lcd(F("Co2: "),0,0,1);
 /*
    Exponential regression:
  GAS      | a      | b
  CO       | 605.18 | -3.937  
  Alcohol  | 77.255 | -3.18
  CO2      | 110.47 | -2.862
  Tolueno  | 44.947 | -3.445
  NH4      | 102.2  | -2.473
  Acetona  | 34.668 | -3.369
  */
 
 
}

void loop() {
 mensaje_lcd(promediolectura(R0),5,0,0);
 mensaje_lcd(F("ppm"),13,0,0);
 
}

...

Por último se han tenido en cuenta los valores mínimo y máximo en la relación entre R0 y RS en base a la gráfica de CO2, valores que ha calculado David Degironi

Proyecto en funcionamiento

En esta imagen podemos observar como el lcd nos muestra la medición del gas que también obtenemos a través del monitor serie, cada media de 5 segundos, después del calibrado y de un precalentamiento (encendido) del sensor de al menos 24 horas, aunque se recomiendan 48 horas para valores más definido

Detalle de la placa, módulo sensor y lcd
 

Como referencia de los valores aproximados que nos puede dar en distintos ambientes dejo en este enlace una noticia en la que se lleva a cabo la medición en varios entornos, etc

Y esto es todo, espero que os haya resultado útil,

Un saludo

Referencias

  • http://davidegironi.blogspot.com/2014/01/cheap-co2-meter-using-mq135-sensor-with.html#.X9fqbrOCGRT 
  • http://davidegironi.blogspot.com/2014/01/cheap-co2-meter-using-mq135-sensor-with.html#.X9fY37OCGRS
  • https://www.naylampmechatronics.com/blog/42_Tutorial-sensores-de-gas-MQ2-MQ3-MQ7-y-MQ13.html
  • https://rufianenlared.com/mq-135/ 
  • https://blog.robberg.net/mq-135-arduino/
  • https://hackaday.io/project/3475-sniffing-trinket/log/12363-mq135-arduino-library
  • https://www.niusdiario.es/sociedad/sanidad/un-dia-midiendo-co2-exhalado-lugares-mas-riesgo-contagio_18_3063120331.html

Comentarios

  1. buen dia gracias esta en algun lado el codigo para cargar

    ResponderEliminar
  2. Buenas, lo tienes disponible en el enlace https://github.com/JaviArdPro/MedidorCO2/blob/main/sensorCO2-lcd.ino dentro de la sección Código de esta entrada, Un saludo

    ResponderEliminar
  3. Anónimo07:05

    hola en el codigo de arduino me tira este error :LiquidCrystal_I2C:No suchfile or directory

    ResponderEliminar
  4. Buenas, parece o tiene la pinta de que la librería no está correctamente instalada, prueba una versión anterior, saludos

    ResponderEliminar

Publicar un comentario

javi-ard-pro.blogspot.com te informa que los datos de carácter personal proporcionados serán tratados por javi-ard-pro.blogspot.com como responsable de esta web.
Finalidad de la recogida y tratamiento de los datos personales: poder responder al interesado. Legitimación: consentimiento del interesado. Derechos: podrás ejercer los derechos de acceso, limitación, rectificación y supresión en registro.d.todo@gmail.com