Skip to Content

Sensor de polvo DSM501a con Arduino

Sensor de polvo DSM501a con Arduino

En este tutorial aprenderás cómo usar el sensor de polvo DSM501a con un Arduino para evaluar la calidad del aire.

El módulo sensor de polvo DSM501 combinado con proyectos Arduino te permite monitorear la calidad del aire. Con su capacidad para detectar partículas tan pequeñas como 1 micrón, este módulo es ideal para medir concentraciones de polvo doméstico, polen, ácaros, gérmenes y humo de cigarrillo, que son causas conocidas de enfermedades respiratorias y alergias.

Comencemos con las piezas necesarias.

Piezas necesarias

Además del DSM501 necesitarás un Arduino u otro microcontrolador con lógica de 5V. Usé un Arduino Uno, pero cualquier otra placa Arduino con lógica de 5V funcionará igual de bien.

Sensor de polvo DSM501a

Arduino

Arduino Uno

Dupont wire set

Juego de cables Dupont

Half_breadboard56a

Protoboard

USB Data Sync cable Arduino

Cable USB para Arduino UNO

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Conceptos básicos del sensor de polvo DSM501

El DSM501 es un módulo sensor para medir concentraciones de partículas. El sensor puede detectar partículas tan pequeñas como 1µm y puede medir la cantidad de partículas flotantes en una habitación con un tamaño de hasta 30m3. La imagen a continuación muestra la parte trasera y frontal del módulo sensor.

DSM501 Dust Sensor Back and Front
Sensor de polvo DSM501, parte trasera y frontal

Función

El sensor funciona usando un elemento calefactor para generar un flujo de aire. Las partículas en el flujo son iluminadas por un diodo IR (LED) y la cantidad de luz reflejada es medida por un sensor infrarrojo (PT). Esta medición se convierte luego en una señal de salida PWM. La imagen a continuación muestra la ubicación de los componentes y el principio funcional del sensor.

Components and function of DSM501
Componentes y función del DSM501 (source)

Y aquí hay una imagen del interior del DSM501. Puedes ver la resistencia que funciona como elemento calefactor en la parte inferior, el fotodetector IR a la derecha y el LED IR a la izquierda.

Interior of DSM501
Interior del DSM501 (source)

Instalación

El sensor debe instalarse en la posición «vertical» que se muestra a continuación. Solo en esta orientación el aire calentado fluirá hacia arriba, pasando por el LED y el elemento detector. Asegúrate de mantener el sensor alejado de otros flujos de aire artificiales (ventiladores) y fuentes de humedad.

Orientation of Sensor for correct operation
Orientación del sensor para un funcionamiento correcto

La lente frente al detector IR (PT) está recubierta con un polímero antiestático y antipolvo. Pero aún así debe limpiarse cada seis meses en ambientes de oficina y cada tres meses en ambientes industriales.

El módulo tiene un potenciómetro VR para ajuste de sensibilidad, pero está preajustado y no deberías cambiarlo.

Pinout

La imagen siguiente muestra el pinout del DSM501. El pin de control puedes ignorarlo por ahora. Vout1 y Vout2 son las salidas PWM. Vout2 detecta partículas > 1µm y Vout1 detecta partículas > 2.5µm. VCC y GND son los pines de alimentación. El módulo sensor funciona a 5V.

Pinout of DSM501
Pinout del DSM501

Ten en cuenta que el módulo DSM501 suele venir con un conector y cable prefabricados que tienen un código de colores incorrecto. ¡No te dejes engañar! El negro NO es tierra y el rojo NO es VCC. Mira la imagen a continuación y ten cuidado con esto.

Color coding of connector cables of  DSM501
Código de colores de los cables del conector del DSM501

Ahora, una palabra rápida sobre el pin de control. Puedes ajustar la sensibilidad al tamaño de partícula de Vout1 añadiendo una resistencia entre el pin de control y tierra. Pero no lo usaremos y nos quedaremos con los valores por defecto: Vout2 (> 1µm) y Vout1 (> 2.5µm). Para más detalles, consulta el datasheet. La imagen a continuación muestra cómo cambia la señal PWM de los pines Vout según los tamaños de partículas detectados.

(source)

Especificaciones

