冬天一到,天空又是灰濛濛的,一直以來不良的冬季空氣品質練就了高雄人的鐵肺(一股淡淡的哀傷),再加上前陣子歸仁大火延燒,高雄空品甚至達紫爆等級;面對這些肉眼難以辨識的懸浮粒子,我們來實作小型空氣品質監測裝置,追蹤空氣品質的變化,就能知道空氣清淨機有沒有好好工作了(是這樣嗎)。
本次要監測的空氣品質包含PM2.5(懸浮微粒)以及二氧化碳濃度,並透過AM7020將資料上傳至AdafruitIO平台(沒有使用過Adafruit IO的朋友可以參考這篇文章,5步驟輕鬆上手Adafruit IO平台!),照著步驟實作,粗估只需花上3小時就能完成囉!
空品偵測器在後面文章Google試算表也能當資料庫?Arduino × App Script實作:空品偵測器!也有使用同樣材料再次實作,惟透過AM7020將資料上傳至App Script平台。功能上各有優缺點,文末有較詳細的解析說明;不過大致可依照使用者需求,自行評估選用的平台及方式:Adafruit IO有較好的直覺式體驗,而App Script則在後續資料應用上有較高的彈性。
所需材料
-
ESP32
-
AM7020(含SIM Card、天線)
-
ZH03B(細懸浮微粒感測器)
-
MH-Z19B(二氧化碳濃度感測器)
-
杜邦線數條
ESP32
ESP32是一塊同時具有WiFi及Bluetooth功能的開發板,具有兩組HW UART。
這次範例會使用第二組HW UART與AM7020溝通,另外使用兩組SW UART與PM2.5及CO2感測器溝通,並將MQTT Protocol Stack 建置在ESP32上。
AM7020
AM7020是一款NBIoT模組,模組本身支援HTTP(S)、MQTT(S)、TLS等多項Protocol,加上專屬AM7020的Arduino Library,讓使用門檻大大降低,對初學者相當親切的一款模組。
ZH03B(細懸浮微粒感測器)
PM2.5感測器使用輝盛(Winsen)的ZH03B,ZH03B跟常見的攀藤PMS3003 在使用方法及原理上是一樣的,有興趣的夥伴可以自行研究相似處。ZH03B內部使用風扇進氣與雷射感測懸浮微粒,比紅外線式更加精準,甚至可量測PM10、PM2.5與PM1.0等多種懸浮粒子。
ZH03B提供的介面有PWM(Pulse Width Modulation,脈衝寬度調變)與UART兩種形式,PWM輸出會依照目前感測的PM2.5數值改變Duty Cycle,藉由轉換公式得到正確的感測值;而UART則是直接將PM2.5數值藉由UART傳遞。為了避免轉換誤差,我們會直接使用UART介面作資料傳輸。
當然除了ZH03B之外也有不同類型的感測器可選擇,如SHARP 的GP2Y1051AU0F或是Shinyei的PPD42NS等;但此類的感測使用的是引流加熱電阻與紅外線感測,相比之下雖然價格略為便宜但精準度卻不及ZH03B,大家可以自行衡量選用的材料,本次將以ZH03B為範例實作。
MH-Z19B(二氧化碳濃度感測器)
在室內環境中還有一個重要的氣體指標,就是二氧化碳CO2了。當室內二氧化碳濃度較高時,不但容易感到昏昏欲睡,久了也會對人體造成傷害。
然而相較於PM2.5感測器, CO2感測器因不易取得、價格較高,使得鮮少人使用與感測。
我們本次選用輝盛(Winsen)的MH-Z19B二氧化碳感測模組,其特性是高靈敏度、響應時間快、輸出線性、響應氣體單一,感測範圍為0~5000ppm,適合在室內外空間量測。
傳統的電化學氣體感測器(如MQx系列)通常都會對兩種氣體以上響應,且反應時間久需要一定時間加熱後才會準確;而MH-Z19B採用NDIR(Non Dispersive Infrared,非散色紅外線)感測,最大的優點是可以設計成僅針對單一氣體作響應,不會受到其他氣體濃度影響讀值,且受溫濕度影響較小,使用壽命也較長,同時內建溫度感測,主要用意是可以依據不同的環境溫度作溫度補償的參考。
MH-Z19B提供的介面就如同稍早提過的ZH03B一樣,有PWM(Pulse Width Modulation,脈衝寬度調變)與UART兩種形式;再為各位複習一次,PWM輸出會依照感測的二氧化碳濃度改變Duty Cycle,藉由轉換公式得到正確的感測值;而UART則是直接將二氧化碳濃度藉由UART傳遞。同樣的為了避免轉換誤差,與ZH03B一樣,我們直接使用UART介面作資料傳輸。
架構
ESP32作為主控版並使用Software Uart與MH-Z19B、ZH03B溝通,使用Hardware Uart與AM7020溝通,AM7020使用MQTT Protocol將pm2.5及co2感測資料上傳至Adafruit IO平台。
步驟
1. 設定Adafruit IO平台
2. 硬體配置
3. 程式設計
1. 設定Adafruit IO平台
透過Adafruit IO平台建立一個Group及四個Feed(如上圖),用來存放CO2濃度、CO2濃度燈號、PM2.5及PM2.5燈號;Group名稱為IAQ,Feed名稱依序為co2、co2_color、pm25及pm25_color(若對Adafruit IO設定還不熟悉或是從未用過該平台的朋友,可參考5步驟輕鬆上手Adafruit IO平台!)。
接下來需要為Adafruit IO平台建立一個Dashboard,目的是將CO2濃度、CO2濃度燈號、PM2.5及PM2.5燈號以圖形化方式呈現,Dashboard名稱為IAQ。
CO2及PM2.5數值顯示的圖形種類請選擇Line Chart(折線圖),並同時選擇co2及pm25的Feed(如上圖)。CO2濃度燈號及PM2.5燈號顯示的圖形種類請選擇Color Picker(顏色選擇器),並「個別」選擇co2_color及pm25_color的Feed(請分兩次個別設定,一次同時選擇會導致燈號顯示不正確唷)。
硬體配置
ESP32 |
AM7020 |
ZH03B |
MH-Z19B |
5v |
V |
VDD |
VDD |
GND |
G |
GND |
GND |
TX2 |
R |
- |
- |
RX2 |
T |
- |
- |
D4 |
EN |
- |
- |
D5(sw uart rx) |
- |
TX |
- |
D18(sw uart rx) |
- |
- |
TX |
D19(sw uart tx) |
- |
- |
RX |
D23(sw uart tx) |
- |
RX |
- |
2. 程式架構說明
程式碼請參閱Github( https://github.com/JiekangHuang/ESP32_AM7020_IAQ )。
程式會使用到以下三個Library,請先去Github下載後,放到Arduino Library資料夾底下。
-
TinyGsm(產生TCP封包)
-
PubSubClient(產生MQTT封包)
-
EspSoftwareSerial(在ESP32上實現Software UART)
在讀取ZH03B及MH-Z19B上都使用SW UART;而ESP32只有兩組HW UART,第一組用來Debug,第二組用來與AM7020溝通,故剩餘的感測器要使用UART就必須採用SW UART的方式與其通信。在ESP32上使用SW UART需安裝EspSoftwareSerial Lib。
整體通訊上我們使用MQTT與Adafruit IO溝通,而實際實作通訊架構上我們分為兩層,由上到下分別為MQTT、TCP,每層架構獨自完成各自工作後再將結過傳送至下層,最終由AM7020發送到Adafruit IO。
重點程式碼說明
檔名:ESP32_IAQ.ino
-
Line 23~28: 建立MQTT通訊架構(分層架構)
-
Line 48~50: 建立兩組Software UART
-
Line 64~65: 讀取Co2、PM2.5
-
Line 88、112: 上傳CO2、PM2.5資料到Adafruit IO
-
Line 90~99: 依照CO2濃度設定燈號(設定標準見下圖CO2指標)
-
Line 114~123: 依照PM2.5設定燈號(設定標準見下圖PM2.5指標)
-
Line 103、127: 上傳CO2濃度燈號、PM2.5燈號
-
Line 140: AM7020 NBIOT 連線至基地台
-
Line 159: MQTT Client 連線至Adafruit IO
檔名:config.h
-
Line 36: 設定資料上傳頻率為4分半鐘(可依需求自行更改)
-
Line 38~39: 設定Debug Serial、Baudrate
-
Line 42~44: 設定AM7020 Serial、Baudrate、EN PIN
-
Line 50~51: 設定NBIOT Apn、Band
-
Line 54~55: 設定MQTT Broker、MQTT Port
-
Line 57~58: 設定MQTT Username、Password(請務必修改為自己的Adafruit IO帳號及AIO Key)
-
Line 60~63: 設定CO2、PM2.5、PM2.5燈號、CO2燈號的MQTT Topic(請確定與Adafruit IO上設定相同)