Pubblicato il

Monitorare la Qualità dell’Aria PM 2.5 a PM10 Sensore Arduino formaldeide temperatura e umidità

Premessa: Si tratta di un monitor multifunzione della qualità dell’aria in grado di rilevare non solo la concentrazione di particelle e formaldeide ma anche il valore di temperatura e umidità.Come sensore di concentrazione di particelle può essere utilizzato per ottenere tramite laser il numero di particelle sospese nell’aria. Integra inoltre al suo interno una sonda elettrochimica per formaldeide e un sensore a un chip per temperatura e umidità Il sensore può essere inserito in strumenti variabili in relazione ai parametri ambientali nell’aria o altre apparecchiature di miglioramento ambientale per fornire dati corretti nel tempo.

CARATTERISTICHE TECNICHE:

  • Tasso di falsi allarmi zero
  • Risposta in tempo reale
  • Dati corretti
  • Diametro minimo delle particelle distinguibili: 0,3 micrometri
  • Elevate prestazioni anti-interferenza grazie alla struttura brevettata della schermatura a sei lati
  • Direzione opzionale di ingresso e uscita dell’aria per adattare il diverso design
  • Concentrazione della produzione di formaldeide
  • Uscita temperatura e umidità
  • Tensione di esercizio: 5.0VDC
  • Corrente attiva: 100 mA
  • Corrente di standby: 200 uA
  • Livello interfaccia: L< 0.8V@3.3V ; H> 2.7V@3.3V
  • Intervallo di misurazione delle particelle: 0,3 ~ 1,0 μm; 1,0 ~ 2,5 μm; 2,5 ~ 10 μm
  • Efficienza di conteggio delle particelle: 50%@0.3μm 98%@>=0.5μm
  • Intervallo efficace delle particelle (standard PM2.5): 0 ~ 500μg/m
  • Intervallo massimo di particelle (standard PM2.5): >0 ~ 2000ug / m³
  • Risoluzione delle particelle: 1ug / m³
  • Errore di consistenza massima delle particelle (dati standard PM2.5):
  • ±10%@100~500μg/m³
  • ±10μg/m@0~100μg/m
  • Volume standard delle particelle: 0,1 L
  • Intervallo efficace della formaldeide: 0 ~ 1 mg / m³
  • Intervallo massimo di formaldeide: 0 ~ 2 mg / m³
  • Risoluzione formaldeide: 0.001
  • Errore di consistenza massima formaldeide: <± 5%
  • Intervallo massimo di temperatura: -10~50 ℃
  • Risoluzione della temperatura: 0,1 ℃
  • Errore massimo di temperatura: ± 0,5
  • Intervallo massimo di umidità: 0 ~ 99%
  • Risoluzione umidità: 0,1%
  • Errore massimo di umidità: ± 2%
  • Velocità di trasmissione predefinita: 9600 bps
  • Tempo di risposta totale: 10s
  • Intervallo di temperatura di esercizio: -10 ~ +60 ℃
  • Intervallo di umidità di lavoro: 0 ~ 99%
  • MTTF: ≥ 3 anni
  • Dimensioni: 50x38x21 mm / 1,97×1,50×0,83 pollici
  • Peso: 50 g

LISTA MATERIALI:

numero Etichetta Descrizione
PIN1 VCC 5V
PIN2 GND GND
PIN3 IMPOSTATO Imposta pin / livello TTL a 3,3 V , il livello alto o la sospensione è lo stato di funzionamento normale, mentre il livello basso è la modalità di sospensione.
PIN4 RXD Pin di ricezione della porta seriale/livello TTL a 3,3 V
PIN5 TXD Pin di invio porta seriale/livello TTL@3.3V
PIN6 RIPRISTINA Segnale di reset del modulo/livello TTL@3.3V , reset basso.
PIN7 NC
PIN8 NC

In questa sezione, dimostreremo come utilizzare questo sensore.

CODICE DI ESEMPIO:

Librerie:

  • SoftwareSerial LGPL: arduino.cc/en/Reference/SoftwareSerial
#include <SoftwareSerial.h>
SoftwareSerial Serial1(10, 11); // Software RX, TX
char col;
unsigned int PMSa = 0,FMHDSa = 0,TPSa = 0,HDSa = 0,PMSb = 0,FMHDSb = 0,TPSb = 0,HDSb = 0;
unsigned int PMS = 0,FMHDS = 0,TPS = 0,HDS = 0,CR1 = 0,CR2 = 0;
unsigned char buffer_RTT[40]={};     //Serial buffer; Received Data
char tempStr[15];
void setup()
{
  Serial.begin(115200);
  Serial1.begin(9600);

}