A continuación encontrarás las especificaciones del DSM501. La parte más importante a tener en cuenta es el voltaje de alimentación de 5V y el consumo relativamente alto de 90mA debido al elemento calefactor.

  • Voltaje de alimentación: DC5V±10%
  • Consumo de energía: 90mA
  • Rango de temperatura de operación: -10~ +65℃
  • Rango de humedad de operación: 95%RH o menos
  • Condiciones recomendadas de almacenamiento: -20~ +80℃
  • Dimensiones: W59 * H45 * D20 (mm)
  • Tamaño de partícula detectable: aprox. 1µm (mínimo)
  • Rango detectable de concentración: 0 ~ 1.4mg/m3
  • Señal de salida: PWM (modulación por ancho de pulso)
  • Tiempo de estabilización: 1 minuto después de encender

Para más detalles, consulta las hojas de datos. Hay varias versiones ligeramente diferentes. Listo las dos más completas a continuación.

Conectando el DSM501 al Arduino

Conectar el DSM501 a un Arduino es fácil. Comienza conectando GND a GND y VCC a 5V. Luego conecta Vout1 al Pin 7 del Arduino y Vout2 al Pin 8. Los pines GPIO específicos no son críticos y puedes elegir otros si quieres. El pin de control del DSM501 queda sin conectar (abierto). El diagrama a continuación muestra el cableado completo.

Wiring of DSM501 with Arduino
Cableado del DSM501 con Arduino

Con el cableado terminado, hablemos de cómo vamos a medir las concentraciones de partículas antes de escribir código.

Medición de concentraciones de partículas

Los pines Vout del DSM501 producen una señal PWM, donde la duración del pulso depende de la cantidad de partículas detectadas. Para convertir esta señal en concentración de partículas primero debemos calcular la llamada relación de pulso bajo, como se describe a continuación.

Low pulse ratio
Relación de pulso bajo (source)

La relación de pulso bajo es simplemente el porcentaje del tiempo que el pulso está bajo durante el tiempo de medición t, donde un tiempo típico de medición es entre 5 y 30 segundos. Por ejemplo, en el ejemplo anterior la relación de pulso bajo se calcularía como

Relación de Pulso Bajo (%) = (t1 + t2 + t3) / t x 100

Concentración de partículas en mg/m3

Una vez que tenemos la relación de pulso bajo, debemos buscar la concentración de partículas correspondiente en mg/m3 en la siguiente tabla. La curva roja describe las características típicas del sensor, mientras que las curvas azul y roja son los límites superior e inferior.

Características del sensor para medir concentración en mg/m3 (source)

Obviamente, queremos convertir la relación de pulso bajo a concentración de partículas programáticamente mediante una fórmula y no consultar el gráfico. Puedes encontrar varias fórmulas en diferentes blogs, pero tienden a ser ligeramente incorrectas. Por eso seleccioné algunos puntos de la curva roja anterior para replicar el gráfico y calculé un ajuste polinómico de segundo orden. La imagen a continuación muestra los puntos y la curva ajustada.

My replica of the sensor's characteristics curve
Mi réplica de la curva característica del sensor

Los coeficientes y la fórmula para el ajuste polinómico son los siguientes:

c_mgm3 = 0.00258425*r**2 +0.0858521*r – 0.01345549

Con esta fórmula ahora podemos calcular la concentración de partículas en mg/m3 para una relación de pulso bajo dada r.

Concentración de partículas en pcs/283ml

De manera similar, la hoja de datos proporciona una segunda curva característica para medir concentraciones de partículas en pcs/283ml.

Características del sensor para medir concentración en pcs/283ml (source)

Este gráfico muestra una relación lineal entre la relación de pulso bajo r y la concentración en pcs/283ml hasta una concentración de 12000 pcs/283ml, donde el sensor se satura. La parte lineal puede describirse con la siguiente ecuación:

c_pcs283ml = 625*r

Con estas dos fórmulas tenemos todo lo necesario para calcular concentraciones de partículas en mg/m3 o en pcs/283ml a partir de una relación de pulso bajo r medida.

Código para medir concentraciones de polvo con DSM501

El siguiente código muestra cómo medir concentraciones de partículas en mg/m3 y en pcs/283ml para partículas de tamaños >1µm (PM1) o >2.5µm (PM2.5). Echa un vistazo rápido al código completo antes de entrar en detalles.

const int pinPM25 = 7;
const int pinPM1 = 8;
const unsigned long sampleTime = 5000;  // mSec   -> 5..30 sec

float calc_low_ratio(float lowPulse) {
  return lowPulse / sampleTime * 100.0;  // low ratio in %
}

float calc_c_mgm3(float lowPulse) {
  float r = calc_low_ratio(lowPulse);
  float c_mgm3 = 0.00258425 * pow(r, 2) + 0.0858521 * r - 0.01345549;
  return max(0, c_mgm3);
}

