Skip to Content

Sensore di polvere DSM501a con Arduino

Sensore di polvere DSM501a con Arduino

In questo tutorial imparerai come utilizzare il Dust Sensor DSM501a con un Arduino per valutare la qualità dell’aria.

Il modulo sensore di polvere DSM501 combinato con progetti Arduino ti permette di monitorare la qualità dell’aria. Grazie alla sua capacità di rilevare particelle piccole fino a 1 micron, questo modulo è ottimo per misurare le concentrazioni di polvere domestica, polline, acari, germi e fumo di sigaretta, noti fattori scatenanti di malattie respiratorie e allergie.

Iniziamo con i componenti necessari.

Componenti necessari

Oltre al DSM501 ti servirà un Arduino o un altro microcontrollore con logica a 5V. Ho usato un Arduino Uno, ma qualsiasi altra scheda Arduino con logica a 5V andrà bene.

Dust Sensor DSM501a

Arduino

Arduino Uno

Dupont wire set

Set di fili Dupont

Half_breadboard56a

Breadboard

USB Data Sync cable Arduino

Cavo USB per 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.

Nozioni di base sul Dust Sensor DSM501

Il DSM501 è un modulo sensore per misurare la concentrazione di particelle. Il sensore può rilevare particelle fino a 1µm e misurare la quantità di particelle sospese in una stanza con dimensioni fino a 30m3. L’immagine sottostante mostra il retro e il fronte del modulo sensore.

DSM501 Dust Sensor Back and Front
Retro e fronte del Dust Sensor DSM501

Funzionamento

Il sensore funziona utilizzando un elemento riscaldante per generare un flusso d’aria. Le particelle nel flusso sono illuminate da un diodo IR (LED) e la quantità di luce riflessa viene misurata da un sensore a infrarossi (PT). Questa misura viene poi convertita in un segnale di uscita PWM. L’immagine sottostante mostra la posizione dei componenti e il principio di funzionamento del sensore.

Components and function of DSM501
Componenti e funzionamento del DSM501 (source)

Ecco una foto dell’interno del DSM501. Si possono vedere la resistenza che funge da elemento riscaldante in basso, il fotodiodo IR a destra e il LED IR a sinistra.

Interior of DSM501
Interno del DSM501 (source)

Installazione

Il sensore deve essere installato nella posizione “verticale” mostrata sotto. Solo in questa orientazione l’aria riscaldata fluirà verso l’alto, passando attraverso il LED e l’elemento rilevatore. Assicurati di tenere il sensore lontano da altri flussi d’aria artificiali (ventole) e fonti di umidità.

Orientation of Sensor for correct operation
Orientamento del sensore per un corretto funzionamento

La lente davanti al rilevatore IR (PT) è rivestita con un polimero antistatico e antipolvere. Tuttavia, dovrebbe essere pulita ogni sei mesi in ambienti d’ufficio e ogni tre mesi in ambienti industriali.

Il modulo ha un trimmer VR per la regolazione della sensibilità, ma è preimpostato e non dovrebbe essere modificato.

Pinout

L’immagine seguente mostra il pinout del DSM501. Il pin di controllo può essere ignorato per ora. Vout1 e Vout2 sono le uscite PWM. Vout2 rileva particelle > 1µm e Vout1 particelle > 2.5µm. VCC e GND sono i pin di alimentazione. Il modulo funziona a 5V.

Pinout of DSM501
Pinout del DSM501

Nota che il modulo DSM501 di solito viene fornito con un connettore prefabbricato e un cavo con codifica colore errata! Non farti ingannare. Il nero NON è massa e il rosso NON è VCC. Guarda l’immagine sotto e fai attenzione.

Color coding of connector cables of  DSM501
Codifica colore dei cavi del connettore del DSM501

Ora, una breve nota sul pin di controllo. Puoi regolare la sensibilità della dimensione delle particelle di Vout1 aggiungendo una resistenza tra il pin di controllo e massa. Ma non lo useremo e manterremo le impostazioni di default: Vout2 (> 1µm) e Vout1 (> 2.5µm). Per maggiori dettagli vedi il datasheet. L’immagine sotto mostra come il segnale PWM dei pin Vout cambia in base alle dimensioni delle particelle rilevate.

(source)

Specifiche tecniche

