Desde hace un tiempo comencé a interesarme mucho en los dispositivos de medición de calidad de aire, y sobre todo para espacios confinados, porque creo que tiene un gran potencial en el mercado de IoT.

Existe una gran cantidad de sensores de calidad de aire en el mercado. Inicialmente busqué algo compacto, de bajo consumo y pre-calibrado, pensando en un prototipo portátil, simple de instalar y de bajo costo.

El primer sensor que probé fue el CCS811 de AMS, pero después de probarlo un tiempo, no logré tener medidas consistentes de calidad de aire (seguramente por algún error mío). En algún tiempo saldrá del cajón para probarse de nuevo.

Con el sensor con tuve buenos resultados desde el inicio fue el BME680 de Bosch. Habiendo probado la familia de sensores Bosch BMX (BME280, BMP280 y BMP180) la expectativa era alta, y no defraudó. Este sensor tiene capacidades de detección de temperatura (con una precisión de ± 1.0 ° C), humedad (con una precisión de ± 3%), presión barométrica (con una precisión ± 1 hPa) y gases COV.

¿Por qué es importante la detección de gases COV en espacios confinados?

Los compuestos orgánicos volátiles (COVs) agrupan a una gran cantidad de sustancias químicas que se convierten fácilmente en vapores o gases y que pueden tener diferentes efectos nocivos sobre el medio ambiente y la salud.
Según la Agencia norteamericana de Protección del Medio Ambiente (EPA), la presencia de estos elementos es entre dos y cinco veces superior en el interior de los edificios que al aire libre.

Productos como disolventes, pinturas, limpiadores, insecticidas, ambientadores, pegamentos, barnices, tintas de fotocopiadoras o impresoras, y en general, cualquiera de origen petroquímico, pueden originar estos compuestos en hogares y lugares de trabajo.

No obstante, el origen de estas sustancias proviene también de fuentes naturales. El metano es el más abundante de los hidrocarburos atmosféricos.

Con la pandemia del COVID-19, el interés por el monitoreo de la calidad de aire de espacios como oficinas, locales comerciales e instituciones educativas se potenció, por ejemplo, para identificar cuando un ambiente está poco ventilado, y actual en consecuencia (por ejemplo, regulando el sistema de Aire Acondicionado a través de alguna plataforma IoT).
También, ya hay empresa que analizan los gases COV emitidos por las personas para identificar la presencia del virus (según describen en sus estudios, las personas infectadas con COVID-19 emiten gases COV con un patrón diferente al de personas sanas).

Ahora si, la configuración del IDE de Arduino en Linux (Lubuntu 20.04 LTS)

Inicialmente lo utilicé con la librería de Adafruit, y si bien el funcionamiento fue correcto, con esta implementación, sólo devuelve una medición de resistividad en función de la calidad de aire, que no resulta fácil de contrastar/calibrar. Al menos no encontré ninguna tabla de equivalencias (respaldada por Bosch) entre resistividad y calidad de aire.

A diferencia de otros sensores, el BME680 utiliza unas librerías pre-compiladas que hay que incluir en el entorno de desarrollo para que el sketch compile. Y la cosa no termina ahí, ya que también hay que hacer algunas modificaciones a determinados archivos (ocultos) de configuración, lo que hace esta configuración un poco confusa.

En este post detallo los pasos que seguí para a compilar el ejemplo provisto por Bosch para su sensor, en el IDE de Arduino sobre Linux. Como microcontrolador utilicé el ESP8266 que viene en la placa NodeMCU V1.0, y para conectar el BME680, la placa CJMCU-680.

IMPORTANTE: Versión del IDE debe ser 1.8.9. Al momento de la publicación de este post lo probé con una versión más nueva, pero no funcionó, y tuve que hacer un downgrade del IDE para que compile.

Lo primero es descargar la librería del Sensor Bosch BME680. Puede hacerse desde su repositorio Github: https://github.com/BoschSensortec/BSEC-Arduino-library

Una vez descargada la librería, la instalamos en el IDE de Arduino. El instructivo para hacerlo está acá: https://www.arduino.cc/en/Guide/Libraries

Primero abrir el archivo “Platform.txt” que se encuentra en el directorio de instalación del IDE de Arduino.

En Linux, si el IDE de Arduino se instaló en /opt, el path al archivo es el siguiente:

/opt/arduino-1.8.9/hardware/Arduino/avr/platforms.txt

Siguiendo las indicaciones del instructivo de Bosch, agregar la siguiente línea:

compiler.libraries.ldflags=

Segundo tenemos que buscar el archivo “Platform.txt” en el directorio donde está instalado el paquete esp8266.
Si el IDE de Arduino se instaló en /opt, el path al archivo es el siguiente:

/home/[usuario]/.arduino15/packages/esp8266/hardware/esp8266/2.7.2/Platform.txt

Ahí debemos reemplazar la línea que está debajo del título “Combine gc-sections, archives, and objects” con el siguiente contenido:

recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {build.exception_flags} -Wl,-Map "-Wl,{build.path}/{build.project_name}.map" {compiler.c.elf.flags} {compiler.c.elf.extra_flags} -o "{build.path}/{build.project_name}.elf" -Wl,--start-group {object_files} "{archive_file_path}" {compiler.c.elf.libs} {compiler.libraries.ldflags} -Wl,--end-group "-L{build.path}"

Tercero, debemos modificar el archivo “eagle.app.v6.common.ld.h” que también encuentra en el directorio donde está instalado el paquete esp8266.

/home/[usuario]/.arduino15/packages/esp8266/hardware/esp8266/2.7.2/tools/sdk/ld”

Siguiendo las indicaciones del instructivo de BOSCH, agregar la siguiente línea:

libalgobsec.a:(.literal. .text.*)

Por último, desde el IDE de Arduino, seleccionar la Placa la NodeMCU V1, abrir el ejemplo “Basic” desde el menú “File/Examples/BSEC Software Library/Basic”. Siendo que el Módulo del BME680 usado (CJMCU-680) tiene la dirección I2C default 0x77, debemos editar el siguiente parámetro:

BME680_I2C_ADDR_PRIMARY debemos asignarlo a la dirección I2C 0x77.

Con esa modificación, el sketch debería compilar OK!