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