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)
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. |
![]() |
Detalle de la conexión con salida analógica del sensor de gas |
Calibración del sensor de gas
- 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.
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
buen dia gracias esta en algun lado el codigo para cargar
ResponderEliminarBuenas, 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
ResponderEliminarhola en el codigo de arduino me tira este error :LiquidCrystal_I2C:No suchfile or directory
ResponderEliminarBuenas, parece o tiene la pinta de que la librería no está correctamente instalada, prueba una versión anterior, saludos
ResponderEliminar