前言
接連兩篇文章,我們都利用 WFduino 與 Scratch 3 來讀取 LASS 的空氣品質資訊。雖然使用上很方便,但是如果我們需要監測的地方 (像是住家內部) 沒有現成的 LASS 設備該怎麼辦呢?答案很簡單,自己建置一個就解決了。我們可以選擇購買一個現成的空氣盒子,也可以選擇自己動手組裝一個。在這篇文章中,我們將使用 Arduino 連接攀藤科技所生產的 PMS3003 來監測環境中的空氣品質,包含 PM10、PM2.5 與 PM1.0 的粒子濃度。除了 PMS3003 之外,我們還會使用 LCD1602 液晶顯示器作為數據的顯示。
攀藤科技除了 PMS3003 之外,還有一整個系列的感測器,有些型號甚至還提供了更多的數據,因此我們可視情況選用其他合適的型號,甚至是其他品牌的產品。
接線
使用 PMS3003 前需要先解決一件麻煩的事情,那就是 PMS3003 使用 1.25mm 的排線接頭,而我們平常使用的杜邦線接頭則為 2.54mm,也就是說 PMS3003 的排線接頭大小只有一半左右。購買時如果附送的排線兩邊都是排插,我們可以如下圖般硬把杜邦線插進去:
這樣的連接方式雖然可以正常使用,但是在美觀與穩固度方面仍顯不足。比較好的做法是先如下圖般剪掉一邊的排插:
接下來因為 1.25mm 排線內的多芯線過細而無法固定在 Arduino 的腳位插座上,所以必須使用杜邦線加以延伸。1.25mm 排線相當的細,在剝線時必須多加小心,不然很容易就因為不小心剪斷而越來越短。Arduino 使用 PMS3003 時只需要四個接腳,如果如下圖般將排插金屬面朝上,需要使用的線為紫色 (左一)、藍色 (左二)、黃色 (左四) 與橘色 (左五)。所以我們只需連接這四條排線,其餘未使用的排線則直接使用絕緣膠帶予以保護:
除了純手工的修改方式,也可考慮購買專用的轉接板,方便又省事。
環境建置
目前 WFduino 並沒有可供 PMS3003 使用的積木,所以這次我們捨棄 WFduino 與 DiFi 實驗板,而改用支援度超高的 Arduino。Arduino 有許多型號,我這次使用的是最常見的 Arduino Uno R3。PMS3003 雖然屬於平價的微粒偵測裝置,但是與其他類型的感測器相比仍貴上許多,使用時務必多加小心。
- 請前往這裡下載並安裝 Arduino IDE。
- 開啟 Arduino IDE。
- 選擇 “草稿碼” -> “匯入程式庫” -> “管理程式庫” 以開啟程式庫管理視窗。
- 輸入 liquidcrystal_i2c,從搜尋結果中找到 LiquidCrystal I2C 並安裝最新版本。
- 輸入 pms,從搜尋結果中找到 PMS Library 並安裝最新版本。
- 點選 “關閉” 以回到 Arduino IDE 主視窗。
線路圖
- PMS3003 接腳由上而下對應關係如下:
PMS3003接腳 Arduino 腳位 杜邦線顏色 1 無 無 2 無 無 3 無 無 4 2 綠色 5 3 藍色 6 無 無 7 GND 黑色 8 +5V 紅色 - LCD 1602 接腳對應關係如下:
LCM1602 IIC V1 接腳 Arduino 腳位 杜邦線顏色 GND GND 橘色 VCC +5V 黃色 SDA A4 綠色 SCL A5 藍色 - LCM1602 IIC 實際位置應該在 LCD1602 的背面,線路圖的畫法為往上翻,所以接腳順序上下顛倒。如不清楚請參考元件上接腳所呈現的編號,而不是上下位置關係。
- PMS3003 與 LCD1602 都使用 +5V 當作工作電壓,因為沒有使用麵包板的關係,因此無法共用 +5V 腳位作為供電來源。在這裡我們取巧使用 Arduino ICSP 的 VCC 當作 LCD1602 的供電來源。
程式範例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #include "PMS.h" #include "SoftwareSerial.h" #include "LiquidCrystal_I2C.h" SoftwareSerial Serial1(2, 3); // RX, TX PMS pms(Serial1); PMS::DATA data; LiquidCrystal_I2C lcd(0x3F, 16, 2); void setup() { Serial1.begin(9600); lcd.init(); lcd.backlight(); lcd.setCursor(0, 0); lcd.print("Warming up"); } void loop() { if (pms.read(data)) { lcd.setCursor(0, 0); lcd.print("PM2.5:" + String(data.PM_AE_UG_2_5) + "(ug/m3)"); lcd.setCursor(0, 1); lcd.print("PM10 :" + String(data.PM_AE_UG_10_0) + "(ug/m3)"); delay(10000); } } |
- 相較於接線的麻煩,在 Arduino 中使用 PMS3003 卻意外的簡單,透過現成的程式庫即可輕鬆取得各種微粒的數值。
- 第 1~3 行引入程式所需的程式庫。
- 第 5 行定義軟體模擬的序列埠,是 Arduino 與 PMS3003 之間的溝通介面。宣告時需指定實際連接的腳位編號,也就是 2 跟 3。
- 第 7 行宣告 PMS 控制物件,並指定溝通介面。
- 第 8 行宣告用來接收 PMS3003 回傳資料的變數。
- 第 9 行宣告 LCD1602 I2C 介面的控制物件,並指定 I2C 位址為 0x3F,顯示尺寸則為 16×2。
- 在初始化函式 setup 中我們設定序列埠的速度,並在設定 LCD1602 液晶顯示器後顯示 “Warming up” 字樣。
- 第 22 行讀取 PMS3003 的回傳資料。
- 第 24~27 在 LCD 上顯示讀取到的數據,在這裡我們僅顯示 PM2.5 以及 PM10 的大氣環境數值。PMS 程式庫共可傳回六個數據:
名稱 意義 PM_SP_UG_1_0 PM1.0 濃度 (標準顆粒) PM_SP_UG_2_5 PM2.5 濃度 (標準顆粒) PM_SP_UG_10_0 PM10 濃度 (標準顆粒) PM_AE_UG_1_0 PM1.0 濃度 (大氣環境) PM_AE_UG_2_5 PM2.5 濃度 (大氣環境) PM_AE_UG_10_0 PM10 濃度 (大氣環境) - 程式暫停 10 秒後再重新讀取新的數據。
將程式上傳至 Arduino 後,就可以看到 LCD1602 開始顯示 PM2.5 以及 PM10 的監測數據,如下圖所示:
利用 PMS3003 與 LCD1602 兩個元件,我們完成了簡易型的 PM2.5 濃度監測器。如果再加上溫、溼度感測器 (如 DHT11/22),就可以提供更為完整的空氣品質數據。目前我們直接將 PMS3003 所偵測到的數據加以顯示,在某些應用場合還算是合適。不過這種方式所呈現的數據短期波動過大,並不適合用來當作中長期的空氣品質評斷依據,比較合適的方式是先取一段時間內的監測數據並加以平均後才拿來顯示或應用。至於這段時間需要多久,就得看應用的情境了。如果是監測室內空氣品質變化,幾秒鐘至幾分鐘內的平均值都算是合理。至於室外或環境的研究,每小時乃至於每日平均可能就更為合適。
數據平均的功能我們可以選擇在 Arduino 中實現,不過更為方便的方式是先將監測數據由 Arduino 丟到數據分析的平台 (如 Thingspeak) 後再由數據分析平台針對收集到的數據進行平均或其他處理。如此一來,不但大幅簡化 Arduino 程式,而且還可以充分利用數據分析平台的強大運算能力,進行各式各樣複雜的運算與分析。


8 comments
請問依照您的程式碼打 會出現’data’ was not declared in this scope是甚麼原因呢?
如果確定兩個函式庫都沒有安裝錯誤,往往很有可能是函式庫衝到所造成的。
你可以先看一下 Sketchbook 目錄下有哪些函式庫,而 Sketchbook 目錄通常是 C:\Users\{使用者名稱}\Documents\Arduino\libraries
不好意思 請問PMS5003是否寫法一樣
是的,根據文件此函數庫可以同時用於 PMS5003,不過我手邊並沒有 PMS5003 可以驗證。
LCD1602 只會顯示亮光 沒有任何數據 請問該怎麼處理
嗯,有先試過強制輸出固定的訊息,確認 LCD 1602 接線正常嗎?
或是可以將讀到的數據同步輸出到 Serial Port,確認問題出在哪個環節上。
不好意思請問用不同得模組只要把函數庫放進去名子更改就好嗎
你是用哪一個模組?
不同的模組通常有不一樣的用法,並不是直接改名字就好