LibreCO2: Medidor de CO2 usando Arduino UNO y un sensor de CO2 comercial (SenseAir S8, Sensirion SCD30, Winsen MH-Z14 o MHZ-19 o Cubic CM1106).
Esta es una versión básica de un medidor de CO2 de bajo costo con los materiales más comunes del mercado: Arduino UNO y los 4 sensores de bajo costo de CO2 más populares: SenseAir S8, Sensirion SCD30, Winsen MH-Z14 o 19 y Cubic CM1106. LibreCO2 usa un Arduino UNO, pero puede extenderse al MEGA o nano, por ser muy popular en escuelas y frecuentemente usado en las clases de tecnología o electrónica y la mayoría de escuelas tienen muchos de ellos.
El código del Arduino es lo más sencillo posible y puede programarse cargando el archivo .hex con el programa Xloader y así no necesitarías instalar el software Arduino para compilar y programar el código. Si buscas un sensor más avanzado y con conectividad por Bluetooth o por Wifi puedes encontrar un listado interesante al final de esta guía con varias iniciativas abiertas que incluye CanAirIO con conectividad Bluetooth y Wifi. LibreCO2 usa los componentes más populares del mercado, así no sean los más avanzados, y el armado más sencillo posible sin necesitar el uso de cautín y soldadura de estaño.
Todos los sensores usados aquí son NDIR que es el estándar actuales para mediciones reales de CO2:
https://www.co2meter.com/blogs/news/6010192-how-does-an-ndir-co2-sensor-work
Además se ha agregado la compensación de la altura sobre el nivel del mar a la que tomamos la medición. Es muy importante activar este ajuste por encima de los 1000 metros pues el margen de error sería superior al 11%:
Altura sobre el nivel del mar (m) | Porcentaje de error (%) |
---|---|
0 | 0 |
500 | 6 |
1000 | 11 |
1500 | 16 |
2000 | 21 |
2500 | 26 |
3000 | 30 |
3500 | 34 |
1. Materiales y CoNexiones:
Existen dos opciones para el armado de sensor, la más sencilla es usando un Escudo Multifunción (Shield) de Arduino el cual ya incluye el Display de 4 dígitos, el buzzer y los botones, con lo cual se facilita mucho más el montaje. La segunda armando las partes por individual.
1.1. Opción con Escudo multifunción:
1. Escudo multifunción (Arduino Shield multifunction).
El Escudo tiene un bug o error que puede cortocircuitarlo con el conector USB, corte los pines que se muestran en la foto y agregue un trozo de cinta al conector USB (que también se muestra en el video):
Link compra Aliexpress, Link compra Colombia, Compra Latinoamérica: Mercadolibre o tiendas de electrónica.
2. Arduino UNO cualquier versión.
Sirve el original Arduino Italiano o las versiones chinas, la diferencia está en la instalación del driver. El que llaman “Original” a la izquierda y la copia o clone a la derecha:
Link compra Aliexpress, Link compra Colombia, Compra Latinoamérica: Mercadolibre o tiendas de electrónica.
3. 4 cables jumper hembra hembra.
Link compra Aliexpress, Link compra Colombia, Compra Latinoamérica: Mercadolibre o tiendas de electrónica.
4. Sensor, opciones:
4.1. SensEAIR S8
El mejor en relación costo/beneficio. Traído desde China por Aliexpress cuesta 28 dólares y desde USA 44 dólares, es el más recomendado y su costo es bajo. Además tiene el referente de ser la misma marca de sensor que usa los afamados medidores Aranet 4 de 200 euros de precio (https://kaspars.net/blog/aranet4-teardown).
Link desde Aliexpress China: https://es.aliexpress.com/item/4000884582128.html
Link desde Digikey USA: https://www.digikey.com/es/products/detail/senseair-north-america-inc/004-0-0053/10416532
A favor: excelente precio, muy buen desempeño (aceptable velocidad y fiel), rápido envío desde USA y envío gratis desde China.
En contra: necesita soldadura para conectar los pines o cables.
4.2. Sensirion SCD30
El más costoso (52 dólares) pero en nuestras pruebas el de mejor desempeño. Sensirion tiene distribuidores en USA y Europa que envían a Latinoamérica. Ejemplo: https://www.mouser.com/ProductDetail/Sensirion/SCD30/?qs=rrS6PyfT74fdywu4FxpYjQ%3D%3D
A favor: excelente desempeño (rápido y fiel), rápido envío en USA y Europa y envíos a Latinoamérica.
En contra: precio (52 dólares).
Para la conexión del Arduino al sensor Sensirion se usa el protocolo Modbus ya que este nos permite conectar directamente el Arduino al SCD30 sin necesidad de drivers de datos que complicarían mucho el montaje. Sólo debes conectar el pin SEL al VIN del sensor usando una resistencia de 100 kΩ (kilo ohmnios) como se vé explica en el video explicativo adelante para habilitar el modo Modbus.
4.3. Winsen MH-Z14 o 19.
El más barato y popular, buen desempeño, algo lento. Ten cuidado con las falsas copias del sensor!!!
A favor: desempeño aceptable (lento comparado al Sensirion, fiabilidad media), bajo costo (18 dolares con envío incluido desde China por Aliexpress).
En contra: tiempo de envío variable con Aliexpress desde China (20 días a mes y medio), falsificaciones (ten cuidado, sólo compra de la tienda Oficial de Aliexpress).
DE NUEVO: sólo compra el MH-Z19 de la tienda de distribución de Winsen en Aliexpress, el mercado está invadido de falsas copias, más información en: https://emariete.com/sensores-co2-mh-z19b-falsos/ o en ingles en: https://youtu.be/5_QQe75-SZI
Venta de versiones originales en la página del fabricante en Aliexpress: https://es.aliexpress.com/item/1005001865093513.html
4.4. Cubic CM1106.
La última opción porque el distribuidor de China vende sólo unidades recuperadas de segunda mano y de vez en cuando están agotados, son muy baratos y su desempeño es aceptable. https://www.aliexpress.com/item/4001082699057.html
Conexiones para cada sensor:
SenseAir S8 sensor
GND —> G0 Pin 2 de la regleta de 4 pines
+5 —> G+ Pin 1 de la regleta de 4 pines
5 —> Pin 2 de la regleta de 5 pines
6 —> Pin 3 de la regleta de 5 pines
Sensirion SCD30
PIN del Escudo —> Sensor
GND —> GND
+5 —> VIN
5 —> RX/SDA
6 —> TX/SCL
Winsen MH-Z19B sensor
GND —> GND
+5 —> VIN
5 —> RX
6 —> TX
Winsen MH-Z14A sensor
GND —> Pin 5 or 16 del conector
+5 —> Pin 4 o 17 del conector
5 —> Pin 3 o 18 del conector
6 —> Pin 2 o 19 del conector
Cubic CM1106 sensor
GND —> G Pin 2 de la regleta de 4 pines
+5 —> V1 Pin 1 de la regleta de 4 pines
5 —> R Pin 2 de la regleta de 5 pines
6 —> T Pin 3 de la regleta de 5 pines
Video explicativo:
1.2. Opción por partes individuales:
1.2.1. Arduino UNO original o versión china.
1.2.2. Display TM1687.
1.2.3. Jumper hembra – macho.
1.2.4. Uno o dos Pulsadores o cables (uno para la calibración, otro para el nivel de Beep).
1.2.5. Opcional: Buzzer.
1.2.6. Sensor, iguales opciones que la opción con Escudo multifunción.
Conexiones para todos los sensores:
Componente electrónico —> PIN del Arduino
Display—> PIN Arduino
CLK —> 9
DIO —> 8
VCC —> IOREF en la versión original o 5V en la copia china
GND —> GND
Buzzer
“+” —> 11
otro —> GND
Pulsador de calibración
Cualquiera —> A0
Cualquiera —> A2
Pulsador de nivel del Beep
Cualquiera —> A3
Cualquiera —> A5
Pulsador de altura sobre el nivel del mar
Cualquiera —> 2
Cualquiera —> 4
Sensor SenseAir S8
VIN Pin 1 de regleta de 4 pines —> 5V
GND Pin 2 de regleta de 4 pines —> GND
RX Pin 2 de regleta de 5 pines —> 6
TX Pin 3 de regleta de 5 pines —> 7
Sensor Sensirion SCD30
VIN —> 3.3V
GND —> GND
TX/SCL —> 7
RX/SDA —> 6
SEL —> 3.3V
Winsen MH-Z19B sensor
VIN Pin 1 de regleta de 4 pines —> 5V
GND Pin 2 de regleta de 4 pines —> GND
RX Pin 2 de regleta de 5 pines —> 6
TX Pin 3 de regleta de 5 pines —> 7
Winsen MH-Z14A sensor
Pin 2 o 19 del conector —> 6
Pin 3 o 18 del conector —> 7
Pin 4 o 17 del conector —> 5V
Pin 5 or 16 del conector —> GND
Cubic CM1106 sensor
V1 Pin 1 de la regleta de 4 pines —> 5V
G Pin 2 de la regleta de 4 pines —> GND
R Pin 2 de la regleta de 5 pines —> 6
T Pin 3 de la regleta de 5 pines —> 7
2. Programar el Firmware (código en el Arduino)
Existen 3 opciones para programar el Arduino: la más sencilla es usar un teléfono Android y un cable USB OTG, la siguiente es usar un PC con el software Xloader y la última instalando Arduino en un PC.
2.1. Teléfono Android.
- Conecta el cable USB OTG al teléfono.
- Instala la app de Android “Arduino Hex Uploader-Firmware Bin Upload”.
- Baja el archivo .hex file de este “Directorio de Google drive” basado en la versión de tu sensor (Shield y marca de sensor). Encuentra el archivo .hex que vas cargar en el Arduino, cada versión de sensor (Sensirion, Winsen or Cubic) se encuentra disponible el el directorio “hex files”. Ejemplo: “LibreCO2_Shield_Sensirion.hex” es el arhivo para el sensor Sensirion con el Shield Multifunción. Nota: No descargues el archivo .hex directamente de la página con la opción “Salvar como”, que daña el archivo. Usa solamente el enlace de Google Drive.
- Busca el archivo .hex en tú teléfono.
- Sube el código a tu tarjeta Arduino.
- FIN.
Video de programación de el Firmware:
Link compra Cable OTG USB Aliexpress, Link compra Colombia, Compra Latinoamérica: Mercadolibre o tiendas de electrónica.
2.2. Usando tu PC con el software Xloader (sólo Windows):
1. Conecta el Arduino a tu computador y espera a que el driver se instale automáticamente. Si el driver no se instala automáticamente debes identificar si tu Arduino es original o una copia:
1.1. Si el Arduino es original, instala el paquete Arduino con drivers: https://www.arduino.cc/en/Guide/ArduinoUno
1.2. Si el Arduino es copia china sigue las instrucciones de esta página web: https://learn.sparkfun.com/tutorials/how-to-install-ch340-drivers
2. Después de instalado el driver, tienes 2 opciones:
2.1. Si lo único que quieres es programar el Arduino desde Windows sin tener que ver el código y compilarlo, usa el software Xloader que se encuentra en la carpeta del mismo nombre:
A la izquierda se muestra la ventana del Xloader cuando se inicia.
2.1.1. Explora hasta encontrar el archivo .hex que vas a cargar en el Arduino. Cada versión de sensor (Sensirion, Winsen o Cubic) se encuentra disponible en el directorio “hex files”. Ejemplo: “LibreCO2_Shield_SCD30.hex” es el archivo para el sensor Sensirion SCD30 con el uso del Escudo Multifunción (Shield). No lo descargues directamente de la página con la opción “Guardar como”, eso arruina el archivo. Usa el siguiente enlace de Google drive para bajar el archivo .hex buscando tu versión de Sensor (SCD30, MHZ14_9 o CM1106) y construcción (con Shield o por Partes).
2.1.2. Selecciona la tarjeta Arduino que estas usando (Uno/ATmega328).
2.1.3. Selecciona el puerto de comunicaciones COM al que está conectado el Arduino, si no lo sabes búscalo en el Administrador de dispositivos “Puertos COM y LPT”.
2.1.4. Selecciona la velocidad Baud rate a 115200.
2.1.5. Presiona el botón “Upload”.
2.1.6. Cuando el archivo .hex file se carga en el Arduino, foto a la derecha, sale el mensaje de “xxxxx bytes uploaded”, si falla te saldrá el mensaje de “upload fails”.
3. Si quieres editar y compilar el código instala el software Arduino en Windows, Mac o Linux:
Baja el software Arduino según tu sistema operativo en: https://www.arduino.cc/en/software
La siguiente guía explica como instalar Arduino en Windows, Mac o Linux y es muy completa: https://learn.sparkfun.com/tutorials/installing-arduino-ide/all
En Youtube existen cientos de tutoriales para instalar Arduino en diferentes sistemas operativos y aprender su programación, además puedes colaborar mejorando este código o crear tu propia versión.
3. Caja para el sensor.
Opciones iniciando por la más sencilla y económica:
3.1. Caja comercial de bajo costo.
Busca una caja plástica con un ancho similar al del Arduino y un largo mayor para que en el espacio sobrante ubiques el sensor. En el espacio sobrante perfora varios huecos por dónde entre aire para el mismo, en mi caso los hice con destornillador de 4mm. Haz otro hueco para el Buzzer, para el cable USB y el adaptador y listo. Ejemplo:
Cuando quieras usar el teclado para la calibración o la programación del BEEP, abre la caja y accede al teclado para luego volver a cerrala.
Puedes acomodar cajas plásticas de diferentes tamaños, en el siguiente caso se usa una espuma debajo porque la caja es más alta, además se hacen 3 huecos de un tamaño mediano (7mm) para los 3 botones y asó poder acceder desde afuera a los botones sin necesidad de abrir la caja:
3.2. Caja en madera MDF usando corte láser.
En desarrollo.
3.3. Caja en PLA con impresora 3D.
En desarrollo.
4. Funcionamiento del sensor.
Cuando se haya realizado la programación del Arduino tenemos varios modos y opciones de funcionamiento del sensor:
4.1. Modo normal:
Al encender el sensor aparece el aviso BEEP y un número entre 700 y 1300 que muestra el nivel de la alarma que tenemos programado. En el numeral 3 se explicará cómo modificarlo. Luego de ello el medidor verifica la conexión al sensor de bajo costo. Si aparece el mensaje “good” la conexión está bien hecha y se continuará con el proceso de calentamiento del sensor (“heat”) que dura 30 segundos para los sensores Sensirion y Cubic, y 3 minutos para los Winsen. Si el mensaje es “fail” la conexión ha fallado y debemos verificar la conexión entre el Arduino y el sensor. Después de el calentamiento el valor de CO2 en partes por millón ppm, aparece en pantalla. Cuando el valor es superior al nivel Beep la alarma suena y los leds del escudo titilan.
4.2. CALI Modo Calibración:
Explicado en el video anexo. La calibración del sensor se recomienda después de armado el sensor y cuando se aprecien mediciones muy diferentes al aire libre del rango estimado de 400 ppm. Todos estos sensores de bajo costo se calibran al aire libre, colocándolos en un espacio exterior por unos minutos sin que reciban viento fuerte pues esto afecta la medición, por ello se recomienda colocarlos dentro de una caja que evite el viento directo. Luego de cumplir con estas condiciones, debes presionar el botón S1-A1 en la versión con escudo, o el “switch” en la versión por partes, durante más de 5 segundos, y aparecerá en pantalla el mensaje “cal-” y comenzando un conteo regresivo de 5 minutos para el Sensirion y Cubic y 20 minutos para el Winsen. Al finalizar este tiempo el sensor recibe la orden de calibración y queda listo para usarse de nuevo. Si quieres interrumpir el proceso de calibración presiona el botón S3-A3.
4.3. BEEP Modo cambio de nivel del umbral de alarma:
Explicado en el video anexo. Para cambiar el nivel de la alarma de 1000 ppm, por defecto, a otro valor entre 700 y 1400 ppm o para apagarlo OFF debes presionar el botón S2-A2 en la versión con escudo, o colocar un cable o interruptor adicional del pin A3 a A5 en la versión por partes, durante más de 5 segundos y aparecerá el mensaje “BEEP” y luego el valor al que esta programado. Luego debes presionar de nuevo el botón para modificar el valor, cuando lo encuentres presiona el botón S3-A3 para programar este nuevo valor de nivel del BEEP
4.4. ALTI Modo cambio del valor de altura sobre el nivel del mar:
Para cambiar el valor de la altura sobre el nivel del mar del lugar en que nos encontramos debes presionar el botón S3-A3 (ALTI) en la versión con escudo, o colocar un cable o switch adicional del pin A0 a A2 en la versión por partes, durante más de 5 segundos y aparecerá el mensaje “ALTI” y luego el valor que tiene programado. Luego debes presionar de nuevo o mantener el botón presionado aumentar el valor o presionar el botón S2 – A2 (BEEP) para disminur, cuando encuentres el valor correcto presiona el botón S1-A1 (CALI) para programar este nuevo valor de nivel de ALTI. Aparecerá el mensaje “done” confirmando el ingreso correcto del valor.