Revista 100% Verde

Monitor de Co2 con sensor mh z19

Por Soloelectronicos @soloelectronico
¿Alguna vez se ha preguntado por qué a menudo se siente somnoliento o incluso cansado por la mañana después de dormir toda la noche? Hay muchas cosas que pueden provocar un sueño de mala calidad, pero dada la grave pandemia al que nos estamos exponiendo desgraciadamente, también hay otra razón contundente: una mayor exposición a agentes virulentos al no estar suficientemente ventilado la estancia . En efecto , ambas casuísticas citadas se deben a una concentración inadecuada de dióxido de carbono (CO2) puesto que las personas emiten dióxido de carbono durante la respiración , lo que implica que la concentración de CO2 es uno de los principales factores que afectan la calidad del aire y con ello la exposición a agentes infecciosos. Por estas razones según los científicos apuntan que puede ser interesante contar con un medidor de CO2 para comprender si la concentración de CO2 en nuestro entorno como afecta la calidad del aire. Una concentración menor de 800 ppm se considera adecuada, aunque lo ideal es que ronde las 500 ppm. A partir de 800 ppm salta la alerta ya que la ventilación es deficiente, lo que facilita en gran medida la permanencia del virus en el aire, de tal forma que su capacidad de transmisión puede prolongarse durante varias horas. Estos medidores se pueden comprar ya montados, pero no dispondremos ningún nivel de mejora ni personalización ni interacción y los de bajo coste además ofrecen muy poca precisión , por lo que vamos a ver como construir un medidor real para que entendamos como funciona y de paso podemos pensar en futuras mejoras .

La elección del sensor

En un prototipo puede que se vea tentado en usar sensores del tipo MQ135 , un sensor de calidad de aire barato) , que detecta NH3, NOx, alcohol, benceno, humo, CO2 y que hemos visto en numerosos proyectos en este blog.

Este tipo sensores son módulos listo para usar para Arduino y Raspberry Pi gracias a su doble salida analogica y digital (para el uso con laRPi se requiere un convertidor AD adicional a no ser que solo necesite la señal de haber superado el umbral ajustable de disparo de la señal digital ,pero para Arduino la conexión es directa ).

Monitor de Co2 con sensor mh z19

Los sensores de la serie MQ utilizan un pequeño elemento calefactor con un sensor electrónico-químico por lo que son sensibles a una amplia gama de gases y son adecuados para su uso en interiores. Es cierto que tienen una alta sensibilidad y un tiempo de respuesta rápido, pero tardan unos minutos en dar lecturas precisas porque el sensor tiene que calentarse.

Estos sensores son muy fáciles de de usar para medir la concentración de GLP, i-butano, propano, metano, alcohol, hidrógeno y humo en el aire, midiendo concentraciones de gas de 100 a 10000 ppm siendo ideal para la detección de fugas de gas, alarmas de gas u otros proyectos de robótica y microcontroladores.

Según el fabricante en general este tipo de sensores tienen relativa poca precisión incluso después de aplicar la corrección de temperatura y humedad. Además suelen tener un alto consumo de energía (800 mw) y un tiempo de precalentamiento excesivo lo cual son bastantes inconvenientes para abandonarlo y probar con otro tipo de sensor.

Monitor de Co2 con sensor mh z19

Hay bastantes sensores de CO2 en el mercado de precios muy variados: MG811 (~ 40 $), MH-Z14 WINSEN (~ 40 $), MH-Z19 WINSEN (~ 30 $), K-30 (~ 85 $), VERNIER CO2-BTA ( ~ 330 $).

Los sensores de CO2 NDIR (infrarrojo no dispersivo) son el tipo de sensor más común utilizado para medir el CO2, pues tienen buena precisión y bajo consumo de energía aunque los precios son muy variados.

Un ejemplo de sensor NDIR es el sensor MH-Z19 tiene buenas características y muy buen precio, así que puede ser una buena opción. Aquí algunos parámetros técnicos del sensor MH-Z19 :

Este sensor e pequeña escala de uso general utiliza el principio infrarrojo no dispersivo (NDIR) para detectar la presencia de CO2 en el aire, con buena selectividad y dependencia anaerobia, larga vida y cuenta con compensación de temperatura incorporada y al mismo tiempo salida en serie, salida analógica y salida PWM. Además, tiene un precio contenido (en amazon unos 14€)

Hay varias variantes de este sensor con diferentes rangos de medición:

Una opción interesante es la primera porque el modelo B es el más extendido y fácil de conseguir, si bien un nivel de CO2 superior a 2000 ppm no sería apropiado para un ambiente doméstico.

Puede ser interesante montar un dispositivo móvil para poder medir el nivel de CO2 donde quiera dentro del hogar , puesto que como el voltaje de trabajo del MH-Z19 es de 4.5 ~ 5.5V DC, puede usarse la salida USB standard o simplemente 3 baterías AA ) como fuente de alimentación.

Respecto a la visualización de los datos una pantalla OLED LCD 0.96 "I2C IIC SPI Serial 128X64 (en amazon unos 9€) es una buena opción pues es muy fácil usarla con nuestro Arduino gracias a la conexión I2C , y claro las librerías gratuitas para Arduino

Monitor de Co2 con sensor mh z19

Para poderla usar en nuestro proyecto , es importante tener en cuenta que necesitaremos la biblioteca de controladores oled Adafruit SSD1306