float calc_c_pcs283ml(float lowPulse) {
  float r = calc_low_ratio(lowPulse);
  float c_pcs283ml =  625 * r;
  return min(c_pcs283ml, 12500);
}

void setup() {
  Serial.begin(9600);
  pinMode(pinPM25, INPUT);
  pinMode(pinPM1, INPUT);
  Serial.println("Warming up...");
  // delay(60000);  // 1 minute warm-up
}

void loop() {
  static unsigned long t_start = millis();
  static float lowPM = 0;

  lowPM += pulseIn(pinPM25, LOW) / 1000.0;   // >2.5µm (PM2.5)
  //lowPM += pulseIn(pinPM1, LOW) / 1000.0;  // >1µm (PM1)

  if ((millis() - t_start) >= sampleTime) {
    Serial.print("low_%  PM    : ");
    Serial.println(calc_low_ratio(lowPM));
    Serial.print("c_mgm3 PM    : ");
    Serial.println(calc_c_mgm3(lowPM));
    Serial.print("c_pcs283ml PM: ");
    Serial.println(calc_c_pcs283ml(lowPM));   
    Serial.println();
    lowPM = 0;
    t_start = millis();
  }
}

El código comienza definiendo constantes para los pines de señal de entrada del DSM501 y el tiempo de muestreo. El tiempo de muestreo es el tiempo que el código dedica a hacer una medición completa de las concentraciones de partículas.

const int pinPM25 = 7;
const int pinPM1 = 8;
const unsigned long sampleTime = 5000;  // mSec   -> 5..30 sec

La hoja de datos recomienda un valor entre 5 y 30 segundos. Un tiempo de muestreo más largo te da mediciones más estables pero menos frecuentes.

Funciones auxiliares

Luego definimos una función auxiliar para calcular la relación de pulso bajo. Simplemente divide el tiempo acumulado de pulso bajo por el tiempo de muestreo y lo multiplica por 100 para convertirlo en porcentaje.

float calc_low_ratio(float lowPulse) {
  return lowPulse / sampleTime * 100.0;  // low ratio in %
}

La calc_c_mgm3() función calcula la concentración de partículas en mg/m3. Usa la fórmula descrita arriba. Limitamos la concentración mínima a cero llamando a max(0, c_mgm3), ya que concentraciones negativas no tienen sentido.

float calc_c_mgm3(float lowPulse) {
  float r = calc_low_ratio(lowPulse);
  float c_mgm3 = 0.00258425 * pow(r, 2) + 0.0858521 * r - 0.01345549;
  return max(0, c_mgm3);
}

Si observas bien la curva característica del sensor, verás que para relaciones de pulso bajo muy bajas la concentración calculada podría ser negativa.

De manera similar, la calc_c_pcs283ml() función calcula la concentración de partículas en pcs/283ml pero limita la concentración máxima a 12500 pcs/283ml, donde el sensor se satura y la curva característica deja de ser lineal.

float calc_c_pcs283ml(float lowPulse) {
  float r = calc_low_ratio(lowPulse);
  float c_pcs283ml =  625 * r;
  return min(c_pcs283ml, 12500);
}

Función setup

La función setup() inicia la comunicación serial y configura los modos de los pines que leen datos del DSM501. La hoja de datos indica que el sensor necesita aproximadamente 1 minuto de calentamiento hasta que las lecturas se estabilizan. Puedes habilitar el correspondiente delay aquí.

void setup() {
  Serial.begin(9600);
  pinMode(pinPM25, INPUT);
  pinMode(pinPM1, INPUT);
  Serial.println("Warming up...");
  // delay(60000);  // 1 minute
}

Función loop

Finalmente tenemos la función loop(). Usa la función pulseIn() para medir el tiempo bajo de la entrada P25 o PM1. Solo comenta la entrada que no quieras medir.

  lowPM += pulseIn(pinPM25, LOW) / 1000.0;   // >2.5µm (PM2.5)
  //lowPM += pulseIn(pinPM1, LOW) / 1000.0;  // >1µm (PM1)

Ten en cuenta que pulseIn devuelve duraciones en microsegundos, que convertimos a milisegundos multiplicando por 1000.

