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。
步驟
-
建立App Script及Google sheet
-
硬體配置
-
程式設計
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資料夾底下。
-
TinyGsm(產生TCP封包)
-
SSLClient(產生SSL封包)
-
HTTPSRedirect(產生HTTP封包)
-
EspSoftwareSerial(在ESP32上實現Software UART)
在讀取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真實性。