利用ESP32和实时仪表盘,开发一款易于复制的空气污染监测设备
该项目的主要想法是使用Wemos D1 mini测量学校外公交车排放的污染物。后来发展为一种经济实惠的解决方案,通过ESP32板将数据通过WiFi发送至InfluxDB数据库,且体积小巧,可随身携带。在与我校合作下,我们组建了一个团队,制作了五台传感器,并作为伊拉斯谟+项目的一部分前往比利时。
此外,在全球有57%人口居住于城市的情况下,我认为提高公众对空气污染的认知至关重要。如果能实时监测PM值,从而避免您和孩子暴露在不安全环境中,那会怎样呢?
1:案例开发
我们使用3D CAD软件设计了PCB外壳,特别注意SDS011传感器进风口和出风口的高度。该传感器采用5V风扇供电,因此我们利用出风口的空气来冷却右侧的电子元件。此外,我们在右侧设计了开口,以保持MCU和升压转换器的冷却。
2:原理图与PCB
我最初使用跳线来完成这个项目,但随着传感器数量的增加,为了确保系统的合理性,设计一个定制的PCB变得至关重要。从最后两张图片可以看出明显的差异。我选择了EasyEDA作为软件,并从原理图开始设计。
作为PM传感器,我选用了支持UART协议的Nova SDS011传感器,通过插孔将其连接到ESP32的TX2/RX2(由于尺寸原因,我使用了封装引脚而非直接连接)。唯一的困难是它需要5V电源,因此我们添加了一个升压转换器(XL6009)来将MCU的3.3V提升至所需电压。
我们选择DHT11传感器,因为对温度精度要求不高,且成本最低。最后,CO2传感器(MHZ19)连接到UART1。
原理图中还有一个名为“J2”的电池连接,用于为所有设备供电。需要注意的是,在正常情况下,还需要配备电池管理系统(如TP4056),但由于这是一个入门级项目,我们决定省略该功能,以便在测量过程中实时监控传感器数据。
因此,我开始进行PCB设计,力求减小所占空间。我们选择了一个矩形盒子,板子必须能完全容纳进去。此外,SDS011的进气口位于左侧,电池被放置在传感器上方,MCU和升压转换器则位于机箱左侧,因此留出了一些开口,现在我认为这些位置可以再稍作缩减。
3:组装与连接
PCB完成后,设备的组装是最简单的一环。我们只需将传感器连接到电子电路板上。首先,为了便于更换,我们焊接了一个ESP32的母头。接着,焊接了MHZ-19、DHT11以及升压转换器。然后,我们将SDS011的进气口对准机箱左侧的圆形孔,并根据原理图将其线缆连接至“J1”。最后,将电池连接至“J2”(注意极性),并用一块4毫米激光切割的木制盖子封好机箱。
4:代码编写
首先,我在Arduino IDE中安装了ESP32扩展插件。同时还需要一些库来读取传感器数据:
•SDS011主控库
•DHT传感器库
•MH-Z19主控库
点击每个文件后,再点击“下载ZIP”,然后在Arduino IDE中:选择Sketch/Include library/Add .zip file,并选择已下载的文件。
开发的代码包含一个设置部分,用于初始化传感器,在循环中获取数据并发送到InfluxDB数据库。
如果无法连接WiFi,MCU会将数据存储在SPIFFS中作为.txt文件。我们选择这种系统是因为在设计PCB时没有考虑备份方案。现在我认为最佳的解决方案是结合micro-SD卡和专用结构以实现冗余。文件内容是循环中首先显示的内容,如上图所示,这里我们直接在串口监视器中打印出来。你也可以重新发送数据,但使用TSDB时,图表中会同时显示两个不同的数据。也许更好的做法是使用另一个数据库。这是一个初始代码,你可以根据需要进行修改!
在此部分,我们从PM传感器获取新数据,接着从CO2传感器读取温度(该传感器还返回温度),最后从DHT11传感器获取数据。这个传感器曾出现过一些问题,但我们成功地通过MHZ19传感器获取了温度,因此仅丢失了湿度信息。如果读数出现问题,串口监视器中会显示错误提示。在后续项目中,我会向InfluxDB发送针对各种可能故障的代码,以便快速定位问题。
我们在这里将数据发送到数据库,操作非常简单,如您所见,只需为数据指定标签和值,然后数值就会被写入。
如果因WiFi或InfluxDB问题导致数据无法发送,软件会生成一个包含所有测量值的字符串,并将其保存到专用文件中。在设置部分,还实现了OTA系统,用于传感器和InfluxDB的初始化以及软件更新。
更多代码(包括用于测试传感器的示例程序)、更新后的代码以及PCB的Gerber文件,均可在项目仓库中获取。
5:InfluxDB 数据
最初我选择使用Google表格作为数据库,但随着数据量逐渐增加,我发现了InfluxDB。我和团队还集成了一个仪表板,以便轻松可视化所有数据。
如果您是新手,建议参考本完整的指南来创建账户并开始发送数据。目前存在一些变化,特别是内置的仪表板管理器已不再提供,取而代之的是可以使用Grafana,我推荐您参考此指南。
本文编译自hackster.io





