Screenshot 2025-02-22 113002.png

市場上最普遍被使用的空氣品質感測模組,肯定就是PMS系列了,其中又以PMS5003最受歡迎。PMS系列不論是PMS3003、PMS5003、PMS7003,只有外觀設計不同,主要是吸進空氣的設計不一樣,但在使用上基本沒什麼差別,精準度也太致相同,所以可自行挑選喜歡的款式。

我們提供的教學套件裡附的是PMS5003,如果你手邊是其它型號,以下的教學也完全適用哦。

購買Arduino PM2.5空氣品質偵測套件:
https://www.jmaker.com.tw/products/pm25-project

套件中會附有PMS專用的線材和轉接板,有了它們可以簡化接線的難度。把線的一頭插到PMS,另一頭插到轉接板,而轉接板上只有4個PIN,VCC接到UNO板上的5V,GND接到GND,TX接到PIN2,RX接到PIN3。

另外,因為我們要顯示偵測的結果,所以要有一個顯示器,套件中我們附的是一塊0.96吋的雙色OLED,這會讓顯示效果大大加分。

如果你對OLED的使用比較陌生,可以參考我們的完整教學。

教學:一套u8g2函式庫,玩遍所有OLED
https://blog.jmaker.com.tw/u8g2-oled/

在這個套件的OLED也有4個PIN,是I2C的版本,把VCC接到3.3V,GND接到GND,SDA接到A4,SCL接到A5,那就完成了。

Screenshot 2025-02-22 113116.png

在開始寫程式之前,先把需要的2個函式庫安裝好。首先安裝OLED需要的u8g2函式庫:U8g2 by oliver。

Screenshot 2025-02-22 123334.png

然後就是本範例的主角PMS的函式庫:PMS Library by Mariusz Kacki。

Screenshot 2025-02-22 123529.png

然後就開始寫程式吧。OLED的部份我們就不多介紹,只針對PMS部份。

先用SoftwareSerial建立和PMS連接的介面,接著建立PMS物件,利用它就可以從PMS取得偵測數據了。

OLED顯示部份,上面黃色載入了一張傑森轉好的圖檔,顯示標題:PM2.5監控系統。下方就顯示大大的PM2.5數值。

PMS5003其實可以偵測多種空氣品質,但我們這裡只針對PM2.5,所以程式用了:pm25 = data.PM_AE_UG_2_5。

然後loop()就不斷更新PMS5003偵測到的數值,這樣我們的作品就完成了!

/*
 * 本範程式為Arduino結合PMS5003 PM.2.5感測模組的範例程式,由傑森創工提供
 * 本程式需配合0.96吋OLED,適用於PMS5003、PMS3003、PMS7003
 * 
 * 1,請先安裝PMS Library by Mariusz Kacki和OLED的U8g2 by oliver函式庫,都可以在Arduino IDE程式管理員中找到。
 * 
 * 購買套件:
 * https://www.jmaker.com.tw/products/pm25-project
 * 
 * 粉絲團:https://www.facebook.com/jasonshow
 * 傑森創工購物網:https://www.jmaker.com.tw/
 * 傑森創工部落格:https://blog.jmaker.com.tw/
 */
#include <Arduino.h>
#include <U8g2lib.h>

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
#include "PMS.h"
#include <SoftwareSerial.h>
SoftwareSerial pmsSerial(2, 3);  //RX,TX。接到PMS5003的TX,RX
PMS pms(pmsSerial);
PMS::DATA data;

int pm25=0;

//這行是NodeOLED用的
//U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ D2, /* data=*/ D1, /* reset=*/ U8X8_PIN_NONE); 
U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);  //Arduino Uno+0.96吋OLED用這行
//U8G2_SH1106_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); //如果用1.3吋OLED用這行

//OLED上方標題,用圖形表現
static const unsigned char PROGMEM  title[256] = { /* 0X20,0X01,0X80,0X00,0X10,0X00, */
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X03,0XF3,0XCF,0XEF,0XFF,0X1F,0XFF,0XFD,0XFE,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC9,0XF3,0XCF,0X00,0XFE,0XC1,0XFF,0X7C,0XFE,
0X0F,0X78,0X38,0X3E,0XF8,0X3F,0XE0,0X01,0X03,0X4F,0X00,0X1E,0XF0,0XFF,0X02,0XE0,
0X8F,0X71,0X38,0X9E,0XF1,0X3F,0XE0,0X39,0XF9,0X03,0XD6,0XDE,0XF1,0X7F,0X3B,0XFB,
0X8F,0X63,0X18,0XDE,0XE3,0X3F,0XFF,0X39,0XFD,0XCF,0XD3,0XFF,0X9C,0X3F,0X98,0XFB,
0X8F,0X63,0X18,0XDE,0XF3,0X7F,0XFF,0X01,0XFF,0XCF,0X91,0X3F,0XC0,0XFF,0X98,0XF0,
0X8F,0X63,0X10,0XFE,0XF1,0X7F,0XF0,0XD9,0X03,0XCF,0X3C,0XFE,0X31,0XFF,0X02,0XE0,
0X8F,0X71,0X12,0XFE,0XF8,0X3F,0XC7,0X01,0XFE,0X0F,0XFF,0XFF,0X78,0X7E,0XB0,0XFD,
0X0F,0X78,0X22,0X7E,0XFC,0XFF,0XC7,0XFF,0XFF,0X83,0X00,0X1E,0X00,0X3C,0XB0,0XFD,
0X8F,0X7F,0X22,0X3E,0XFE,0XFF,0XC7,0X03,0XC0,0XCF,0XCF,0X3F,0XE6,0XFD,0XBB,0XFD,
0X8F,0X7F,0X22,0X1E,0XF0,0XBC,0XC7,0XB3,0XCD,0XCF,0XEF,0X7F,0X26,0X7F,0XB1,0XFD,
0X8F,0X7F,0X22,0X1E,0XF0,0X38,0XE3,0XB3,0XCD,0XCF,0XEF,0X3F,0X67,0X3E,0X95,0XED,
0X8F,0X7F,0X32,0X1E,0XF0,0X7C,0XF0,0X93,0XC8,0XCF,0X00,0X9E,0XE7,0X3C,0XC5,0XE5,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X01,0X80,0X47,0X00,0XDE,0XF1,0XBD,0XE7,0XE1,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
};

void setup()
{
  Serial.begin(9600);   
  pmsSerial.begin(9600);  
  u8g2.begin();
}

void loop()
{
  u8g2.setFont(u8g2_font_samim_16_t_all); //字型
  u8g2.firstPage();
  do {
    u8g2.drawXBMP(0,0, 128, 16, title);
    u8g2.setCursor(16, 64);
    u8g2.setFont(u8g2_font_osb41_tn);
    if (pms.read(data)){  //讀取PMS的數值
      pm25 = data.PM_AE_UG_2_5; 
      Serial.print("PM 2.5 (ug/m3): ");
      Serial.println(data.PM_AE_UG_2_5);
    }
    u8g2.print(pm25); //將讀到的PM2.5數值顯示在OLED上
    u8g2.setCursor(83, 58);
    u8g2.setFont(u8g2_font_samim_12_t_all);
    u8g2.print("ug/m3"); 
    
  } while ( u8g2.nextPage() );

}

Arduino PM2.5監控系統DIY套件 含PMS5003感測模組

NT$ 1,395

立刻購買