Di seguito trovi le specifiche del DSM501. La parte più importante da notare è la tensione di alimentazione a 5V e il consumo piuttosto elevato di 90mA dovuto all’elemento riscaldante.

  • Tensione di alimentazione: DC5V±10%
  • Consumo energetico: 90mA
  • Intervallo di temperatura operativa: -10~ +65℃
  • Intervallo di umidità operativa: 95%RH o meno
  • Condizioni di stoccaggio consigliate: -20~ +80℃
  • Dimensioni: L59 * A45 * P20 (mm)
  • Dimensione particelle rilevabili: circa 1µm (minimo)
  • Intervallo di concentrazione rilevabile: 0 ~ 1.4mg/m3
  • Segnale di uscita: PWM (modulazione di larghezza di impulso)
  • Tempo di stabilizzazione: 1 minuto dopo l’accensione

Per maggiori dettagli consulta i datasheet. Esistono diverse versioni leggermente differenti. Ho elencato le due più complete qui sotto.

Collegare il DSM501 ad Arduino

Collegare il DSM501 ad un Arduino è semplice. Inizia collegando GND a GND e VCC a 5V. Poi collega Vout1 al Pin 7 dell’Arduino e Vout2 al Pin 8. I pin GPIO specifici non sono critici e puoi sceglierne altri se preferisci. Il pin di controllo del DSM501 rimane scollegato (aperto). Lo schema sotto mostra il cablaggio completo.

Wiring of DSM501 with Arduino
Cablaggio del DSM501 con Arduino

Con il cablaggio completato, parliamo di come misurare le concentrazioni di particelle prima di scrivere il codice.

Misurare le concentrazioni di particelle

I pin Vout del DSM501 producono un segnale PWM (modulazione di larghezza di impulso), dove la durata dell’impulso dipende dalla quantità di particelle rilevate. Per convertire questo segnale in una concentrazione di particelle dobbiamo prima calcolare il cosiddetto rapporto di impulsi bassi, come descritto di seguito.

Low pulse ratio
Rapporto di impulsi bassi (source)

Il rapporto di impulsi bassi è semplicemente la percentuale del tempo in cui l’impulso è basso durante il tempo di misura t, dove un tempo di misura tipico è tra 5 e 30 secondi. Per esempio, nell’esempio sopra il rapporto di impulsi bassi si calcolerebbe come

Rapporto di impulsi bassi (%) = (t1 + t2 + t3) / t x 100

Concentrazione di particelle in mg/m3

Una volta ottenuto il rapporto di impulsi bassi dobbiamo cercare la corrispondente concentrazione di particelle in mg/m3 nel grafico seguente. La curva rossa descrive le caratteristiche tipiche del sensore, mentre le curve blu e rossa rappresentano i limiti superiore e inferiore.

Caratteristiche del sensore per la misura in mg/m3 concentrazione (source)

Ovviamente, vogliamo convertire il rapporto di impulsi bassi in una concentrazione di particelle tramite una formula, senza consultare il grafico. Puoi trovare varie formule in diversi blog, ma tendono ad essere leggermente imprecise. Ho quindi scelto alcuni punti della curva rossa sopra per replicare il grafico e calcolare un fit polinomiale di secondo ordine. L’immagine sotto mostra i punti e la curva adattata.

My replica of the sensor's characteristics curve
La mia replica della curva delle caratteristiche del sensore

I coefficienti e la formula per il fit polinomiale sono i seguenti:

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

Con questa formula possiamo ora calcolare la concentrazione di particelle in mg/m3 per un dato rapporto di impulsi bassi r.

Concentrazione di particelle in pcs/283ml

Analogamente, il datasheet fornisce una seconda curva caratteristica per misurare la concentrazione di particelle in pcs/283ml.

Caratteristiche del sensore per la misura in pcs/283ml (source)

Questo grafico mostra una relazione lineare tra il rapporto di impulsi bassi r e la concentrazione in pcs/283ml fino a una concentrazione di 12000 pcs/283ml, dove il sensore si satura. La parte lineare può essere descritta dalla seguente equazione:

c_pcs283ml = 625*r

Con queste due formule abbiamo tutto il necessario per calcolare le concentrazioni di particelle in mg/m3 o in pcs/283ml a partire da un rapporto di impulsi bassi r misurato.

Codice per misurare le concentrazioni di polvere con DSM501

Il codice seguente mostra come misurare le concentrazioni di particelle in mg/m3 e in pcs/283ml per particelle di dimensioni >1µm (PM1) o >2.5µm (PM2.5). Dai un’occhiata veloce al codice completo prima di entrare nei dettagli.

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

Il codice inizia definendo costanti per i pin di ingresso dal DSM501 e il tempo di campionamento. Il tempo di campionamento è il tempo che il codice impiega per effettuare una misura completa delle concentrazioni di particelle.

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

