构建一款基于 ESP32-C5 的空气质量监测设备
扫描二维码
随时随地手机看文章
1. 简介
室内空气质量(IAQ)常常被忽视,但它却直接影响着认知功能和长期健康状况。二氧化碳含量过高会导致困倦和注意力不集中,而甲醛(HCHO)——通常来自家具和建筑材料——是一种已知的刺激物。AtmosGuard C5 是一款基于 Seeed Studio XIAO ESP32-C5 构建的高精度、联网监测设备。它利用双频 Wi-Fi 提供 OLED 显示屏上的实时监测,并通过无缝的 Captive Portal 设置将历史数据记录到 Google Sheets 中。
2. 特点/特征
•微环境感应技术:集成了非分散红外线二氧化碳检测与电化学甲醛检测功能,从而实现全面的空气安全监测。
•双频连接:利用 ESP32-C5 芯片,在现代 5GHz 无线网络环境下运行。
•captive portal 配置:不使用固定密码;采用 WiFiManager 进行便携式设置。
•云集成:实时数据记录至 Google 表格,以便进行长期趋势分析。
•智能状态:根据世界卫生组织的指导方针,动态 OLED 头部显示屏会自动更新(良好/一般/较差)。
3. 连接步骤
•安装 XIAO:将 XIAO ESP32-C5 的引脚与 XIAO 扩展板上的母头对齐,并用力按下。
•SCD30 连接:将一根格罗夫电缆的一端连接至 SCD30,另一端连接至扩展板上可用的任何 I2C 格罗夫接口。
•SFA3x 连接:将第二根格罗夫电缆连接到 SFA3x 以及其余的 I2C 格罗夫接口。
•显示设置:请确保扩展板上标有“OLED”的小开关处于开启状态。
•电源:将 USB-C 数据线连接至 XIAO ESP32-C5。请注意,扩展板也可通过底部的 JST 连接器由 3.7V 锂电池供电,以便于携带使用。
因为 SSD1306 OLED、SCD30 和 SFA3x 都通过 I2C 协议进行通信,所以它们共用两条数据线(SDA 和 SCL)。而 ESP32-C5 则通过它们各自独特的 I2C 地址来区分它们:
•OLED:0x3C
•SFA3x: 0x5D
•SCD30: 0x61
这种并行连接使得该系统能够“可扩展”,而无需增加更多的引脚。
4. 代码分解
该代码的结构设计旨在确保在新的小爱 ESP32-C5 RISC-V 内核上运行的稳定性:
•I2C 稳定性:在经过 2 秒的启动延迟后以 100kHz 的频率进行初始化,以防止总线出现卡顿现象。
•非阻塞逻辑:传感器读数与云端记录间隔(60 秒)相分离,以保持显示屏的响应能力。
•持久数据:全局变量会保存“最后已知的正常”读数,以防止在传感器预热期间显示屏出现骤降至零的情况。
•HTTPS 重定向:已特别设置为遵循谷歌服务器的重定向操作,以确保数据能够正确传输至电子表格。
图书馆的包含内容及定义
•传感器:Adafruit_SCD30.h 和 SensirionI2cSfa3x.h 负责处理二氧化碳和甲醛传感器的复杂 I2C 通信协议。
•显示:使用 U8g2lib.h 是因为其支持“全缓冲”模式,能够实现更流畅的屏幕更新和自定义字体。
•网络:WiFiManager.h 是创建封闭式门户的关键。它使您无需在脚本中硬编码 Wi-Fi 密码。
•云:HTTPClient.h 使 ESP32-C5 能够像网络浏览器一样“获取”谷歌脚本的 URL。请确保在 Arduino IDE 中安装这些库。
全局变量与实例
C++
我们为传感器创建“对象”并将其展示在此处,以便它们能够在 setup() 函数和 loop() 函数中被访问。我们还定义了 lastEntry 和 interval 来管理时间;这样做可以确保我们不会向 Google Sheets 发送过多请求,以免导致暂时被封禁。
设置模块(“早晨的例行程序”)
当设备开机时,此程序会运行一次。
•“Serial.begin(115200)”:启动与您电脑的通信,以便进行调试。
•“Wire.begin() & Wire.setClock(100000):这是 ESP32-C5 中最为关键的部分。它用于初始化 I2C 总线。我们将速度设置为 100kHz(标准模式),以确保在多个传感器共享同一根导线时的稳定性。”
•WiFiManager 类:它会检查设备是否还记得某个 Wi-Fi 网络。如果没有记住,它就会启动一个名为“AirMonitor-AP”的接入点(AP)。wm.setConfigPortalTimeout(120) 这个方法是一个安全功能;如果在 2 分钟内没有人连接到该接入点,设备就会转而进行本地监控,以免永远停留在这个状态。
“循环块(恒定循环)”
这个循环会反复运行,并执行三项主要任务:
A. 读取传感器数据
C++
SCD30 每 2 秒才更新一次数据。这个 if 语句确保我们仅在传感器获取到新数据时才更新变量。这样可以避免“零值读数”的问题。
B. 确定空气质量状况
我们采用一种简单的“如果-否则”逻辑来对空气进行分类。
•危急情况:若二氧化碳浓度大于 1500ppm 或甲醛浓度大于 100ppb 时。
•警报条件:若二氧化碳浓度大于 1000ppm 或甲醛浓度大于 60ppb 。
•好的:其他方面。这种逻辑会优先考虑安全性;只要有一个传感器检测到空气质量不佳,整个状态就会变为“较差”。
C. 更新 OLED 技术
u8g2.clearBuffer() 函数会清空 ESP32 内存中的“虚拟”屏幕。接下来我们绘制文本和线条,最后调用 u8g2.sendBuffer() 函数一次性将整个图像传输到物理屏幕上。这样可以避免在较简单的库中出现的“闪烁”现象。
云日志功能(发送至工作表)
C++
这就是谷歌表格的“秘诀所在”。当小 ESP32C5 跳转到谷歌脚本的网址时,谷歌会以 302 重定向的方式做出响应。如果没有这一特定的代码行,小 ESP32C5 将会在重定向处停止,数据也就无法真正传送到您的电子表格中。此功能会将您的 CO2、HCHO、温度和湿度值打包成一个单一的网址字符串,并“访问”该链接以记录数据。
设置谷歌表格桥接器
为了记录数据,我们使用了一个简单的谷歌应用程序脚本。
创建一个新的谷歌表格。
前往“扩展” > “应用程序脚本”菜单,然后将以下代码粘贴进去:JavaScript
点击“部署” > “新建部署”。选择“Web 应用程序”,将访问权限设置为“任何人”,然后复制 Web 应用程序的 URL。您需要将此 URL 粘贴到 Arduino 代码中。
那么,你应该得到如下这样的结果:
故障排除指南
即便有可用的代码,硬件也可能存在一些问题。本节将介绍用户在构建这款空气质量监测器时可能会遇到的一些常见难题。
1. I2C 总线冲突与接线问题
由于 SCD30 和 SFA3x 都连接在同一 I2C 总线上,所以它们必须具有不同的地址。幸运的是,它们确实如此(SCD30 的地址是 0x61,SFA3x 的地址是 0x5D)。
“故障”提示信息:如果在串行监视器中看不到“SCD30 故障”或“SFA3x 在线”字样,请检查您的格罗夫连接线。确保它们已牢固插入。
电压下降:长电线可能会导致信号质量下降。如果您的传感器距离 XIAO 超过 20 厘米,您可能需要将 I2C 速度进一步降低至 50000,或者在 SDA 和 SCL 上添加 4.7kΩ 的上拉电阻。
2. “302 已找到”谷歌表格错误
如果您的串行监视器显示“数据已发送”,但您的表格中却没有任何内容显示出来,那么问题几乎总是出在谷歌部署环节上。
解决方法:您不能简单地“保存”脚本。您必须前往“部署” > “管理部署”,编辑当前的部署项,并选择“新版本”。每次更改脚本代码时,都必须部署一个新的版本,否则该网址实际上会指向无效的代码。
权限设置:请确保“谁有权访问”选项设置为“任何人”——如果设置为“仅本人”,那么 ESP32(它并未登录您的谷歌账户)将无法访问。
3. ESP32-C5 电源稳定性
SCD30 采用了一种会闪烁的物理红外灯。这种闪烁会产生一个微小的“电压下降”峰值。
症状:该设备会每 60 秒自动重启一次(就在 WiFi 开启并开始传输数据的时候)。
解决方法:在扩展板的 5V 和 GND 引脚之间添加一个 100µF 至 1000µF 的电容器,作为电源缓冲器,或者使用质量更好的 USB 数据线。
4. Sensirion SFA3x "Initial Burn-in"
如果在最初的 10 分钟内你的甲醛浓度读数波动很大,也不必担心。
原因:SFA3x 电化学电池需要达到化学平衡状态。为了获得最准确的数据,请在拍摄“最终”数据截图之前,让设备运行至少 60 分钟。
本文编译自hackster.io





