App Script是由Google開發的一個腳本平台,它能夠輕易的將 Google 的各項服務(Gmail、Maps、Drive、Calendar、Forms、Doc、Sheet)搭配應用,並且在一定額度內免費使用;也可以說它是一個serverless(無伺服器)程式,可以將建置的程式碼發布至網路上,供來自各地用戶端使用。

本次將結合App Script、ESP32及AM7020,實作一個空品偵測器,透過環境感測器讀取PM2.5、CO2資料並上傳至雲端試算表,最後以簡易折線圖表示資料變化。

空品偵測器在先前的文章一口深呼吸有多少PM2.5?打造居家空品偵測器!也有實作過,所需材料都是一樣的,惟當時是透過AM7020將資料上傳至Adafruit IO平台。功能上各有優缺點,文末有較詳細的解析說明;不過大致可依照使用者需求,自行評估選用的平台及方式: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使用HTTPS Protocol將pm2.5及co2感測資料透過API傳送至Google APP Script,經由預先建置好的APP Script腳本程式解析後再寫入Google sheet。

 

步驟

  1. 建立App Script及Google sheet

  2. 硬體配置

  3. 程式設計

 

1.建立App Script及Google sheet

進到Google雲端硬碟,點選新增 > 更多 > Google Apps Script

將程式區塊內容改為與這裡相同的程式碼,點選頁面右上方部署 > 新增部屬作業

類型選擇為「網頁應用程式」,點選「部屬」後會要求授予存取權限,改為所有人。完成後即可得到「部屬作業ID」,將此ID紀錄下來,後面程式將會使用。

接下來要新增一個Google Sheet(試算表)。進到Google雲端硬碟,點選新增 > Google 試算表;試算表名稱可自訂,唯獨下方紅框處表名稱須改為「IAQ」,與App Script程式碼相呼應。

試算表ID可從網頁上方網址列中取得,以我的試算表網址為例,紅字即試算表ID。將試算表ID紀錄下來,後面程式將會用到。

https://docs.google.com/spreadsheets/d/1ASNcnZIRFZm_xE5ceZ6XymQdJXQLCqvr2e9Dn7XEgQw/edit#gid=0

 

2.硬體配置

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

-

 

3.程式架構說明

程式碼請參閱Github( https://github.com/JiekangHuang/esp32_am7020_app_script )。

程式會使用到以下四個Library,請至Github下載後放到Arduino Library資料夾底下。

 

在讀取ZH03B及MH-Z19B上都使用SW UART;而ESP32只有兩組HW UART,第一組用來Debug,第二組用來與AM7020溝通,故剩餘的感測器要使用UART就必須採用SW UART的方式與其通信。在ESP32上使用SW UART需安裝EspSoftwareSerial Lib。

整體通訊上我們使用HTTPS與App Script溝通,而實際實作通訊架構上我們分為三層,由上到下分別為HTTP、SSL及TCP,每層架構獨自完成各自工作後再將結過傳送至下層,最終由AM7020發送到App Script。

這次使用Google App Script時發現使用HTTPS呼叫API後,雖然資料能夠順利上傳,但回傳結果卻是錯誤(Moved Temporarily):HTTPS錯誤代碼(state code)為302,意旨「網站位置暫時移動,要求重新導向到新網址」。依照官方文件表示,「出於安全原因,內容服務返回的內容不是從script.google.com提供的,而是重定向到script.googleusercontent.com上的一次性URL。這意味著,如果您使用內容服務將數據返回到另一個應用程序,則必須確保將HTTP客戶端配置為遵循重定向」。因此必須使用有支援重新導向的HTTP Library,這裡選用HTTPSRedirect,它能解決一般HTTP請求以及錯誤代碼為301、302的問題。

 

重點程式碼說明

檔名:esp32_am7020_app_script.ino

  • Line 31~35: 建立HTTPS通訊架構(分層架構)

  • Line 49: AM7020 NBIOT 連線至基地台

  • Line 51~53: 建立兩組Software UART

  • Line 66~67: 讀取Co2、5資料

  • Line 84: 建立HTTPS連線

  • Line 85: 呼叫API並帶入CO2、5參數上傳至Google Sheet

  • Line 86~87: 取得HTTPS狀態碼、回應內容

  • Line 94: 斷開HTTPS連接

檔名:config.h

  • Line 27: 設定資料上傳頻率為每15分鐘一次(可自行依需求更改)

  • Line 29~30: 設定Debug Serial、Baudrate

  • Line 33~35: 設定AM7020 Serial、Baudrate、EN PIN

  • Line 38~39: 設定NBIOT Apn、Band

  • Line 42~43: 設定HTTPS Port、HTTPS host

  • Line 44~45: 設定App Script Id、Google Sheet Id,請務必修改為自己的專屬ID

檔名:AllTrustAnchors.h

  • 該檔案為google.com的Server CA(由此頁面產生),用以驗證Server真實性。

 

成品

完成以上步驟將可從Google Sheet上查看Co2濃度及PM2.5數值的資料及折線圖,每筆資料會有對應背景顏色,用以快速判斷當前數值是否超出標準(顏色標準見下表),裝置每15分鐘上傳一次數據。

 

小結

經過以上步驟即可將感測資料傳至Google試算表儲存;使用Google試算表作為資料庫,優勢在於更容易做後續資料分析:例如結合試算表強大的計算、圖表功能,快速統計並分析資料。若要自動取得試算表資料也可透過App Script輕鬆讀取,相容性非常高!

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

希望這篇教學能對大家有所幫助,喜歡記得分享給朋友,網站內還有更多實作文章,我們下篇見!