Il datasheet consiglia un valore tra 5 e 30 secondi. Un tempo di campionamento più lungo fornisce misurazioni più stabili ma meno frequenti.

Funzioni di supporto

Successivamente definiamo una funzione di supporto per calcolare il rapporto di impulsi bassi. Divide semplicemente il tempo accumulato di impulsi bassi per il tempo di campionamento e lo moltiplica per 100 per ottenere una percentuale.

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

La calc_c_mgm3() funzione calcola la concentrazione di particelle in mg/m3. Usa la formula descritta sopra. Limitiamo la concentrazione minima a zero chiamando max(0, c_mgm3), poiché concentrazioni negative non hanno senso.

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 osservi attentamente la curva delle caratteristiche del sensore, puoi vedere che per rapporti di impulsi bassi molto bassi la concentrazione calcolata potrebbe diventare negativa.

Analogamente, la calc_c_pcs283ml() funzione calcola la concentrazione di particelle in pcs/283ml ma limita la concentrazione massima a 12500 pcs/283ml, dove il sensore si satura e la curva caratteristica non è più lineare.

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

Funzione di setup

La setup() funzione avvia la comunicazione seriale e imposta le modalità dei pin che leggono i dati dal DSM501. Il datasheet dice che il sensore necessita di circa 1 minuto di riscaldamento prima che le letture diventino stabili. Puoi abilitare il corrispondente delay qui.

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

Funzione loop

Infine abbiamo la loop() funzione. Usa la funzione pulseIn() per misurare il tempo basso di ingresso di P25 o PM1. Basta commentare l’ingresso che non vuoi misurare.

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

Nota che pulseIn restituisce la durata in microsecondi, che convertiamo in millisecondi moltiplicando per 1000.

I tempi bassi sono accumulati fino a raggiungere la fine del tempo di campionamento. Poi calcoliamo le diverse concentrazioni di particelle basate sul rapporto di impulsi bassi e le stampiamo.

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

Alla fine del tempo di campionamento resettiamo la concentrazione accumulata di particelle lowPM a 0 e resettiamo anche il tempo di campionamento per iniziare il prossimo periodo.

Nella sezione successiva, perfezioneremo questo sistema e costruiremo un semplice sistema di allarme qualità dell’aria.

Sistema di allarme qualità dell’aria con DSM501

L’esposizione prolungata a piccole particelle sospese nell’aria può causare problemi di salute. Un metodo comune per misurare la qualità dell’aria circostante è contare la concentrazione di particolato fine (PM) con diametro inferiore a 2.5µm. Il rischio per la salute con PM2.5 è che possono penetrare profondamente nelle vie respiratorie, raggiungendo i polmoni e entrando nel flusso sanguigno.

Esistono varie scale per classificare il rischio sanitario di diverse concentrazioni di PM2.5. La seguente tabella delle categorie di qualità dell’aria è tratta dal Victorian Government in Australia.

Air Quality Categories for PM2.5
Categorie di qualità dell’aria per PM2.5 (source)

Puoi vedere che le categorie vanno da Buona a Estremamente scarsa e dipendono dalla concentrazione media di PM2.5 su uno o 24 ore. Nota che queste categorie si basano su concentrazioni di PM2.5 misurate in µg/m3 e non in mg/m3, che è l’unità che abbiamo usato prima. Per informazioni più dettagliate su questi livelli e il loro potenziale impatto sulla salute, dai un’occhiata a Air quality categories and general health advice.

Costruiremo un sistema semplificato di allarme qualità dell’aria usando solo i primi tre livelli (da Buono a Scarso). A seconda della concentrazione di PM2.5 misurata, il sistema accenderà un LED verde (Buono), giallo (Discreto) o rosso (Scarso o peggio).

Cablaggio per il sistema di allarme qualità dell’aria

Possiamo usare lo stesso circuito di prima, senza modificare il cablaggio del DSM501, aggiungendo solo i tre LED con le loro resistenze di limitazione corrente. Il LED verde sarà collegato al pin 4, il giallo al pin 3 e il rosso al pin 2. L’immagine sotto mostra il cablaggio completo.

Wiring for Air Quality Warning with DSM501
Cablaggio per sistema di allarme qualità dell’aria con DSM501

Codice per il sistema di allarme qualità dell’aria

Il codice qui sotto è molto simile a quello visto prima. Le principali differenze sono che ora accendiamo tre LED e misuriamo le concentrazioni di PM2.5 in µ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();
  }
}

