Winsen ZE25-O3臭氧传感器监测二氧化氮浓度小实验

臭氧一般存在于大气中较高的位置,但遗憾的是,由于各种各样的人为活动,即使在地面上,我们也会时不时地吸入大量的臭氧。 如果您对臭氧感兴趣的话,可以先参阅我们之前发文里写的有关臭氧二三事,否则,就让我们一起从技术层面来试试臭氧浓度监测的小实验……好吧,最后还是变成了二氧化氮浓度的监测。

还不想读完全文?那就直接戳编码部分吧!

关于实验中的传感器

第一步是要对传感器有所了解。 Winsen ZE25-O3是一款相当便宜的传感器(全球速卖通上一般以33美元或28欧元出售)。它是一种电化学传感器,这意味着它会与所要监测的目标气体反应,在我们的实验里所要监测的目标气体便是臭氧,反应会产生与气体浓度相关的电流从而显示出监测数据。

传感器会对二氧化氮有交叉反应,也就是说如果空气中有二氧化氮,那么传感器也会对其作出反应。实验传感器的出厂分辨率为0.01ppm(10ppb)。监测范围是0到10ppm。 它具有模拟输出和数字输出(UART)。关于电化学传感器的简介可以在电化学(EC)气体传感器简介中找到,虽然简介的内容与我们实验中的传感器并无关联,但可以给读者一个基本的了解。

从指南手册上看这个传感器,的确不错,但实际性能又怎么样呢?在我们首个传感器实验里,没有实验室,预算又非常有限;这一定程度上限制了我们对该传感器的深入了解,但这也使整个实验过程变得更加有趣,因为我们不得不更有创新力点,去学习了解一切。

数据收集并与距离最近的城市空气质量监测站的数据相比对

因为没有可以放置在我们实验传感器旁边供于参考校准的传感器,于是便用我们所在的柏林市各处空气质量监测站的数据作为参考校准。当实验传感器显示监测值时,根据各站点与室内实验传感器间的距离,我们采用了不同站点的数据,再通过比对各站点数据与我们实验监测值来评估哪一个站点的数据是“最佳”参考值。

正如我们所知,这个传感器会有交叉反应,尤其我们的传感器确实会对二氧化氮有交叉反应,因此我们本次实验中不仅观察传感器数据与臭氧浓度的相关性,还要观察与二氧化氮浓度的相关性。

设置

我们按照传感器的指南手册进行正确的组装。不幸的是,材料包里所提供的电缆并不是连接我们Arduino的理想选择,因此我们不得不剪断连接器,并将单独的电缆直接连接到Arduino。如此连接后显然正常运行了。对于数字输出(UART),有一个校验和,我们也计算出该校验和,两者相匹配,这表明连接正常。

图1.显示了实验传感器与Arduino Uno相连接,后者又连接到笔记本电脑的USB端口。

我们将5V和GND一并连接到Arduino上相应的管脚。传感器TX则连接到Arduino上的数字端口2号处。 传感器的模拟输出口连接到模拟输入口0号处。以上是硬件方面的所有配置要求,现在让我们继续进行软件方面的配置。

编码

完成所有连接后,该是看代码1和0工作的时候了,好吧,也许只有源代码才能使这些1和0生效。用Arduino进行数据收集的主要编码程序是:

int ppb = sensor.readPPB();
int analogVal = analogRead(A0);

if (ppb > 0) {
 Serial.print(ppb);
 Serial.print(",");
 Serial.println(analogVal);
 delay(1000);
}

请前往Github参见完整的编码程序。.

归功于pandas和其他一些Python库的简单明了性,还有一部分用于分析数据的主要编码程序如下:

