Como ya dijimos en el anterior post (http://blog.e-ao.org/#post9), las partículas en suspensión en la atmosfera es un tipo de contaminación muy abundante, que afecta tanto a zonas rurales como a zonas urbanas. La estimación de su concentración puede hacerse a través de dispositivos que usan fuentes de luz, luz que al incidir sobre dichas partículas, sufre un proceso de retrodifusión o un oscurecimiento medible que es proporcional a su concentración.

Un dispositivo muy extendido en la comunidad ARDUINO DIY para medir la contaminación atmosférica debido a partículas es el GP2Y1010 – “Compact Optical Dust Sensor” – fabricado por SHARP. Dispositivo que en el anterior post utilizamos para desarrollar un sistema de medida de la concentración de partículas en base a una placa ARDUINO. Los resultados obtenidos con este dispositivo mostraron que presentaba un alto nivel de ruido en la medida. Además pudo observarse, tras las sucesivas pruebas llevadas a cabo con él, que era esencial mantenerlo aireado para que la renovación del aire en su célula de medida permitiera dar cuenta de las posibles variaciones de la concentración de aerosoles.

En este nuevo post explicaremos como podemos utilizar otro sensor cuyas características parecen ajustarse mejor a las necesidades que requiere un posible equipo de medida de la concentración de aerosoles. El equipo en cuestión es el PMS5003 cuya compra electrónica puede efectuarse también muy fácilmente y está al alcance de cualquier desarrollador amateur (figura 1).


Figura 1. PMS5003 sensor de aerosoles

Este dispositivo utiliza una fuente laser de luz, un pequeño aireador para renovar la célula de medida y es capaz de distinguir 3 diferentes diámetros en las partículas (1.0, 2.5 y 10 µm).

Leída la hoja e especificaciones de este dispositivo retendremos un par de aspectos (figura 2):
a) Su sistema de conexión permite directamente leer los datos a través de una conexión serie
b) Los niveles TTL de este sensor son de 3.3 V por lo que se deberán adaptar a los niveles TTL ARDUINO que trabaja con valores de 5 V.

Figura 2. Definición de conexiones y niveles TTL del sensor PMS5003

La forma final de un circuito ARDUINO que permita realizar la lectura de las concentraciones de aerosoles con este dispositivo simplemente requerirá alimentarlo y conectar las señales RX y TX del sensor PMS5003 a una puerta serie de la placa ARDUINO previa la transformación de los nivele TTL mediante un adaptador adecuado.

La figura 3 presenta la forma del dispositivo experimental que hemos construido sobre una placa ARDUINO MEGA.

Figura 3. Dispositivo experimental ARDUINO con el sensor PMS5003 y el adaptador de niveles TTL

Para poder llevar a cabo las medidas debemos programar nuestra placa ARDUINO adecuadamente. Tras una búsqueda un tanto laboriosa hemos encontrado en la RED un programa que decodifica los datos serie enviados por el dispositivo PMS5003. Este programa se presenta a continuación. Hay que tener en cuenta que en nuestro caso usamos la puerta serie1 de la placa ARDUINO MEGA que es la que es preciso activar, mientras que los datos se presentan a través la puerta serie por defecto que lleva al sistema y que se conecta al ordenador.

/////////////////////////////////////////////////////////////////////////
// CODIGO ARDUINO
////////////////////////////////////////////////////////////////////////

#include <Arduino.h>
#define LENG 31 //0x42 + 31 bytes equal to 32 bytes
unsigned char buf[LENG];

int PM01Value=0; //define PM1.0 value of the air detector module
int PM2_5Value=0; //define PM2.5 value of the air detector module
int PM10Value=0; //define PM10 value of the air detector module

void setup()
{
Serial.begin(9600);
Serial1.begin(9600); //use serial0
Serial1.setTimeout(1500); //set the Timeout to 1500ms, longer than the data transmission periodic time of the sensor
}
void loop()
{
if(Serial1.find(0x42)){ //start to read when detect 0x42
Serial1.readBytes(buf,LENG);

if(buf[0] == 0x4d){
if(checkValue(buf,LENG)){
PM01Value=transmitPM01(buf); //count PM1.0 value of the air detector module
PM2_5Value=transmitPM2_5(buf);//count PM2.5 value of the air detector module
PM10Value=transmitPM10(buf); //count PM10 value of the air detector module
}
}
}

static unsigned long OledTimer=millis();
if (millis() – OledTimer >=1000)
{
OledTimer=millis();

Serial.print(“PM1.0: “);
Serial.print(PM01Value);
Serial.println(” ug/m3″);

Serial.print(“PM2.5: “);
Serial.print(PM2_5Value);
Serial.println(” ug/m3″);

Serial.print(“PM10”);
Serial.print(PM10Value);
Serial.println(” ug/m3″);
Serial.println();
}

}
char checkValue(unsigned char *thebuf, char leng)
{
char receiveflag=0;
int receiveSum=0;

for(int i=0; i<(leng-2); i++){
receiveSum=receiveSum+thebuf[i];
}
receiveSum=receiveSum + 0x42;

if(receiveSum == ((thebuf[leng-2]<<8)+thebuf[leng-1])) //check the serial data
{
receiveSum = 0;
receiveflag = 1;
}
return receiveflag;
}

int transmitPM01(unsigned char *thebuf)
{
int PM01Val;
PM01Val=((thebuf[3]<<8) + thebuf[4]); //count PM1.0 value of the air detector module
return PM01Val;
}

//transmit PM Value to PC
int transmitPM2_5(unsigned char *thebuf)
{
int PM2_5Val;
PM2_5Val=((thebuf[5]<<8) + thebuf[6]);//count PM2.5 value of the air detector module
return PM2_5Val;
}

//transmit PM Value to PC
int transmitPM10(unsigned char *thebuf)
{
int PM10Val;
PM10Val=((thebuf[7]<<8) + thebuf[8]); //count PM10 value of the air detector module
return PM10Val;
}

En las figuras adjuntas a continuación (figura 4a y figura 4b) se presenta las medidas que el sensor proporciona. En la segunda figura se presenta el caso de la medida tras el envío de humo de un cigarrillo sobre el sensor.

Figura 4. A- valores de las concentraciones de aerosoles en condiciones normales. B- cuando se introducen en dispositivo humo de un cigarrillo.

De los resultados observados pensamos que este tipo de dispositivo es el adecuado para desarrollar un sistema ARDUINO de medida de aerosoles ya que presenta bastante estabilidad en su medida y permite discernir las concentraciones por diferentes diámetros de las partículas.