冬天一到,天空又是灰濛濛的,一直以來不良的冬季空氣品質練就了高雄人的鐵肺(一股淡淡的哀傷),再加上前陣子歸仁大火延燒,高雄空品甚至達紫爆等級;面對這些肉眼難以辨識的懸浮粒子,我們來實作小型空氣品質監測裝置,追蹤空氣品質的變化,就能知道空氣清淨機有沒有好好工作了(是這樣嗎)。

本次要監測的空氣品質包含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資料夾底下。

 

在讀取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上設定相同)

 

成品

完成以上步驟後,就可從Adafruit IO名稱為IAQ的Dashboard上查看CO2濃度及PM2.5數值折線圖,並且可透過右邊燈號顯示,直覺地了解當下空氣品質狀況,裝置每四分半鐘上傳一次數據。

一到下班時間、車流量增多,緊鄰交通要道的辦公室就能明顯偵測出PM2.5的增加,燈號也由中午的綠燈轉為黃色警示燈(連9樓的樓層高度都難以倖免地被影響,何況是走在人行道上的我們!)。雖然疫情使我們養成隨時配戴口罩的良好習慣,但在趨緩後也別忘了透過監測警示燈,提醒自己戴上口罩護肺吧!

 

小結

3小時即可輕鬆完成空品偵測器,隨時隨地透過雲端平台搭配指示燈號查看空氣品質,大家也可以自行參考政府提供的空氣品質濃度設定,在參數設定上調整成較嚴苛或較寬鬆的燈號判斷依據。

除了主動查看數據外,甚至可以連動進階事件:例如透過Line主動對使用者發送通知、連動門窗或空氣清淨機等達成自動開關效果,未來有機會再為大家介紹設定方法。

空品偵測器除了本篇文中將資料上傳至Adafruit IO平台外,大家也可以參考另篇Google試算表也能當資料庫?Arduino × App Script實作:空品偵測器!,透過Google App Script將資料儲存至Google試算表。在功能上雖大同小異,不過各有優缺點:Adafruit IO平台最大優勢便是良好的使用者體驗,我們能直覺式的依靠美觀燈號判斷當前空氣品質,惟資料保存上有一個月的時間限制,對於部分需長期保存資料的人相對來說較為不便;而Google試算表存成excel格式,除了應用上較為廣泛(如可使用加總、平均、算標準差等功能)外,更能存放大量資料,二維的資料欄位有助於存放複雜資料,一行就可存放多種感測器數值,在後續抓取資料分析時會更加容易且不易混淆。大家可依照需求參考對應的文章教學,實作自己的空品感測器。

若是覺得文章實用而清晰,記得分享給朋友一起動手做,大家的支持就是更新的動力,更多實作文章可參閱等等會下雨嗎?用ESP32自製NBIoT氣象預報站教學!叮!有人入侵了?3步驟遠端收到LINE警訊通知!