hourlyData = ozoneData
 .groupby(ozoneData.index // 3600)
 .mean()

sensorAndBerlinData = pd.concat(
 [hourlyData, berlinData],
 axis=1
)

model = LinearRegression().fit(
 sensorAndBerlinData[['analogVal']],
 sensorAndBerlinData['no2']
)

# ...print out model coefficients...
# correlations calculated using scipy as:
scipy.stats.pearsonr(
 sensorAndBerlinData['analogVal'],
 sensorAndBerlinData['no2']
)
scipy.stats.spearmanr(
 sensorAndBerlinData['analogVal'],
 sensorAndBerlinData['no2']
)
scipy.stats.kendalltau(
 sensorAndBerlinData['analogVal'],
 sensorAndBerlinData['no2']
)

# Show fancy plot with regression line
sn.lmplot(
 x='analogVal',
 y='no2',
 data=sensorAndBerlinData,
 fit_reg=True
)

请前往Github参见完整的编码程序。.

编码程序完成后,我们只需要收集一些数据即可。理想情况下,我们应该在稳定的条件下执行数据收集,但是这点对我们来说有些棘手,所以我们只好将有编码程序的计算机和数据收集的Arduino放在厨房桌子的一个角落里,监测并收集数据两天左右,当然也希望我们的孩子不会去摆弄我们的实验装置。当我们只需要将数据从传感器转存到串行端口时,我们可以使用以下命令(在Arch Linux上)读取和存储:

cat /dev/ttyACM0 >
 home_ppb_analog_2021-01-25T07:00:00Z

要停止读取数据时,可以在终端中按ctrl + c。一旦收集到一些数据(当然越多越好),我们可以通过以下命令运行Python分析代码:

source ./env/bin/activate
cd src
python main

我们必须从正确的文件夹运行编码程序,因为我们对数据路径直接进行了编程。如果您对编码source ./env/bin/activate感兴趣,请参阅虚拟环境和软件包 ,这只是独立运行Python代码的一种便捷方法。

结果

运行我们的Python分析代码后可以得到以下图片:

图2.显示了室外二氧化氮浓度和传感器输出电压(analogVal)的对应值,以及回归线和95%置信区间。

其中上图模型(回归线)通过以下方程式得出:

f(x) = 7.52x - 636.96

它的R2值是0.36。

我们得到“analogVal”(来自传感器输出电压的数值)与城市空气质量监测站(MC174)报告的二氧化氮浓度之间的关联如下:

Pearson: 0.60, p-value=0.0002
Spearman: 0.57, p-value=0.0005
Kendall's Tau: 0.37, p-value=0.003

当然,我们尝试了许多不同的方式研究所得数据。既然数据和编码程序都存储在Github中,如果您对这些数据也感兴趣,不如您也自己动手来试试吧。

也许您已经注意到,我们使用的是模拟输出电压值,而非传感器计算出的以PPB为单位(我们也存储了)的臭氧浓度,这是因为在analogVal与城市数据相比对时,analogVal显示出了更强的相关性。 虽然我们需要的Arduino编码程序可能只有几行,但是我们也附上了传感器数字输出端口UART处读取PPB值的编码程序,便于感兴趣的朋友也想小试牛刀。

运用结果来估算室内二氧化氮浓度

到目前为止,我们已试着根据室内的监测结果来估算室外的二氧化氮浓度。利用室外二氧化氮浓度会影响室内二氧化氮浓度 [1] [2] [3]这一推论来估算在给定的室内二氧化氮浓度值下的室外二氧化氮浓度。相反,我们也可以在给定的室外二氧化氮浓度值下来估算室内二氧化氮浓度。

在参考文献[1]中发现室内二氧化氮浓度和室外二氧化氮浓度比率为0.73,在参考文献[2] 中发现室内二氧化氮浓度和室外二氧化氮浓度比率有所不同,但大致范围在0.88到1这区间内。运用这些文献依据,我们可以根据给定的柏林室外二氧化氮浓度监测值来估算室内二氧化氮浓度。然而,我们经常在室内使用空气净化器做各类监测实验,因此根据上述文献依据推算出的室内二氧化氮浓度结果于我们并无所用,如果我们的确在空气净化实验中减少了室内二氧化氮浓度,那么我们实际的室内二氧化氮浓度势必会低于上述推算值。

因此,出于未能可能的用途,或者可能主要是出于兴趣(因为analogVal足以满足我们的实验需求),我们更新了能计算出室内二氧化氮预估值的编码程序。我们运用拟合模型并乘以0.73来估算室内二氧化氮浓度。然后再除以1.88,便可获得PPB(我们参考用的柏林数据以μg/m3为单位)的结果:

double estimateIndoorNO2PPB(int analogVal) {
  return ((7.51826819982211 * analogVal
         - 636.9571501802109) * 0.73)
         / 1.88;
}

请前往Github参见完整的编码程序

幸运的是,我们之前所购买的一台空气质量监测仪是可以用来监测二氧化氮浓度的。 假设与室外二氧化氮浓度具有强烈的相关性,那么如果监测结果显示的相关性越高说明监测的传感器性能越好,我们就可以在我们的自制设备和这台商用空气质量监测仪之间建立一个评估指标。虽然整体并不完美,但是也非完全虚构的,因为我们的实验数据以及其他参考文献中的研究都检测到室内和室外二氧化氮浓度之间的相关性。另外,我们家中也没有任何已知的二氧化氮和臭氧的污染源,那意味着这两种污染物可能都是来自室外空气。

图3. 显示了Uhoo空气质量监测仪测得的二氧化氮浓度与室外二氧化氮浓度的对应值。注意,因为计量单位有所不同,所以不能直接进行统一对比。

图3显示室内和室外二氧化氮浓度之间的关联性非常小。当然,图3显示的相关性没有图2那么明显。当将回归线拟合到数据时,我们得到的R2值为0.06。与我们使用Winsen ZE25-O3传感器的0.36相对比后,可见Winsen ZE25-O3传感器性能更好些。我们得到室内和室外二氧化氮浓度之间的相关性如下:

Pearson: -0.24, p-value=0.178
Spearman: -0.48, p-value=0.005
Kendall's Tau: -0.34, p-value=0.008

与Winsen ZE25-O3的结果相比如下:

Pearson: 0.60, p-value=0.0002
Spearman: 0.57, p-value=0.0005
Kendall's Tau: 0.37, p-value=0.003

请前往Github参见测试Uhoo的编码程序

可见,与商用空气质量监测器结果相比,我们自制的传感器测出的室内外二氧化氮浓度关联性更强。然而,这并不能证明我们自制的传感器性能更好,但也是一个很好的暗示,也许事实就是如此。令人唏嘘的是,我们花了312.55欧元(约379美金)购得Uhoo,而购买的主要原因之一便是它可以监测二氧化氮浓度。

值得一提的是,即使在图表中能观察到它们存储了数据,Uhoo应用程序却不提供带有小数点的数据。据我们所知,也无法导出数据,因此我们便从图表中复制了数据(单击图表中的数据点时便得到Uhoo应用提供的数值)。当然,我们的设备可能有故障,或者其他部件已经有磨损的可能。虽然这些可能性并不能使我们感觉好一些,但值得记住的是,我们的测试远非完美。

结论

我们最初希望监测臭氧浓度,并计划以最近的城市空气质量监测站的数据作为我们的校准参考。然而,我们却观察到实验传感器电压与二氧化氮浓度之间存在强烈的关联。 我们实验传感器(Winsen ZE25-O3)的指南手册也确实指出了其对二氧化氮浓度具有交叉反应,因而我们最终选择监测二氧化氮的浓度。 我们得到的推论是,二氧化氮之所以在这次实验中占主导地位的原因也许是因为柏林的冬天没有太多的阳光。

我们拟合了实验传感器的电压值和柏林城市空气质量监测站给出的二氧化氮浓度值得到一个线性模型方程式,并运用此模型方程式通过给定的室内二氧化氮浓度值来估算室外二氧化氮浓度。然后,再乘以一个我们通过文献研究发现的室内/室外二氧化氮浓度比率值,即0.73,来调整估算值,从而得到室内二氧化氮浓度的最终估算值。

我们对这个结果感到非常满意。就从我们的实验传感器和室外二氧化氮浓度的关联性来看,我们的自制设备更优越于商用空气质量监测仪的性能,这表明我们的自制设备可以更精确地监测二氧化氮浓度。当然,我们也认为在整个实验过程中所获悉的一些相对简单的信息点,之后可以尝试用来进一步改善实验成果。

其实,我们对未来的实验更有所期待。通过这次的实验,我们看到了很多潜力,比如运用机器学习或人工神经网络(有时称为深度学习)进行更好的校准(例如将风、温度和湿度也作为考量之一),也可以继续运用传感器来监测(比如在传感器需要重新校准或更换时发出信号)或者只是提高精确度。

如果时间允许的话,我们也很热衷运用臭氧传感器来监测臭氧浓度,利用我们在这次实验中所学到的知识,通过创建“软件过滤器”来处理传感器与二氧化氮的交叉反应性,从而获得更高的精确度。

参考文献

[1] S. Hwang and W. Park, “Indoor air concentrations of carbon dioxide (co2), nitrogen dioxide (no2), and ozone (o3) in multiple healthcare facilities,” Environmental Geochemistry and Health, vol. 42, May 2020, doi: 10.1007/s10653-019-00441-0.

[2] P. Blondeau, V. Iordache, O. Poupard, D. Genin, and F. Allard, “Relationship between outdoor and indoor air quality in eight french schools,” Indoor air, vol. 15, pp. 2–12, Mar. 2005, doi: 10.1111/j.1600-0668.2004.00263.x.

[3] A. Hagenbjörk-Gustafsson, B. Forsberg, G. Hestvik, D. Karlsson, S. Wahlberg, and T. Sandström, “Measurements of indoor and outdoor nitrogen dioxide concentrations using a diffusive sampler,” The Analyst, vol. 121, no. 9, pp. 1261–1264, 1996, doi: 10.1039/an9962101261.