Skip to Content

Sensor de Poeira DSM501a com Arduino

Sensor de Poeira DSM501a com Arduino

Neste tutorial, vais aprender a usar o Sensor de Poeira DSM501a com um Arduino para avaliar a qualidade do ar.

O módulo sensor de poeira DSM501 combinado com projetos Arduino permite monitorizar a qualidade do ar. Com a capacidade de detetar partículas tão pequenas quanto 1 mícron, este módulo é ótimo para medir concentrações de pó doméstico, pólen, ácaros, germes e fumo de cigarro, que são causas conhecidas de doenças respiratórias e alergias.

Vamos começar com as peças necessárias.

Peças Necessárias

Além do DSM501, vais precisar de um Arduino ou outro microcontrolador com lógica de 5V. Usei um Arduino Uno, mas qualquer outra placa Arduino com lógica de 5V funciona igualmente bem.

Sensor de Poeira DSM501a

Arduino

Arduino Uno

Dupont wire set

Conjunto de Fios Dupont

Half_breadboard56a

Breadboard

USB Data Sync cable Arduino

Cabo 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.

Noções Básicas do Sensor de Poeira DSM501

O DSM501 é um módulo sensor para medir concentrações de partículas. O sensor pode detetar partículas tão pequenas quanto 1µm e pode medir a quantidade de partículas suspensas numa sala com tamanho até 30m3. A imagem abaixo mostra a parte traseira e frontal do módulo sensor.

DSM501 Dust Sensor Back and Front
Sensor de Poeira DSM501 – Parte Traseira e Frontal

Função

O sensor funciona usando um elemento de aquecimento para gerar um fluxo de ar. As partículas no fluxo são iluminadas por um díodo IR (LED) e a quantidade de luz refletida é medida por um sensor infravermelho (PT). Esta medição é então convertida num sinal de saída PWM. A imagem abaixo mostra a localização dos componentes e o princípio funcional do sensor.

Components and function of DSM501
Componentes e função do DSM501 (source)

Aqui está uma imagem do interior do DSM501. Podes ver o resistor que funciona como elemento de aquecimento na parte inferior, o fotodetetor IR à direita e o LED IR à esquerda.

Interior of DSM501
Interior do DSM501 (source)

Instalação

O sensor deve ser instalado na posição “vertical” mostrada abaixo. Só nesta orientação o ar aquecido fluirá para cima, passando pelo LED e pelo elemento detector. Certifica-te de manter o sensor afastado de outros fluxos de ar artificiais (ventoinhas) e fontes de humidade.

Orientation of Sensor for correct operation
Orientação do Sensor para funcionamento correto

A lente à frente do detector IR (PT) é revestida com um polímero antiestático e anti-poeira. Mas ainda assim deve ser limpa a cada seis meses em ambientes de escritório e a cada três meses em ambientes industriais.

O módulo tem um trimmer VR para ajuste de sensibilidade, mas está pré-ajustado e não deves alterá-lo.

Pinout

A imagem seguinte mostra o pinout do DSM501. O pino de controlo podes ignorar por agora. Vout1 e Vout2 são as saídas PWM. Vout2 deteta partículas > 1µm e Vout1 deteta partículas > 2.5µm. VCC e GND são os pinos de alimentação. O módulo sensor funciona a 5V.

Pinout of DSM501
Pinout do DSM501

Note que o módulo DSM501 geralmente vem com um conector e cabo pré-fabricados que têm uma codificação de cores errada! Não te deixes enganar. Preto NÃO é terra e vermelho NÃO é VCC. Vê a imagem abaixo e fica atento a isto.

Color coding of connector cables of  DSM501
Codificação de cores dos cabos do conector do DSM501

Agora, uma palavra rápida sobre o pino de controlo. Podes ajustar a sensibilidade do tamanho das partículas do Vout1 adicionando um resistor entre o pino de controlo e o terra. Mas não vamos usá-lo e ficamos com os valores padrão: Vout2 (> 1µm) e Vout1 (> 2.5µm). Para mais detalhes vê o datasheet. A imagem abaixo mostra como o sinal PWM dos pinos Vout muda, dependendo dos tamanhos das partículas detetadas.

(source)

Especificações