Per prima cosa definiamo le costanti per i pin del DSM501, i pin dei LED e il tempo di campionamento.

Nota che usiamo un tempo di campionamento di 30 secondi. Potresti cambiarlo a un’ora, come usato nella definizione delle categorie di qualità dell’aria, ma otterresti solo una lettura all’ora. L’opzione migliore sarebbe usare una finestra scorrevole, ma per mantenere il codice semplice non l’ho implementata.

La funzione calc_low_ratio() è la stessa di prima e la nuova calc_c_ugm3() è essenzialmente uguale alla vecchia funzione calc_c_mgm3(). Moltiplichiamo solo per 1000 per convertire da mg/m3 a µg/m3.

Nella funzione setup impostiamo le modalità dei pin e nella loop misuriamo la concentrazione di PM2.5 e accendiamo o spegniamo uno dei tre LED a seconda del livello.

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

Per concentrazioni di PM2.5 < 25 µg/m3 (Buono), accendiamo il LED verde. Per concentrazioni tra 25 µg/m3 e 50 µg/m3 (Discreto), accendiamo il LED giallo e sopra 50 µg/m3 (Scarso), accendiamo il LED rosso.

Il breve video seguente mostra il sistema in azione. Si vede il LED rosso accendersi quando il sensore è esposto alla polvere prodotta da un piumino in movimento.

Dimostrazione del sistema di allarme qualità dell’aria

Ed ecco il tuo piccolo sistema di allarme qualità dell’aria!

Conclusioni

Il DSM501 è un sensore economico e facile da usare per misurare le concentrazioni di particelle PM1 e PM2.5. In combinazione con un Arduino permette di costruire un semplice sistema di allarme qualità dell’aria.

Lo svantaggio del sensore è che la documentazione è un po’ carente. Ho dovuto derivare le formule per misurare le concentrazioni di particelle dalle curve caratteristiche del sensore nel datasheet, che è un po’ impreciso. Troverai che diversi articoli usano formule leggermente diverse.

Non so quanto sia preciso il DSM501 e senza una sorgente di particelle nota non puoi davvero calibrare il sensore. Tuttavia, per stime approssimative della qualità dell’aria dovrebbe essere sufficiente.

Infine, se vuoi un sensore che possa rilevare particelle più piccole, consumi meno energia e funzioni con un ESP32, dai un’occhiata al GP2Y1010AU0F Dust Sensor.

Link

Ecco alcuni link che ho trovato utili per cercare informazioni sulla qualità dell’aria, dimensioni delle particelle e polline.

FAQ

Quali sono i livelli di densità di polvere sani e non sani misurati in µg/m3?

I livelli sani di densità di polvere sono tipicamente sotto i 50 µg/m3, mentre i livelli non sani sono sopra i 150 µg/m3.

Qual è la relazione tra densità di polvere misurata in µg/m3 e particolato PM, in particolare PM2.5 e PM10?

La densità di polvere misurata in µg/m3 è direttamente correlata al particolato (PM), inclusi PM2.5 e PM10. PM2.5 si riferisce a particelle con diametro di 2.5 µm o meno, mentre PM10 a particelle con diametro di 10 µm o meno. Una densità di polvere più alta indica livelli maggiori di PM2.5 e PM10 nell’aria.

Particle Size Comparison
Confronto delle dimensioni delle particelle (source)

Perché l’inquinamento da PM2.5 è dannoso per la salute?

Tra tutte le misure di inquinamento atmosferico, l’inquinamento da PM2.5 rappresenta la maggiore minaccia per la salute. A causa delle sue piccole dimensioni, il PM2.5 può rimanere sospeso nell’aria per lunghi periodi e può essere assorbito profondamente nel flusso sanguigno una volta inalato.

Quali sono le principali fonti di inquinamento da PM2.5?

Le fonti comuni di inquinamento da PM2.5 sono motori e combustione, processi industriali, stufe, caminetti e riscaldamento a legna domestico, fumo da fuochi d’artificio e incendi boschivi, fumo di sigaretta, polvere e particelle di polline.

Un sensore PM2.5 o PM10 può misurare il polline?

La maggior parte delle particelle di polline è più grande delle particelle PM2.5 e PM10 e verrebbe ignorata da un sensore PM2.5 o PM10. Tuttavia, mentre le particelle di polline sono solitamente oltre i 10 µm, possono frammentarsi in particelle più piccole nella gamma PM2.5, che possono essere misurate.