void loop()
{
  while(!Serial1.available());
  while(Serial1.available()>0)        //Data check: weather there is any Data in Serial1
  {
    for(int i=0;i<40;i++)
    {
      col =Serial1.read();
      buffer_RTT[i]=(char)col;
      delay(2);
    }

    Serial1.flush();

    CR1 =(buffer_RTT[38]<<8) + buffer_RTT[39];
    CR2 = 0;
    for(int i=0;i<38;i++)
      CR2 += buffer_RTT[i];
    if(CR1 == CR2)                         //Check
    {
PMSa=buffer_RTT[12];         //Read PM2.5 High 8-bit
      PMSb=buffer_RTT[13];         //Read PM2.5 Low 8-bit
      PMS=(PMSa<<8)+PMSb;          //PM2.5 value
      FMHDSa=buffer_RTT[28];         //Read Formaldehyde High 8-bit
      FMHDSb=buffer_RTT[29];         //Read Formaldehyde Low 8-bit
      FMHDS=(FMHDSa<<8)+FMHDSb;     //Formaldehyde value
      TPSa=buffer_RTT[30];          //Read Temperature High 8-bit
      TPSb=buffer_RTT[31];          //Read Temperature Low 8-bit
      TPS=(TPSa<<8)+TPSb;        //Temperature value
      HDSa=buffer_RTT[32];          //Read Humidity High 8-bit
      HDSb=buffer_RTT[33];          //Read Humidity Low 8-bit
      HDS=(HDSa<<8)+HDSb;      //Humidity value
    }
    else
    {
      PMS = 0;
      FMHDS = 0;
      TPS = 0;
      HDS = 0;
    }
  }

  Serial.println("-----------------------uart--------------------------");
  Serial.print("Temp : ");
  sprintf(tempStr,"%d%d.%d",TPS/100,(TPS/10)%10,TPS%10);
  Serial.print(tempStr);
  Serial.println(" C");              //Serial pring Temperature
  Serial.print("RH   : ");
  sprintf(tempStr,"%d%d.%d",HDS/100,(HDS/10)%10,HDS%10);
  Serial.print(tempStr);          //Serial print humidity
  Serial.println(" %");
  Serial.print("HCHO : ");
  Serial.print(FMHDS);
  Serial.println(" ug/m3");       //Serial print formaldehyde, unit: ug/m³
  Serial.print("PM2.5: ");
  Serial.print(PMS);
  Serial.println(" ug/m3");       //Serial print PM2.5, unit: ug/m³
  Serial.println();
}

APPLICAZIONE CON LCD:

Librerie:

  • Wire LGPL: arduino.cc/en/Reference/Wire
  • DFRobot_RGBLCD LGPL: github.com/DFRobot/DFRobot_RGBLCD
#include <Wire.h>
#include "DFRobot_RGBLCD.h"
char col;
unsigned int PMSa = 0, FMHDSa = 0, TPSa = 0, HDSa = 0, PMSb = 0, FMHDSb = 0, TPSb = 0,
             HDSb = 0,PMS = 0,TPS= 0,  HDS = 0, CR1 = 0, CR2 = 0,FMHDS = 0;
unsigned char buffer_RTT[40] = {};    //Serial buffer; Received Data
char tempStr[15];
DFRobot_RGBLCD lcd(16, 2);  //RGB address; 16 characters and 2 lines of show

void setup()
{
  Serial.begin(9600);
  lcd.init();                                     //Initialize LCD RGB Screen
  lcd.setRGB(0, 255, 0);               //Set backlight color
  lcd.setCursor(0, 0 );                   //Start from (0, 0)
  lcd.print("T:");
  lcd.setCursor(9, 0 );
  lcd.print("H:");
  lcd.setCursor(0, 1 );
  lcd.print("F:");
  lcd.setCursor(9, 1 );
  lcd.print("P:");
}

void loop()
{
  while (Serial.available() > 0)       //Data check: weather there is any Data in Serial1
  {
    for (int i = 0; i < 40; i++)            //Read Serial port data
    {
      col = Serial.read();
      buffer_RTT[i] = (char)col;
      delay(2);
    }

    Serial.flush();
    CR1 = (buffer_RTT[38] << 8) + buffer_RTT[39];
    CR2 = 0;
    for (int i = 0; i < 38; i++)
      CR2 += buffer_RTT[i];
    if (CR1 == CR2)                      //Check
    {
      PMSa = buffer_RTT[12];      //Read PM2.5 High 8-bit
      PMSb = buffer_RTT[13];      //Read PM2.5 Low 8-bit
      PMS = (PMSa << 8) + PMSb;  //PM2.5 value
      FMHDSa = buffer_RTT[28];     //Read Formaldehyde High 8-bit
      FMHDSb = buffer_RTT[29];     //Read Formaldehyde Low 8-bit
      FMHDS = (FMHDSa << 8) + FMHDSb; //Formaldehyde value
      TPSa = buffer_RTT[30];      //Read Temperature High 8-bit
      TPSb = buffer_RTT[31];      ///Read Temperature Low 8-bit
      TPS = (TPSa << 8) + TPSb;   //Temperature value
      HDSa = buffer_RTT[32];    //Read Humidity High 8-bit
      HDSb = buffer_RTT[33];      //Read Humidity Low 8-bit
      HDS = (HDSa << 8) + HDSb;  //Humidity value
    }
    else
    {
      PMS = 0;
      FMHDS = 0;
      TPS = 0;
      HDS = 0;
    }
  }
  lcd.setCursor(2, 0 );
  sprintf(tempStr,"%d%d.%d",TPS/100,(TPS/10)%10,TPS%10);  //Temperature display
  lcd.print(tempStr);
  lcd.write(0xdf);              //°
  lcd.print('C');                 //C
  lcd.setCursor(11, 0 );
  sprintf(tempStr,"%d%d.%d",HDS/100,(HDS/10)%10,HDS%10);   //Humidity display
  lcd.print(tempStr);
  lcd.print('%');               //%
  lcd.setCursor(2, 1 );
  lcd.print((float)FMHDS/1000);  //print formaldehyde, unit: ug/m³
  lcd.print((int)FMHDS%10);
  lcd.setCursor(11, 1 );
  sprintf(tempStr,"%d%d%d",PMS/100,(PMS/10)%10,PMS%10);  //print PM2.5, unit: ug/m³
  lcd.print(tempStr);
}

Buon progetto.