Los tiempos bajos se acumulan hasta alcanzar el final del tiempo de muestreo. Luego calculamos las diferentes concentraciones de partículas basadas en la relación de pulso bajo y las imprimimos.

  if ((millis() - t_start) >= sampleTime) {
    Serial.print("low_%  PM    : ");
    Serial.println(calc_low_ratio(lowPM));
    Serial.print("c_mgm3 PM    : ");
    Serial.println(calc_c_mgm3(lowPM));
    Serial.print("c_pcs283ml PM: ");
    Serial.println(calc_c_pcs283ml(lowPM));   
    Serial.println();
    lowPM = 0;
    t_start = millis();
  }

Al final del tiempo de muestreo reiniciamos la concentración acumulada de partículas lowPM a 0 y también reiniciamos el tiempo de muestreo para comenzar el siguiente período.

En la siguiente sección, refinaremos este sistema y construiremos un sencillo sistema de alerta de calidad del aire.

Sistema de alerta de calidad del aire con DSM501

La exposición prolongada a partículas pequeñas en el aire puede causar problemas de salud. Un método común para medir la calidad del aire circundante es contar la concentración de materia particulada fina (PM) con un diámetro menor a 2.5µm. El riesgo para la salud con PM2.5 es que pueden viajar profundamente en el tracto respiratorio, llegando a los pulmones y entrando en el torrente sanguíneo.

Existen varias escalas para clasificar el riesgo para la salud de diferentes concentraciones de PM2.5. La siguiente tabla de Categorías de Calidad del Aire es del Victorian Government in Australia.

Air Quality Categories for PM2.5
Categorías de Calidad del Aire para PM2.5 (source)

Puedes ver que las categorías van desde Bueno hasta Extremadamente pobre y dependen de la concentración de PM2.5 promediada durante una o 24 horas. Nota que estas categorías se basan en concentraciones de PM2.5 medidas en µg/m3 y no en mg/m3, que es la unidad que hemos usado antes. Para información más detallada sobre estos niveles y su posible impacto en la salud, consulta Air quality categories and general health advice.

Vamos a construir un sistema simplificado de alerta de calidad del aire usando solo los primeros tres niveles (Bueno a Pobre). Dependiendo de la concentración medida de PM2.5, el sistema encenderá un LED verde (Bueno), amarillo (Regular) o rojo (Pobre o peor).

Cableado para el sistema de alerta de calidad del aire

Podemos usar el mismo circuito que antes, sin cambiar el cableado del DSM501, y solo añadir los tres LEDs con sus resistencias limitadoras de corriente. El LED verde se conectará al pin 4, el amarillo al pin 3 y el rojo al pin 2. La imagen a continuación muestra el cableado completo.

Wiring for Air Quality Warning with DSM501
Cableado para alerta de calidad del aire con DSM501

Código para el sistema de alerta de calidad del aire

El código a continuación es muy similar al que vimos antes. Las principales diferencias son que ahora controlamos tres LEDs y que medimos concentraciones de PM2.5 en µg/m3.

const int pinPM25 = 7;
const int pinPM1 = 8;
const int pinGreen = 4;
const int pinYellow = 3;
const int pinRed = 2;
const unsigned long sampleTime = 30000;  // 30 sec

float calc_low_ratio(float lowPulse) {
  return lowPulse / sampleTime * 100.0;  // low ratio in %
}

float calc_c_ugm3(float lowPulse) {
  float r = calc_low_ratio(lowPulse);
  float c_mgm3 = 0.00258425 * pow(r, 2) + 0.0858521 * r - 0.01345549;
  return max(0, c_mgm3) * 1000;
}

void setup() {
  pinMode(pinPM25, INPUT);
  pinMode(pinPM1, INPUT);
  pinMode(pinGreen, OUTPUT);
  pinMode(pinYellow, OUTPUT);
  pinMode(pinRed, OUTPUT);
  // delay(60000);  // 1 minute
}

void loop() {
  static unsigned long t_start = millis();
  static float lowPM25 = 0;

  lowPM25 += pulseIn(pinPM25, LOW) / 1000.0;

  if ((millis() - t_start) >= sampleTime) {
    float c_ugm3 = calc_c_ugm3(lowPM25);
    digitalWrite(pinGreen, c_ugm3 <= 25 ? HIGH : LOW);
    digitalWrite(pinYellow, c_ugm3 > 25 && c_ugm3 <= 50 ? HIGH : LOW);
    digitalWrite(pinRed, c_ugm3 > 50 ? HIGH : LOW);
    lowPM25 = 0;
    t_start = millis();
  }
}

Primero definimos constantes para los pines del DSM501, los pines de los LEDs y el tiempo de muestreo.

Ten en cuenta que usamos un tiempo de muestreo de 30 segundos. Podrías cambiar el tiempo de muestreo a una hora, como usa la definición de Categorías de Calidad del Aire, pero eso te daría solo una lectura por hora. La mejor opción sería usar una ventana deslizante, pero para mantener el código simple, no lo implementé.

La función calc_low_ratio() es la misma que antes y la nueva calc_c_ugm3() es esencialmente igual a la antigua función calc_c_mgm3(). Solo multiplicamos por 1000 para convertir de mg/m3 a µg/m3.

En la función setup configuramos los modos de los pines y en la función loop medimos la concentración de PM2.5 y encendemos o apagamos uno de los tres LEDs según el nivel.

...
digitalWrite(pinGreen, c_ugm3 <= 25 ? HIGH : LOW);
digitalWrite(pinYellow, c_ugm3 > 25 && c_ugm3 <= 50 ? HIGH : LOW);
digitalWrite(pinRed, c_ugm3 > 50 ? HIGH : LOW);
...

Para concentración de PM2.5 < 25 µg/m3 (Bueno), encendemos el LED verde. Para concentraciones entre 25 µg/m3 y 50 µg/m3 (Regular), encendemos el LED amarillo y para más de 50 µg/m3 (Pobre), encendemos el LED rojo.

El siguiente video corto muestra el sistema en acción. Puedes ver el LED rojo encendiéndose cuando el sensor se expone al polvo producido por el plumero en movimiento.

Demostración del sistema de alerta de calidad del aire

¡Y ese es tu propio, pequeño sistema de alerta de calidad del aire!

Conclusiones

El DSM501 es un sensor barato y fácil de usar para medir concentraciones de partículas PM1 y PM2.5. En combinación con un Arduino te permite construir un sistema simple de alerta de calidad del aire.

La desventaja del sensor es que la documentación es algo escasa. Tuve que derivar las fórmulas para medir concentraciones de partículas a partir de las curvas características del sensor en la hoja de datos, lo cual es algo impreciso. Verás que diferentes artículos usan fórmulas ligeramente distintas.

No sé qué tan preciso es el DSM501, y sin una fuente conocida de partículas, realmente no puedes calibrar el sensor. Sin embargo, para estimaciones aproximadas de la calidad del aire debería ser suficiente.

Finalmente, si quieres un sensor que pueda detectar partículas más pequeñas, consuma menos energía y funcione con un ESP32, echa un vistazo al GP2Y1010AU0F Dust Sensor.

Enlaces

Aquí algunos enlaces que encontré útiles al buscar información sobre calidad del aire, tamaños de partículas y polen.

Preguntas frecuentes

¿Cuáles son los niveles saludables y no saludables de densidad de polvo cuando se mide en µg/m3?

Los niveles saludables de densidad de polvo suelen estar por debajo de 50 µg/m3, mientras que los niveles no saludables están por encima de 150 µg/m3.

¿Cuál es la relación entre la densidad de polvo medida en µg/m3 y la materia particulada PM, específicamente PM2.5 y PM10?

La densidad de polvo medida en µg/m3 está directamente relacionada con la materia particulada (PM), incluyendo PM2.5 y PM10. PM2.5 se refiere a partículas con un diámetro de 2.5 µm o menos, mientras que PM10 se refiere a partículas con un diámetro de 10 µm o menos. Una mayor densidad de polvo indica niveles más altos de PM2.5 y PM10 en el aire.

Particle Size Comparison
Comparación de tamaños de partículas (source)

¿Por qué la contaminación por PM2.5 es mala para la salud?

De todas las medidas de contaminación del aire, la contaminación por PM2.5 representa la mayor amenaza para la salud. Debido a su pequeño tamaño, PM2.5 puede permanecer suspendida en el aire durante largos períodos y puede ser absorbida profundamente en el torrente sanguíneo al inhalarse.

¿Cuáles son las principales fuentes de contaminación por PM2.5?

Las fuentes comunes de contaminación por PM2.5 son motores y combustión, procesos industriales, estufas, chimeneas y quema de leña en el hogar, humo de fuegos artificiales e incendios forestales, fumar, polvo y partículas de polen.

¿Puede un sensor PM2.5 o PM10 medir polen?

La mayoría de las partículas de polen son más grandes que las partículas PM2.5 y PM10 y serían ignoradas por un sensor PM2.5 o PM10. Sin embargo, aunque las partículas de polen suelen ser mayores a 10 µm, pueden fragmentarse en partículas más pequeñas en el rango PM2.5, que sí pueden ser medidas.