Abaixo encontras as especificações do DSM501. A parte mais importante a notar é a tensão de alimentação de 5V e o consumo relativamente alto de 90mA devido ao elemento de aquecimento.

  • Tensão de alimentação: DC5V±10%
  • Consumo de energia: 90mA
  • Faixa de temperatura de operação: -10~ +65℃
  • Faixa de humidade de operação: 95%RH ou menos
  • Condições recomendadas de armazenamento: -20~ +80℃
  • Dimensões: L59 * A45 * P20 (mm)
  • Tamanho mínimo de partícula detetável: aprox. 1µm
  • Faixa detetável de concentração: 0 ~ 1.4mg/m3
  • Sinal de saída: PWM (modulação por largura de pulso)
  • Tempo para estabilização: 1 minuto após ligar a alimentação

Para mais detalhes, consulta as folhas de dados. Existem várias versões ligeiramente diferentes. Listei as duas mais completas abaixo

Ligação do DSM501 ao Arduino

Ligar o DSM501 a um Arduino é fácil. Começa por ligar GND a GND e VCC a 5V. Depois liga Vout1 ao Pino 7 do Arduino e Vout2 ao Pino 8. Os pinos GPIO específicos não são críticos e podes escolher outros se quiseres. O pino de controlo do DSM501 fica desconectado (aberto). O diagrama abaixo mostra a ligação completa.

Wiring of DSM501 with Arduino
Ligação do DSM501 com Arduino

Com a ligação feita, vamos falar sobre como medir as concentrações de partículas antes de escrever qualquer código.

Medir concentrações de partículas

Os pinos Vout do DSM501 produzem um sinal PWM, onde a duração do pulso depende da quantidade de partículas detetadas. Para converter este sinal numa concentração de partículas, primeiro temos de calcular a chamada low pulse ratio, como descrito abaixo.

Low pulse ratio
Low pulse ratio (source)

O low pulse ratio é simplesmente a percentagem do tempo em que o pulso está baixo durante o tempo de medição t, sendo que um tempo típico de medição é entre 5 a 30 segundos. Por exemplo, no exemplo acima, o low pulse ratio seria calculado como

Low Pulse Ratio (%) = (t1 + t2 + t3) / t x 100

Concentração de partículas em mg/m3

Uma vez que temos o low pulse ratio, temos de consultar a concentração de partículas correspondente em mg/m3 no gráfico seguinte. A curva vermelha descreve as características típicas do sensor, enquanto as curvas azul e vermelha são os limites superior e inferior.

Características do sensor para medir mg/m3 concentração (source)

Obviamente, queremos converter o low pulse ratio para concentração de partículas programaticamente via uma fórmula e não consultar o gráfico. Podes encontrar várias fórmulas em vários blogs, mas tendem a ser ligeiramente incorretas. Por isso, escolhi alguns pontos da curva vermelha acima para replicar o gráfico e calculei um ajuste polinomial de segunda ordem. A imagem abaixo mostra os pontos e a curva ajustada.

My replica of the sensor's characteristics curve
A minha réplica da curva de características do sensor

Os coeficientes e a fórmula para o ajuste polinomial são os seguintes:

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

Com esta fórmula podemos agora calcular a concentração de partículas em mg/m3 para um dado low pulse ratio r.

Concentração de partículas em pcs/283ml

De forma semelhante, a folha de dados fornece uma segunda curva característica do sensor para medir concentrações de partículas em pcs/283ml.

Características do sensor para medir concentração em pcs/283ml (source)

Este gráfico mostra uma relação linear entre o low pulse ratio r e a concentração em pcs/283ml até uma concentração de 12000 pcs/283ml, onde o sensor satura. A parte linear pode ser descrita pela seguinte equação:

c_pcs283ml = 625*r

Com estas duas fórmulas temos tudo o que precisamos para calcular concentrações de partículas em mg/m3 ou em pcs/283ml a partir de um low pulse ratio r medido.

Código para medir concentrações de poeira com DSM501

O código seguinte mostra como medir concentrações de partículas em mg/m3 e em pcs/283ml para partículas de tamanhos >1µm (PM1) ou >2.5µm (PM2.5). Dá uma vista rápida ao código completo antes de entrarmos nos detalhes.

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();
  }
}

O código começa por definir constantes para os pinos de sinal de entrada do DSM501 e o tempo de amostragem. O tempo de amostragem é o tempo que o código usa para fazer uma medição completa das concentrações de partículas.

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

