構(gòu)建一款基于 ESP32-C5 的空氣質(zhì)量監(jiān)測設(shè)備
1. 簡介
室內(nèi)空氣質(zhì)量(IAQ)常常被忽視,但它卻直接影響著認知功能和長期健康狀況。二氧化碳含量過高會導致困倦和注意力不集中,而甲醛(HCHO)——通常來自家具和建筑材料——是一種已知的刺激物。AtmosGuard C5 是一款基于 Seeed Studio XIAO ESP32-C5 構(gòu)建的高精度、聯(lián)網(wǎng)監(jiān)測設(shè)備。它利用雙頻 Wi-Fi 提供 OLED 顯示屏上的實時監(jiān)測,并通過無縫的 Captive Portal 設(shè)置將歷史數(shù)據(jù)記錄到 Google Sheets 中。
2. 特點/特征
?微環(huán)境感應(yīng)技術(shù):集成了非分散紅外線二氧化碳檢測與電化學甲醛檢測功能,從而實現(xiàn)全面的空氣安全監(jiān)測。
?雙頻連接:利用 ESP32-C5 芯片,在現(xiàn)代 5GHz 無線網(wǎng)絡(luò)環(huán)境下運行。
?captive portal 配置:不使用固定密碼;采用 WiFiManager 進行便攜式設(shè)置。
?云集成:實時數(shù)據(jù)記錄至 Google 表格,以便進行長期趨勢分析。
?智能狀態(tài):根據(jù)世界衛(wèi)生組織的指導方針,動態(tài) OLED 頭部顯示屏會自動更新(良好/一般/較差)。
3. 連接步驟
?安裝 XIAO:將 XIAO ESP32-C5 的引腳與 XIAO 擴展板上的母頭對齊,并用力按下。
?SCD30 連接:將一根格羅夫電纜的一端連接至 SCD30,另一端連接至擴展板上可用的任何 I2C 格羅夫接口。
?SFA3x 連接:將第二根格羅夫電纜連接到 SFA3x 以及其余的 I2C 格羅夫接口。
?顯示設(shè)置:請確保擴展板上標有“OLED”的小開關(guān)處于開啟狀態(tài)。
?電源:將 USB-C 數(shù)據(jù)線連接至 XIAO ESP32-C5。請注意,擴展板也可通過底部的 JST 連接器由 3.7V 鋰電池供電,以便于攜帶使用。
因為 SSD1306 OLED、SCD30 和 SFA3x 都通過 I2C 協(xié)議進行通信,所以它們共用兩條數(shù)據(jù)線(SDA 和 SCL)。而 ESP32-C5 則通過它們各自獨特的 I2C 地址來區(qū)分它們:
?OLED:0x3C
?SFA3x: 0x5D
?SCD30: 0x61
這種并行連接使得該系統(tǒng)能夠“可擴展”,而無需增加更多的引腳。
4. 代碼分解
該代碼的結(jié)構(gòu)設(shè)計旨在確保在新的小愛 ESP32-C5 RISC-V 內(nèi)核上運行的穩(wěn)定性:
?I2C 穩(wěn)定性:在經(jīng)過 2 秒的啟動延遲后以 100kHz 的頻率進行初始化,以防止總線出現(xiàn)卡頓現(xiàn)象。
?非阻塞邏輯:傳感器讀數(shù)與云端記錄間隔(60 秒)相分離,以保持顯示屏的響應(yīng)能力。
?持久數(shù)據(jù):全局變量會保存“最后已知的正?!弊x數(shù),以防止在傳感器預熱期間顯示屏出現(xiàn)驟降至零的情況。
?HTTPS 重定向:已特別設(shè)置為遵循谷歌服務(wù)器的重定向操作,以確保數(shù)據(jù)能夠正確傳輸至電子表格。
圖書館的包含內(nèi)容及定義
?傳感器:Adafruit_SCD30.h 和 SensirionI2cSfa3x.h 負責處理二氧化碳和甲醛傳感器的復雜 I2C 通信協(xié)議。
?顯示:使用 U8g2lib.h 是因為其支持“全緩沖”模式,能夠?qū)崿F(xiàn)更流暢的屏幕更新和自定義字體。
?網(wǎng)絡(luò):WiFiManager.h 是創(chuàng)建封閉式門戶的關(guān)鍵。它使您無需在腳本中硬編碼 Wi-Fi 密碼。
?云:HTTPClient.h 使 ESP32-C5 能夠像網(wǎng)絡(luò)瀏覽器一樣“獲取”谷歌腳本的 URL。請確保在 Arduino IDE 中安裝這些庫。
全局變量與實例
C++
我們?yōu)閭鞲衅鲃?chuàng)建“對象”并將其展示在此處,以便它們能夠在 setup() 函數(shù)和 loop() 函數(shù)中被訪問。我們還定義了 lastEntry 和 interval 來管理時間;這樣做可以確保我們不會向 Google Sheets 發(fā)送過多請求,以免導致暫時被封禁。
設(shè)置模塊(“早晨的例行程序”)
當設(shè)備開機時,此程序會運行一次。
?“Serial.begin(115200)”:啟動與您電腦的通信,以便進行調(diào)試。
?“Wire.begin() & Wire.setClock(100000):這是 ESP32-C5 中最為關(guān)鍵的部分。它用于初始化 I2C 總線。我們將速度設(shè)置為 100kHz(標準模式),以確保在多個傳感器共享同一根導線時的穩(wěn)定性?!?
?WiFiManager 類:它會檢查設(shè)備是否還記得某個 Wi-Fi 網(wǎng)絡(luò)。如果沒有記住,它就會啟動一個名為“AirMonitor-AP”的接入點(AP)。wm.setConfigPortalTimeout(120) 這個方法是一個安全功能;如果在 2 分鐘內(nèi)沒有人連接到該接入點,設(shè)備就會轉(zhuǎn)而進行本地監(jiān)控,以免永遠停留在這個狀態(tài)。
“循環(huán)塊(恒定循環(huán))”
這個循環(huán)會反復運行,并執(zhí)行三項主要任務(wù):
A. 讀取傳感器數(shù)據(jù)
C++
SCD30 每 2 秒才更新一次數(shù)據(jù)。這個 if 語句確保我們僅在傳感器獲取到新數(shù)據(jù)時才更新變量。這樣可以避免“零值讀數(shù)”的問題。
B. 確定空氣質(zhì)量狀況
我們采用一種簡單的“如果-否則”邏輯來對空氣進行分類。
?危急情況:若二氧化碳濃度大于 1500ppm 或甲醛濃度大于 100ppb 時。
?警報條件:若二氧化碳濃度大于 1000ppm 或甲醛濃度大于 60ppb 。
?好的:其他方面。這種邏輯會優(yōu)先考慮安全性;只要有一個傳感器檢測到空氣質(zhì)量不佳,整個狀態(tài)就會變?yōu)椤拜^差”。
C. 更新 OLED 技術(shù)
u8g2.clearBuffer() 函數(shù)會清空 ESP32 內(nèi)存中的“虛擬”屏幕。接下來我們繪制文本和線條,最后調(diào)用 u8g2.sendBuffer() 函數(shù)一次性將整個圖像傳輸?shù)轿锢砥聊簧稀_@樣可以避免在較簡單的庫中出現(xiàn)的“閃爍”現(xiàn)象。
云日志功能(發(fā)送至工作表)
C++
這就是谷歌表格的“秘訣所在”。當小 ESP32C5 跳轉(zhuǎn)到谷歌腳本的網(wǎng)址時,谷歌會以 302 重定向的方式做出響應(yīng)。如果沒有這一特定的代碼行,小 ESP32C5 將會在重定向處停止,數(shù)據(jù)也就無法真正傳送到您的電子表格中。此功能會將您的 CO2、HCHO、溫度和濕度值打包成一個單一的網(wǎng)址字符串,并“訪問”該鏈接以記錄數(shù)據(jù)。
設(shè)置谷歌表格橋接器
為了記錄數(shù)據(jù),我們使用了一個簡單的谷歌應(yīng)用程序腳本。
創(chuàng)建一個新的谷歌表格。
前往“擴展” > “應(yīng)用程序腳本”菜單,然后將以下代碼粘貼進去:JavaScript
點擊“部署” > “新建部署”。選擇“Web 應(yīng)用程序”,將訪問權(quán)限設(shè)置為“任何人”,然后復制 Web 應(yīng)用程序的 URL。您需要將此 URL 粘貼到 Arduino 代碼中。
那么,你應(yīng)該得到如下這樣的結(jié)果:
故障排除指南
即便有可用的代碼,硬件也可能存在一些問題。本節(jié)將介紹用戶在構(gòu)建這款空氣質(zhì)量監(jiān)測器時可能會遇到的一些常見難題。
1. I2C 總線沖突與接線問題
由于 SCD30 和 SFA3x 都連接在同一 I2C 總線上,所以它們必須具有不同的地址。幸運的是,它們確實如此(SCD30 的地址是 0x61,SFA3x 的地址是 0x5D)。
“故障”提示信息:如果在串行監(jiān)視器中看不到“SCD30 故障”或“SFA3x 在線”字樣,請檢查您的格羅夫連接線。確保它們已牢固插入。
電壓下降:長電線可能會導致信號質(zhì)量下降。如果您的傳感器距離 XIAO 超過 20 厘米,您可能需要將 I2C 速度進一步降低至 50000,或者在 SDA 和 SCL 上添加 4.7kΩ 的上拉電阻。
2. “302 已找到”谷歌表格錯誤
如果您的串行監(jiān)視器顯示“數(shù)據(jù)已發(fā)送”,但您的表格中卻沒有任何內(nèi)容顯示出來,那么問題幾乎總是出在谷歌部署環(huán)節(jié)上。
解決方法:您不能簡單地“保存”腳本。您必須前往“部署” > “管理部署”,編輯當前的部署項,并選擇“新版本”。每次更改腳本代碼時,都必須部署一個新的版本,否則該網(wǎng)址實際上會指向無效的代碼。
權(quán)限設(shè)置:請確?!罢l有權(quán)訪問”選項設(shè)置為“任何人”——如果設(shè)置為“僅本人”,那么 ESP32(它并未登錄您的谷歌賬戶)將無法訪問。
3. ESP32-C5 電源穩(wěn)定性
SCD30 采用了一種會閃爍的物理紅外燈。這種閃爍會產(chǎn)生一個微小的“電壓下降”峰值。
癥狀:該設(shè)備會每 60 秒自動重啟一次(就在 WiFi 開啟并開始傳輸數(shù)據(jù)的時候)。
解決方法:在擴展板的 5V 和 GND 引腳之間添加一個 100μF 至 1000μF 的電容器,作為電源緩沖器,或者使用質(zhì)量更好的 USB 數(shù)據(jù)線。
4. Sensirion SFA3x "Initial Burn-in"
如果在最初的 10 分鐘內(nèi)你的甲醛濃度讀數(shù)波動很大,也不必擔心。
原因:SFA3x 電化學電池需要達到化學平衡狀態(tài)。為了獲得最準確的數(shù)據(jù),請在拍攝“最終”數(shù)據(jù)截圖之前,讓設(shè)備運行至少 60 分鐘。
本文編譯自hackster.io





