ARDUINO, 空氣品質感測, 進階篇

【Arduino進階教學課程】攀藤 PMS5003T PM2.5 粉塵及溫濕度感測器

實驗說明:

  • 不少朋友在問,如果想做一個空氣品質監控系統該選用哪種感測器呢?米羅絕對是推薦各位這款工業級攀藤PMS5003T 粉塵溫濕度二合一感測器。Plantower PMS5003T 是目前較受歡迎的PM2.5感測模組,採用雷射散射原理量測,最小量測粒徑0.3um,依據空氣中不同的懸浮顆粒個數,推算灰塵的質量濃度,體積小、接線簡單、數據詳細、穩定性強是此模組的特色,並且內嵌瑞士生產的溫濕度一體檢測晶片,可以同時監測空氣中顆粒物濃度和溫濕度的二合一傳感器。
  • PMS5003T型號簡稱為G5T,注意不要買到PMS5003 (G5),兩種價格差不多,有「T」代表多了溫溼度感測功能。

 

▼購買PMS5003T 粉塵溫濕度二合一感測器:

攀藤 PMS5003T 鐳射 PM2.5 高精度 粉塵及溫濕度感測器

 

材料:

  • Arduino Uno R3
  • USB 傳輸線
  • PMS5003T 粉塵溫濕度二合一感測器
  • PMS5003T 專用轉接板與排線
  • 杜邦線

 

PMS5003T模組說明:

安裝 PMS 程式庫:

  • 在 Arduino 整合環境功能表點選 草稿碼 / 匯入程式庫 / 管理程式庫
  • 在右上方搜尋框輸入「pms」,下方會列出所有符合條件的程式庫,不同程式庫使用的程式碼並不相同。此處點   選「PMS Library」,該項目右下角會出現「安裝」鈕,按「安裝」鈕開始安裝。

 

基礎程式範例:

▼使用PMS 程式範例監測空氣中顆粒物濃度數值PM 1.0、PM 2.5、PM 10.0

#include <PMS.h> 
#include <SoftwareSerial.h> 

SoftwareSerial Serial1(2, 3); // 將Arduino Pin2設定為RX, Pin3設定為TX
PMS pms(Serial1);
PMS::DATA data;

void setup()
{
  Serial.begin(9600);   
  Serial1.begin(9600);
}

void loop()
{
  if (pms.read(data))
  {
    Serial.print("PM 1.0 (ug/m3): ");
    Serial.println(data.PM_AE_UG_1_0);

    Serial.print("PM 2.5 (ug/m3): ");
    Serial.println(data.PM_AE_UG_2_5);

    Serial.print("PM 10.0 (ug/m3): ");
    Serial.println(data.PM_AE_UG_10_0);

    Serial.println();
  }

}

 

▼顯示結果

 

進階程式範例:

▼可同時監測空氣中顆粒物濃度和溫濕度,有興趣的朋友可以參考PMS5003T傳輸通訊協定 P.13~P.14

原廠規格書Datasheet:載點

#include <SoftwareSerial.h> 

long pmat10 = 0;
int pmat25 = 0;
long pmat100 = 0;
unsigned int temperature = 0;
unsigned int humandity = 0;
int pmat25_value=0;

SoftwareSerial pmsSerial(2, 3); // 將Arduino Pin2設定為RX, Pin3設定為TX
 
void pms5003t_spec(){
  int count = 0;
  unsigned char c;
  unsigned char high;
  while (pmsSerial.available()) { 
    c = pmsSerial.read();
    if((count==0 && c!=0x42) || (count==1 && c!=0x4d)){
      Serial.println("check failed");
      break;
    }
    if(count > 27){ 
      Serial.println("Done!!");
      break;
    }
     else if(count == 10 || count == 12 || count == 14 || count == 24 || count == 26) {
      high = c;
    }
    else if(count == 11){
      pmat10 = 256*high + c;
      Serial.print("PM1.0=");
      Serial.print(pmat10);
      Serial.println(" ug/m3");
    }
    else if(count == 13){
      pmat25 = 256*high + c;
      Serial.print("PM2.5=");
      Serial.print(pmat25);
      Serial.println(" ug/m3");
    }
    else if(count == 15){
      pmat100 = 256*high + c;
      Serial.print("PM10=");
      Serial.print(pmat100);
      Serial.println(" ug/m3");
    }
     else if(count == 25){        
      temperature = (256*high + c)/10;
      Serial.print("Temp=");
      Serial.print(temperature);
      Serial.println(" (C)");
    }
    else if(count == 27){            
      humandity = (256*high + c)/10;
      Serial.print("Humidity=");
      Serial.print(humandity);
      Serial.println(" (%)");
    }   
    count++;
  }
  while(pmsSerial.available()) 
    pmsSerial.read();
  Serial.println();
}

void setup()
{
  pmsSerial.begin(9600);
  Serial.begin(9600);
}
 
void loop()
{
    pms5003t_spec();
    delay(1000);
}

 

▼顯示結果