PitPPD42NS - DustSensor PPD42NS

L'utilizzo del sensore di qualità dell'aria PPD42NS.

 

 

Questioni teoriche

Come si può vedere dalla documentazione del sensore, questo non misura le PM10 in ug/m3 bensì il numero di particelle per 0,01 cf (cubic feet). Occorre quindi effettuare la trasformazione sul volume e poi stimarne la massa.

Coefficiente di trasformazione tra i volumi

Collegando il sensore PPD42NS ad Arduino, utilizzando il codice ricavato dall'articolo di Christopher Nafis si determinano il numero di particelle PM10 presenti in 0,01 cf (cubic feet). Occorre quindi ricavare il coefficiente di trasformazione tra 0,01 cf e 1 m3. La trasformazione è quella relativa ad una diversa unità di misura e come si vede negli allegati appunti dove sono stati svolti tutti i passaggi si ricava il coefficiente K = 35,3147 (si noti che è esattamente il reciproco del valore riportato sull'asse delle ascisse della tabella di correlazione del datasheet.

Coefficiente di trasformazione tra il numero di particelle e il loro peso

Questo procedimento non può essere esatto in quanto il sensore è in grado di misurare solo il numero di particella l'apporssimazione introdotta fa riferimento ad alcune assunzioni di base fondate (in parte) su dati di tipo statistico.

In primo luogo occorre considerare che PM10 sono particelle di diametro inferiore a 10 millesimi di millimetro (10x 10E-6 m).

Ovviamente attraverso un foro di diametro di 10 millesimi di millimetro passano anche particelle di diametro inferiore.

Alcuni studi esprimono il rapporto tra PM10, PM2.5 e PM1 - dall'analisi di questi studi è possible "stimare" tra le le particelle definite PM10 quante hanno un diametro compreso tra 10 e 2.5 millesimi di millimetro, quante tra 2.5 e 1 millesimo di millimetro e quante inferiore a 1 millesimo di millimetro.

Analizzando alcune di queste correlazioni si assumono le seguenti percentuali:

  • 35% - particelle di diametro tra 10 e 2.5 millesimi di millimetro
  • 39% - particelle di diametro tra 2.5 e 1 millesimo di millimetro
  • 26% - particelle di diametro inferiore a 1 millesimo di millimetro

Massa teorica di una sfera perfetta di diametro fissato

E' possibile calcolare la massa teorica di una sfera di diametro pari a 10 x 10E-6 m (DPM10), 2.5 x 10E-6 m (DPM25) e 10 x 1E-6 m (DPM1) moltiplicando il suo volume (V=4/3 pi r^3) per la sua densità. Si assume che la densità delle PM sia pari a 1650 kg/m3 (1650000 g/m3).

Rapporto medio tra la massa teorica e la massa reale (densità apparente)

La forma delle particelle non è evidentemente sferica ma presenta molte irregolarità le immagini riportate al microscopio elettronico ne sono la prova. Risulta pertanto necessario introdurre un coefficiente di trasformazione tra la massa teorica della sfera e quella della particella reale. Si assume questo rapporto pari a 0,4 e si calcola conseguentemente la densità apparente attraverso la quale si determina la massa apparente della sfera teorica come prodotto del volume teorico per la densità apparente delle PM.

Coefficiente di trasformazione tra n. particelle/0,01 cf e PM10 ug/m3

Effettuando i calcoli si ottiene il coefficiente di trasformazione tra il n. di particelle e le PM10 che stando le approssimazioni in gioco si assume pari a 230.

Appunti:

Negli allegati sono riportate le formule con i vari passaggi e un foglio di calcolo con la determinazione del coefficiente.

ozio_gallery_jgallery

Cosa serve:

  • PPD42NS compatibile
  • cavetti

Codice sorgente:


/*
  Zappoco        - DustSensor_18_10_03   26/10/2018 -- definizione dei rapporti di trasformazione
  Zappoco        - DustSensor_18_10_02   26/10/2018 -- inserimento della funzione getPM
  Zappoco        - DustSensor_18_10_01   25/10/2018 -- prime prove dello schetch di Christopher Nafis 
 * 
 Interface to Shinyei Model PPD42NS Particle Sensor
 Program by Christopher Nafis 
 Written April 2012
 http://www.seeedstudio.com/depot/grove-dust-sensor-p-1050.html
 http://www.sca-shinyei.com/pdf/PPD42NS.pdf
 JST Pin 1 (Black Wire)  => Arduino GND
 JST Pin 3 (Red wire)    => Arduino 5VDC
 JST Pin 4 (Yellow wire) => Arduino Digital Pin 3
  */
unsigned long duration;
unsigned long starttime;
unsigned long sampletime_ms = 30000;
unsigned long lowpulseoccupancy = 0;
unsigned long endtime;
float ratio = 0;
float concentration10 = 0;
float PM10 = 0;
float totPM10 = 0;
int   iCountertotPM10=0;
int pin10 = 3;
float PM10ratio = 230.0;
void setup() {
  Serial.begin(9600);
  pinMode(pin10,INPUT);
  starttime = millis();
}
void loop() {
    concentration10 = getPM(pin10);
    PM10 = concentration10 / PM10ratio;
    totPM10 += PM10;
    iCountertotPM10 ++;
    //Serial.print("PM10: ");  
    //Serial.print(concentration10);
    Serial.print(0.0);  
    Serial.print(" , ");  
    Serial.print(PM10);
    Serial.print(" , ");  
    Serial.print(totPM10/iCountertotPM10);
    Serial.println("");  
    delay (5000);
}
long getPM(int DUST_SENSOR_DIGITAL_PIN) {
  starttime = millis();
  while (1) {
    duration = pulseIn(DUST_SENSOR_DIGITAL_PIN, LOW);
    lowpulseoccupancy += duration;
    endtime = millis();
    if ((endtime-starttime) > sampletime_ms)
    {
    ratio = (lowpulseoccupancy-endtime+starttime)/(sampletime_ms*10.0);    // Integer percentage 0=>100
    long concentration = 1.1*pow(ratio,3)-3.8*pow(ratio,2)+520*ratio+0.62; // using spec sheet curve
    /*
    Serial.print("lowpulseoccupancy:");
    Serial.print(lowpulseoccupancy);
    Serial.print("\n");
    Serial.print("ratio:");
    Serial.print(ratio);
    Serial.print("\n");
    Serial.print("PPDNS42:");
    Serial.println(concentration);
    Serial.print("\n");
    */
    lowpulseoccupancy = 0;
    return(concentration);    
    }
  }  
}

 

Scarica tutto quello che serve: