Objetivos
Material requerido.
Sensor SDS011 | |
Arduino Mega |
Sensores de partículas en suspensión
Decía Mafalda en una de sus tiras, pasando el dedo por un mueble, que era un asco vivir en un planeta que destiñe. Y es que tenemos que asumirlo. El polvo lo invade todo y solo en las carísimas salas limpias de ciertos laboratorios se puede huir de ello.
Pero, el común mortal vive (Vivimos) en un entorno abundante en pequeñas partículas de todo tipo que van desde las más inofensivas a otras preocupantes. Siempre que quemas algo, generas multitud de partículas diferentes que reconoces vagamente como humo mientras están concentradas, pero que poco a poco se van dispersando, hasta que son inapreciables, pero siguen estando presentes en el aire que respiras.
Muchos procesos humanos o naturales generan este tipo de partículas y ya hace tiempo que la OMS alertó de que la concentración de partículas en suspensión está relacionada con diferentes enfermedades pulmonares, de vías respiratorias o cardiacas, entre otras, y de diferente gravedad según las características de las mismas.
En el caso de la muy actual prevención de los contagios por COVID-19, un informe de la OMS dictamina lo siguiente:
En una época como la actual, en la que la preocupación por la salud y la contaminación atmosférica (Típicamente de la quema de combustibles) es alta, y no digamos ya la prevención de enfermedades respiratorias como el COVID-19, no está de más que dediquemos una sesión a revisar los detectores de partículas que miden la calidad del aire a base de detectar la cantidad de micro partículas en suspensión.
Conviene empezar diciendo que parece haber consenso en clasificar esas partículas por su tamaño y en general hay dos grandes bloques: menos de 2.5 µm (micrómetros) y entre 2.5 µm y 10 µm que , en uno de esos alardes de imaginación, se suelen llamar PM2.5 y PM10. Los sensores de partículas de andar por caso suelen ser capaces de medir las concentraciones de estos dos tipos, y los podemos encontrar por debajo de los 30€ y hasta unos 100 dependiendo de no estoy muy seguro que.
En esta sesión veremos como usar el sensor SDS011 con nuestro Arduino para leer la cantidad de partículas en suspensión PM10 y PM2.5 de un modo bastante sencillo, que no dudo que hará las delicias de los que quieren controlar la calidad de aire que le rodea.
Las mas gruesas, PM10 suelen ser resultado de polvo y tierra flotante, mientras que las mas pequeñas y mas preocupantes suelen ser aerosoles, resultado de la combustión de Diesel y similares y gotas de Azufre o nitrógeno, restos de combustión.
El sensor SDS011
EL SDS011 es un típico sensor digital de partículas que es capaz de medir la cantidad de ellas mediante un laser y un diodo interno a través de los cuales se empuja el aire exterior, mediante un ventilador y por lo visto, en función de la cantidad de luz que se dispersa y del patrón de interferencias que se genera, es capaz de determinar la concentración de partículas PM2.5 y PM10. Algo que me parece, simplemente magia.
Según su datasheet, el SDS011 es capaz de detectar partículas PM2.5 de entre 0 y 1.000 µg (microgramos) por metro3 y las PM10 entre 0 y 2.000 µg por metro3, sensibilidad que me parece asombrosa y con una respuesta de alrededor de 1 segundo.
El sensor viene con un adaptador de USB, que de salida no sirve de mucho porque envía los datos en bruto al USB y por tanto no vemos nada útil (Pero si me acuerdo, intentaré leerlo mediante el USB y un programa Python, a ver que tal) pero en el conector que veis en la esquina inferior izquierda, de la imagen superior, se pueden sacar los cables DuPont (Hembra) para conectarlo con nuestros Arduinos. A mi me ha resultado mas fiable usar el conector que viene con el USB y pinchar ahí directamente los DuPont macho que se aguantaban bastante mejor.
Ocupa unos 7×7 cm y es muy fácil de usar porque en el conector mencionado, disponemos de alimentación y GND así como un par de hilos RX y TX con lo que conectar con nuestro Arduino es francamente sencillo. Vamos a ver cómo.
Conectando el SDS011 a un Arduino MEGA
Como la conexión del SDS011 es una puerta COM, podríamos usar cualquier par de pines de un Arduino cualquiera para conectarlos, pero me ha parecido mas limpio usar un Mega que tiene varios puertos serie nativos y evitar el cargar la librería SoftSerial (Que es una opción viable en cualquier Arduino que solo tenga una COM port)
La conexión es trivial:
El conector del SDS011 lleva por debajo rotulados los nombres de los pines y simplemente tiene que conectar GND y Vcc, y asegurarte que conectas el RX del Sensor al TX de Arduino y viceversa.
EL programa de lectura de datos
El administrador de bibliotecas de Arduino dispone de al menos 3 librerías para manejar el Sds011 y como varias de ellas me han estado mareando, al final he optado por la que menos guerra me ha dado y que además es la que más sencilla me ha parecido: “Nova Fitness SDS dust sensor”. Vete al menú Arduino: \\Programa\Incluir libreria\Administrador de bibliotecas y busca SDS011:
Y una vez instalada ya podemos empezar con el programa. La librería tiene dos versiones: La que usa una puerta Serial por hardware como en el caso del Arduino Mega (Que es la que voy a usar aquí, porque el Mega tiene varias serial hardware disponibles y hace el código más pequeño y sencillo) y otra versión para modelos tipo Arduino UNO que usa una puerta serie configurable por software.
Empezamos con los include y un par de variables instrumentales que usaremos para contener los resultados de las medidas de PM10 y PM2.5:
#include <SDS011-select-serial.h> float p10,p25; int error;
Creamos, ahora, una instancia del sensor pasándole la puerta Serial a la que hemos conectado el sensor:
SDS011 my_sds(Serial1);
El setup es muy simple:
void setup() { Serial.begin(9600); // initialize normal Serial port Serial1.begin(9600); // initalize SDS Serial Port Serial.print("P2.5"); Serial.print("\t");Serial.println("P10"); }
Lo único que merece la pena comentar de él, es que hemos metido la última línea de prints con el objetivo de que si usamos una puerta serie saque una cabecera de las columnas y que si usamos el Serial Plotter (Que naturalmente vamos a usar) rotule en diferente color los dos tipos de partículas.
El loop no es más complicado:
void loop() { error = my_sds.read(&p25,&p10); if (! error) { //Serial.println("P2.5: "+String(p25)); //Serial.println("P10: "+String(p10)); Serial.print(p25) ; Serial.print("\t"); Serial.println(p10); } delay(100); }
Si recordáis, más arriba declaramos un par de variables p25 y p10 que dijimos íbamos a usar para contener las medidas. La instrucción
error = my_sds.read(&p25,&p10);
Lo que hace es comprobar si hay un error al invocar la lectura del sensor, al que le pasamos la dirección de esas variables que nos rellenará con la lectura si no hay problemas, y eso es todo.
La última línea con los print, simplemente le dice a la consola que tabule la salida de datos del mismo modo que los títulos que pusimos en el setup() (Fijate en los títulos de la primera fila)
Pero por supuesto, usar el serial plotter es mucho más interesante e ilustrativo:
El primer pico que veis es porque le he encendido una cerilla de madera a su lado y he soplado en dirección al ventilador del SDS011 que recoge el aire externo. El segundo pico, muy inferior, se produce cuando exhalo aliento en el ventilador, que supongo detecta las gesticulas minúsculas de humedad que se condensan.
Aquí va el programa completo para que descargues:
Aquí os dejo un minivideo con una prueba del sensor: