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