Respecto al conexionado , no puede ser más sencillo, pues conectaremos la alimentación del sensor ,la pantalla y nuestro arduino a través de un interruptor al polo positivo de un portapilas de 3 pilas de 1.5V. Obviamente complementaremos las conexiones de VCC con las masa (0v) conectando el polo negativo del portapilas a las conexiones de 0v del sensor ,la pantalla y nuestro arduino.

El montaje se complementará con las conexiones de datos del sensor MH-Z19 y de la pantalla , conectando la salida PWM del sensor digital al pin 7 (pin digital 7) de Arduino , y las conexiones de datos I2C de la pantalla a los pines SDA( pin 19) y pin SCL(pin 18) de nuestra placa Arduino.

Monitor de Co2 con sensor mh z19

Este es el resumen de elementos básicos de hw para hacer este pequeño proyecto:

  • Sensor de co2 infrarrojo MH-Z19 (en amazon unos 14€)
  • Arduino Pro Micro ( o cualquier otra placa Arduino que disponga)
  • Pantalla OLED LCD 0.96 "I2C IIC SPI Serial 128X64 (en amazon unos 9€)
  • Soporte de batería 3 AAA 1.5V
  • Interruptor

Implementación

Necesitaremos lo siguientes elementos software para implementar este proyecto

Respecto al proyecto, cuyo código Arduino al completo podemos ver más abajo , de forma simplificada este es su funcionamiento:

Primero importamos las librerías para el control de la pantalla I2C

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

A continuación definiremos las variables, empezando definiendo el pin 7 para el pwm para el sensor de Co2, constantes, etc destacando el valor del precalentamiento para el sensor de co2 cuyo valor es de 120 segundos

#define pwmPin 7
int preheatSec = 120;
int prevVal = LOW;
long th, tl, h, l, ppm = 0;

Ahora veremos la parte esencial , cuya principal ocupación es proporcionar el valor de la medida de C02 en la variable ppm

Otra función importante es la inicialización de la pantalla OLED , que conseguiremos al introducirla en la función setup

void setup() {
Serial.begin(115200);
pinMode(pwmPin, INPUT);
attachInterrupt(digitalPinToInterrupt(pwmPin), PWM_ISR, CHANGE);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 128x64)
display.setTextColor(WHITE);
}

Dado el intervalo de precalentamiento , es interesante una función que presente la cuenta atrás para que el usuario sea consciente de que es necesario esperar ese intervalo:

void displayPreheating(int secLeft) {
display.setTextSize(2);
display.println("PREHEATING");
display.setTextSize(1);
display.println();
display.setTextSize(5);
display.print(" ");
display.print(secLeft);
display.display();
}

Obviamente tampoco nos puede faltar la visualización del nivel de ppm , que solo se mostrará si es inferior a 1000 ppm.

void displayPPM(long ppm) {
display.setTextSize(2);
display.println("CO2 PPM");
display.setTextSize(1);
display.println();
display.setTextSize(5);
if (ppm < 1000) {
display.print(" ");
}
display.print(ppm);
display.display();
Serial.println(ppm);
}

Finalmente en el bucle principal básicamente borraremos la pantalla ,mostraremos la cuenta atrás del precalentamiento y finalmente mostraremos el nivel de ppm cada 1000ms

void loop() {
display.clearDisplay();
display.setCursor(0,0);
if (preheatSec > 0) {
displayPreheating(preheatSec);
preheatSec--;
}
else {
displayPPM(ppm);
}
delay(1000);
}

Para terminar, IhorMelynk nos ofrece el código fuente para Arduino que el mismo cargo en su Arduino:

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
#define pwmPin 7
int preheatSec = 120;
int prevVal = LOW;
long th, tl, h, l, ppm = 0;
void PWM_ISR() {
long tt = millis();
int val = digitalRead(pwmPin);
if (val == HIGH) {
if (val != prevVal) {
h = tt;
tl = h - l;
prevVal = val;
}
} else {
if (val != prevVal) {
l = tt;
th = l - h;
prevVal = val;
ppm = 2000 * (th - 2) / (th + tl - 4);
}
}
}
void setup() {
Serial.begin(115200);
pinMode(pwmPin, INPUT);
attachInterrupt(digitalPinToInterrupt(pwmPin), PWM_ISR, CHANGE);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 128x64)
display.setTextColor(WHITE);
}
void displayPreheating(int secLeft) {
display.setTextSize(2);
display.println("PREHEATING");
display.setTextSize(1);
display.println();
display.setTextSize(5);
display.print(" ");
display.print(secLeft);
display.display();
}
void displayPPM(long ppm) {
display.setTextSize(2);
display.println("CO2 PPM");
display.setTextSize(1);
display.println();
display.setTextSize(5);
if (ppm < 1000) {
display.print(" ");
}
display.print(ppm);
display.display();
Serial.println(ppm);
}
void loop() {
display.clearDisplay();
display.setCursor(0,0);
if (preheatSec > 0) {
displayPreheating(preheatSec);
preheatSec--;
}
else {
displayPPM(ppm);
}
delay(1000);
}
Teniendo esto en cuenta, a la hora de mantener el contacto social los espacios al aire libre se presentan como la mejor alternativa. En espacios cerrados la ventilación es fundamental. No es suficiente con abrir las ventanas 10 minutos cada hora. La ventilación debe ser constante. Por supuesto, en ambos casos la mascarilla sigue siendo un elemento de protección esencial.

Volver a la Portada de Logo Paperblog