1、什么是空气质量传感器?
空气质量传感器是一种检测空气中污染物浓度的设备,广泛应用于环境监测、智能家居、工业控制和健康管理等领域。
2、空气质量传感器是如何工作的?
对于每个人都关心的空气质量,主要有两大类标的物需要检测:一个是空气中的颗粒物浓度,也就是我们熟悉的PM10或者PM2.5。天气预报里面的AQI空气质量指数,就使用了pm2.5的浓度作为其中一个评估参数。
还有一类就是VOC挥发性有机化合物。VOC通常来自新产品和建筑材料,例如地毯、家具、油漆和溶剂。大家通常闻到的室内的所谓装修味,就大多是来自VOC;我们比较熟悉的室内装修的污染物甲醛,就可以归为VOC的一种。空气质量传感器通常测试的指标叫做总挥发性有机化合物TVOC。
对于空气中的颗粒物的检测主要利用激光散射原理和光学检测技术。通过稳定的气体对流系统,使外界空气均匀的通过测量腔。激光照射在测量腔中的悬浮颗粒物上产生散射,同时在某一特定角度收集散射光,得到散射光强随时间变化的曲线, 可以精确的获得粒子的尺寸、速度和质量等信息。加以统计学原理,继而计算出总的粒子质量,从而实时的得到空气中PM2.5以及PM10等直径的颗粒物的含量浓度。
对于需要检测的有害气体成分VOC,多采用电化学方式来检测。它是使用MOx金属氧化物材料,对于VOC, 甲醛, 二氧化氮等气体非常敏感。其检测原理是将⾦属氧化物加热, 其表面电阻会根据表⾯的氧含量⽽改变。氧化⽓体(如 NO2),会发生还原反应,增加表面的氧离子。相应的增加了表面的电阻;⽽还原⽓体(如 VOC),在⾦属氧化物表⾯燃烧消耗氧气,会降低表面电阻。
3、常见的空气质量传感器的种类
按照前面的工作原理来区分,常见的空气质量传感器有检测空气颗粒的传感器,和检测TVOC挥发性有机化合物的空气质量传感器。而由于目前器件的高集成度,有的产品两种功能都具备。
3.1 空气颗粒物传感器
空气颗粒传感器采用的是激光散射原理和光学检测技术。 相比来说激光测量具有高精度和快速响应的特点。目前由于成本的不断降低,家用激光PM2.5空气检测仪已经成为了市场上非常普及的智能小家电。
有趣的是,空气颗粒传感器的检测方式也可以用来监测厨房油烟的污染。因为厨房油烟的主要成分也是一些微小的颗粒,同样是对人体健康具有很大危害的一种污染源。
3.2 挥发性有机化合物传感器
挥发性有机化合物气体的检测采用是电化学检测原理,是基于对金属氧化物表面电阻的测量。它的结果容易受到温度和湿度变化的影响,所以一般都需要配合湿度传感器来进行补偿校正。 所以空气质量传感器中一般都集成了温度和湿度传感器。并且它通常需要定期校准。另外由于对多种气体都有反应,通常无法将其一一区分出来。但是有的传感器可以通过不同的模式设置,来增强其对于特定气体组别的选择性的测量。
4、空气质量传感器实验演示
我们来演示使用树莓派RP2040来读取显示空气质量传感器的数据。实验中使用的是一款采用金属氧化物技术的空气质量传感器模块。当前实验室状态下空气质量颗粒计数显示为400。我们在附近点燃一个纸片靠近传感器,可以看到显示的空气颗粒物计数急剧升高。
主控板卡:基于RP2040的带屏调试助手
以下是主程序中对于空气质量传感器数据的获取代码示例:
from ENS160 import myENS160
from machine import UART,Pin,Timer,PWM,SPI,time_pulse_us, I2C,freq
import _thread
from time import sleep_us,ticks_us,sleep,sleep_ms
import uos
import test.st7789 as st7789
from test.fonts import vga2_8x8 as font1
from test.fonts import vga1_16x32 as font2
import random
import math,array
import struct
freq(180_000_000)
obj=myENS160()
st7789_res = 0
st7789_dc = 1
disp_width = 240
disp_height = 240
CENTER_Y = int(disp_width/2)
CENTER_X = int(disp_height/2)
spi_sck=Pin(2)
spi_tx=Pin(3)
spi0=SPI(0,baudrate=60_000_000, phase=1, polarity=1, sck=spi_sck, mosi=spi_tx)
display = st7789.ST7789(spi0, disp_width, disp_width,
reset=machine.Pin(st7789_res, machine.Pin.OUT),
dc=machine.Pin(st7789_dc, machine.Pin.OUT),
xstart=0, ystart=0, rotation=0)
display.fill(st7789.WHITE)
air_1 = "/air_1.bin" #图片文件地址
air_2 = "/air_2.bin" #图片文件地址
air_3 = "/air_3.bin" #图片文件地址
co2_1 = "/co2_1.bin" #图片文件地址
co2_2 = "/co2_2.bin" #图片文件地址
co2_3 = "/co2_3.bin" #图片文件地址
display.text(font2, "STATE OF AIR", 20, 190, color=st7789.BLUE, background=st7789.WHITE)
display.text(font1, "AQI level", 120, 20, color=st7789.BLUE, background=st7789.WHITE)
display.text(font1, "CO2 level", 120, 110, color=st7789.BLUE, background=st7789.WHITE)
while True:
TVOC=obj.getTVOC()
AQI=obj.getAQI()
ECO2=obj.getECO2()
print(AQI,TVOC,ECO2)
if (AQI == 1 or AQI == 2) :
display.text(font2, str(AQI), 145, 40, color=st7789.GREEN, background=st7789.WHITE)
f_image = open(air_1, 'rb')
for column in range(1,48):
buf=f_image.read(96)
display.blit_buffer(buf, 30, column+30, 48, 1)
elif (AQI == 3 or AQI == 4) :
display.text(font2, str(AQI), 145, 40, color=st7789.YELLOW, background=st7789.WHITE)
f_image = open(air_2, 'rb')
for column in range(1,48):
buf=f_image.read(96)
display.blit_buffer(buf, 30, column+30, 48, 1)
elif (AQI > 4) :
display.text(font2, str(AQI), 145, 40, color=st7789.RED, background=st7789.WHITE)
f_image = open(air_3, 'rb')
for column in range(1,48):
buf=f_image.read(96)
display.blit_buffer(buf, 30, column+30, 48, 1)
if (ECO2 < 800) :
display.text(font2, str(ECO2)+" ", 130, 130, color=st7789.GREEN, background=st7789.WHITE)
f_image = open(co2_1, 'rb')
for column in range(1,48):
buf=f_image.read(96)
display.blit_buffer(buf, 30, column+120, 48, 1)
elif (ECO2 > 800 and ECO2 < 1500) :
display.text(font2, str(ECO2)+" ", 130, 130, color=st7789.YELLOW, background=st7789.WHITE)
f_image = open(co2_2, 'rb')
for column in range(1,48):
buf=f_image.read(96)
display.blit_buffer(buf, 30, column+120, 48, 1)
elif (ECO2 > 1500) :
display.text(font2, str(ECO2), 130, 130, color=st7789.RED, background=st7789.WHITE)
f_image = open(co2_3, 'rb')
for column in range(1,48):
buf=f_image.read(96)
display.blit_buffer(buf, 30, column+120, 48, 1)