A folha de dados recomenda um valor entre 5 e 30 segundos. Um tempo de amostragem mais longo dá medições mais estáveis, mas menos frequentes.

Funções auxiliares

De seguida definimos uma função auxiliar para calcular o low pulse ratio. Ela simplesmente divide o tempo acumulado de pulso baixo pelo tempo de amostragem e multiplica por 100 para obter uma percentagem.

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

A calc_c_mgm3() função calcula a concentração de partículas em mg/m3. Usa a fórmula descrita acima. Limitamos a concentração mínima a zero chamando max(0, c_mgm3), pois concentrações negativas de partículas não fazem 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);
}

Se olhares atentamente para a curva de características do sensor, podes ver que para valores muito baixos de low pulse ratio a concentração calculada pode tornar-se negativa.

De forma semelhante, a calc_c_pcs283ml() função calcula a concentração de partículas em pcs/283ml, mas limita a concentração máxima a 12500 pcs/283ml, onde o sensor satura e a curva característica deixa de ser linear.

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

Função setup

A função setup() inicia a comunicação serial e define os modos dos pinos que leem dados do DSM501. A folha de dados diz que o sensor precisa de cerca de 1 minuto de aquecimento até as leituras se estabilizarem. Podes ativar o correspondente delay aqui.

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

Função loop

Finalmente temos a função loop(). Ela usa a função pulseIn() para medir o tempo em baixo do sinal de entrada P25 ou PM1. Basta comentar a entrada que não queres medir.

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

Note que pulseIn retorna a duração em microssegundos, que convertemos para milissegundos multiplicando por 0,001.

Os tempos em baixo são acumulados até atingirmos o fim do tempo de amostragem. Depois calculamos as diferentes concentrações de partículas com base no low pulse ratio e imprimimos os resultados.

  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();
  }

No final do tempo de amostragem, reiniciamos a concentração acumulada de partículas lowPM para 0 e também reiniciamos o tempo de amostragem para começar o próximo período.

Na próxima secção, vamos aprimorar este sistema e construir um simples sistema de aviso de qualidade do ar.

Sistema de aviso de qualidade do ar com DSM501

A exposição prolongada a partículas pequenas e suspensas no ar pode causar problemas de saúde. Um método comum para medir a qualidade do ar é contar a concentração de partículas finas (PM) com diâmetro inferior a 2.5µm. O risco para a saúde com PM2.5 é que podem penetrar profundamente no trato respiratório, alcançando os pulmões e entrando na corrente sanguínea.

Existem várias escalas para classificar o risco para a saúde de diferentes concentrações de PM2.5. A tabela seguinte de Categorias de Qualidade do Ar é do Victorian Government in Australia.

Air Quality Categories for PM2.5
Categorias de Qualidade do Ar para PM2.5 (source)

Podes ver que as categorias variam de Bom a Extremamente pobre e dependem da concentração média de PM2.5 durante uma ou 24 horas. Note que estas categorias são baseadas em concentrações de PM2.5 medidas em µg/m3 e não em mg/m3, que é a unidade que usamos antes. Para informações mais detalhadas sobre estes níveis e seu impacto potencial na saúde, vê Air quality categories and general health advice.

Vamos construir um sistema simplificado de aviso de qualidade do ar usando apenas os três primeiros níveis (Bom a Pobre). Dependendo da concentração medida de PM2.5, o sistema acenderá um LED verde (Bom), amarelo (Razoável) ou vermelho (Pobre ou pior).

Ligação para Sistema de Aviso de Qualidade do Ar

Podemos usar o mesmo circuito de antes, sem alterar a ligação do DSM501, e apenas adicionar os três LEDs com os seus resistores limitadores de corrente. O LED verde será ligado ao pino 4, o amarelo ao pino 3 e o vermelho ao pino 2. A imagem abaixo mostra a ligação completa.

Wiring for Air Quality Warning with DSM501
Ligação para Aviso de Qualidade do Ar com DSM501

Código para Sistema de Aviso de Qualidade do Ar

O código abaixo é muito semelhante ao código que vimos antes. As principais diferenças são que agora estamos a controlar três LEDs e que estamos a medir concentrações de PM2.5 em µ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();
  }
}

