Basic Tutorial for Arduino, 空氣品質感測, 進階篇

【Arduino進階教學】攀藤 PMS5003T PM2.5 粉塵及溫濕度感測器:雷射散射原理、8-Pin腳位定義與雙範例程式碼實作

一、 實驗說明:為什麼選擇攀藤 PMS5003T 二合一感測器?

在製作 Arduino 空氣品質監測器或智慧清淨機專題時,Plantower 攀藤 PMS5003T(又稱 G5T) 是目前市場上精準度極高且功能全面的鐳射顆粒物感測模組。

核心技術與感測優勢

  1. 鐳射散射原理 (Laser Scattering): 透過鐳射照射空氣中的懸浮微粒,收集散射光強度隨時間變化的波形,並依據米氏 (Mie) 散射理論演算法換算得出 PM1.0、PM2.5 及 PM10 的質量濃度(微克/立方公尺, )。

  2. 溫濕度二合一整合: 模組內部內建高精度溫濕度感測晶片,能同時輸出空氣 PM 濃度與環境溫度、濕度,無需額外外接 DHT11/DHT22 感測器。

  3. 數位 UART 通訊介面: 採用 9600 bps 主動式 TX/RX 序列埠傳輸,傳輸穩健、抗干擾能力強。

二、 PMS5003T 模組說明:外觀尺寸與腳位定義

攀藤 PMS5003T 採用精巧的金屬外殼設計,能有效屏蔽電磁干擾 (EMI)。模組機構包含獨特的風道進出氣孔配置與標準 8-Pin 數位介面。

攀藤 PMS5003T PM2.5 感測器外觀尺寸圖與進氣孔出氣孔數位接口說明

圖一: 攀藤 PMS5003T (G5T) 感測器外觀機構與工程尺寸圖。標示有出氣孔、進氣孔位置、數位通訊接口,以及長 50mm x 寬 38mm x 高 21mm 的外觀尺寸與底部安裝孔距。

 

攀藤 PMS5003T PM2.5 感測器 8-Pin 連接器腳位定義與功能對照表

圖二: 攀藤 PMS5003T 模組原生 8-Pin 連接器腳位定義圖。詳細標示 PIN 1 至 PIN 8 之功能,包含 VCC 5V 電源、GND、SET 休眠控制、RX/TX 序列埠數據傳輸、RESET 重置腳位與空腳(NC)說明。

三、 ???? 準備好你的硬體工具了嗎?

在開始進行電路接線與程式編寫前,建議先備齊原廠攀藤 PMS5003T 感測模組與轉接板,確保訊號傳輸穩定可靠:

推薦選購: 攀藤 PMS5003T PM2.5 + 溫濕度二合一感測器模組(含轉接板與連接線)

四、 實驗所需材料與電路接線圖 (Hardware Setup)

攀藤 PMS5003T 模組通常搭配 8-Pin 轉接板(或 G5 轉接板) 進行開發。本範例使用 SoftwareSerial 將 Arduino 的 Digital Pin 2 設定為 RX、Digital Pin 3 設定為 TX。

⚠️ 注意事項:

  • 攀藤感測器的工作電源為 5V。

  • 請務必確認轉接板上的腳位標示,避免 VCC 與 GND 接反導致晶片毀損。

準備材料

  • Arduino Uno R3 開發板 x 1

  • USB 傳輸線 x 1

  • Plantower 攀藤 PMS5003T 模組 + 轉接板 x 1

  • 杜邦線 若干

腳位對接說明 (Pin Mapping)

PMS5003T 轉接板腳位 功能說明 Arduino Uno 對應引腳
VCC 電源正極 (5V) 5V
GND 電源接地 GND
TX 模組傳送端(輸出數據) Pin 2 (Arduino RX)
RX 模組接收端(輸入命令) Pin 3 (Arduino TX)

五、 必備函式庫與安裝步驟

編譯 範例一 前,請先透過 Arduino IDE 的程式庫管理員安裝:

  1. 開啟 Arduino IDE,點選 草稿碼 (Sketch) > 匯入程式庫 (Include Library) > 管理程式庫 (Manage Libraries)。

  2. 在搜尋欄輸入 「PMS Library」。

  3. 找到 PMS Library by Mariusz Janky 並點擊 「安裝 (Install)」。

六、 程式碼實作範例

程式範例一:使用 PMS 函式庫讀取 PM 數據 (PMS Library Demo)

本範例呼叫標準 PMS 函式庫,快速讀取並顯示 PM1.0、PM2.5 及 PM100(PM10)的數值。

#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();
  }

}

 

▼顯示結果

 

程式範例二:免函式庫直接解析 UART 封包(讀取 PM 及溫濕度) (Raw UART Packet Parsing)

本範例直接透過 SoftwareSerial 接收序列埠資料,比對起始碼 0x42 與 0x4D 後,直接將各 Byte 計算組合出 PM1.0、PM2.5、PM10 濃度以及環境溫度與環境濕度。

▼可同時監測空氣中顆粒物濃度和溫濕度,有興趣的朋友可以參考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);
}

 

▼顯示結果

七、 常見問題與除錯 (FAQ)

Q1:序列埠顯示「check failed」或完全沒有數據輸出?

  • 解答:

    1. 請檢查 TX 與 RX 是否反接(Arduino 的 Pin 2 (RX) 應連接至感測器的 TX;Arduino 的 Pin 3 (TX) 連接至感測器的 RX)。

    2. 請確認感測器供電是否為穩定的 5V,電壓不足可能導致風扇運轉異常或序列埠傳輸失敗。

Q2:範例一與範例二有什麼不同?

  • 解答:

    • 範例一: 使用官方/通用 PMS 函式庫,程式碼最簡短,適合只需要 PM2.5 數據的專題。

    • 範例二: 直接解析原始 UART 封包,無需額外安裝第三方函式庫,且能額外讀出 PMS5003T 獨有的溫度與濕度數據。

Q3:剛開機時讀到的 PM2.5 數值忽高忽低?

  • 解答: 攀藤感測器通電初期風扇需時間建立穩定氣流,前 30 秒為預熱穩定期,建議在正式紀錄數據前忽略開機前幾筆資料。

延伸閱讀與推薦課程