Primeiro definimos constantes para os pinos do DSM501, os pinos dos LEDs e o tempo de amostragem.

Note que estamos a usar um tempo de amostragem de 30 segundos. Poderias alterar o tempo para uma hora, como usado na definição das Categorias de Qualidade do Ar, mas isso daria apenas uma leitura por hora. A melhor opção seria usar uma janela deslizante, mas para manter o código simples, não implementei isso.

A função calc_low_ratio() é a mesma de antes e a nova calc_c_ugm3() é essencialmente igual à antiga função calc_c_mgm3(). Apenas multiplicamos por 1000 para converter de mg/m3 para µg/m3.

Na função setup definimos os modos dos pinos e na função loop medimos a concentração de PM2.5 e ligamos ou desligamos um dos três LEDs dependendo do nível.

...
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 concentração de PM2.5 < 25 µg/m3 (Bom), ligamos o LED verde. Para concentração entre 25 µg/m3 e 50 µg/m3 (Razoável), ligamos o LED amarelo e acima de 50 µg/m3 (Pobre), ligamos o LED vermelho.

O vídeo curto seguinte mostra o sistema em ação. Podes ver o LED vermelho a ligar quando o sensor é exposto ao pó produzido pelo espanador em movimento.

Demonstração do Sistema de Aviso de Qualidade do Ar

E este é o teu próprio, pequeno Sistema de Aviso de Qualidade do Ar!

Conclusões

O DSM501 é um sensor barato e fácil de usar para medir concentrações de partículas PM1 e PM2.5. Em combinação com um Arduino, permite construir um simples Sistema de Aviso de Qualidade do Ar.

A desvantagem do sensor é que a documentação é algo escassa. Tive de derivar as fórmulas para medir concentrações de partículas a partir das curvas características do sensor na folha de dados, o que é algo impreciso. Verás que diferentes artigos usam fórmulas ligeiramente diferentes.

Não sei quão preciso é o DSM501 e, sem uma fonte conhecida de partículas, não podes calibrar realmente o sensor. No entanto, para estimativas aproximadas da qualidade do ar, deve ser suficiente.

Finalmente, se quiseres um sensor que possa detetar partículas menores, consuma menos energia e funcione com um ESP32, dá uma vista de olhos ao GP2Y1010AU0F Dust Sensor.

Links

Aqui tens alguns links que achei úteis ao procurar informações sobre qualidade do ar, tamanhos de partículas e pólen.

FAQ

Quais são os níveis saudáveis e não saudáveis de densidade de poeira quando medidos em µg/m3?

Níveis saudáveis de densidade de poeira são tipicamente abaixo de 50 µg/m3, enquanto níveis não saudáveis são acima de 150 µg/m3.

Qual é a relação entre densidade de poeira medida em µg/m3 e matéria particulada PM, especificamente PM2.5 e PM10?

A densidade de poeira medida em µg/m3 está diretamente relacionada com a matéria particulada (PM), incluindo PM2.5 e PM10. PM2.5 refere-se a partículas com diâmetro de 2.5 µm ou menores, enquanto PM10 refere-se a partículas com diâmetro de 10 µm ou menores. Uma densidade de poeira mais alta indica níveis mais elevados de PM2.5 e PM10 no ar.

Particle Size Comparison
Comparação de Tamanho de Partículas (source)

Por que é que a poluição por PM2.5 é prejudicial para a saúde?

De todas as medidas de poluição do ar, a poluição por PM2.5 representa a maior ameaça para a saúde. Devido ao seu tamanho pequeno, o PM2.5 pode permanecer suspenso no ar por longos períodos e pode ser absorvido profundamente na corrente sanguínea após a inalação.

Quais são as principais fontes de poluição por PM2.5?

Fontes comuns de poluição por PM2.5 são motores e combustão, processos industriais, fogões, lareiras e queima de madeira doméstica, fumo de fogos de artifício e incêndios florestais, tabagismo, partículas de pó e pólen.

Um sensor de PM2.5 ou PM10 pode medir pólen?

A maioria das partículas de pólen é maior que as partículas PM2.5 e PM10 e seria ignorada por um sensor PM2.5 ou PM10. No entanto, embora as partículas de pólen geralmente tenham mais de 10 µm, podem fragmentar-se em partículas menores na faixa PM2.5, que podem ser medidas.