Tips:关于CO2和TVOC的介绍可见附录1
二、实践目标
本实践项目运用掌控板作为智能终端,通过LM35温度传感器采集温度数据,CCS811空气质量传感器来采集CO2和TVOC浓度,并借助风扇来改善环境。
三、知识目标
- 认识CCS811空气质量传感器、风扇模块等硬件设备;
- 理解上述不同元器件的使用和接线方法,能根据连线图进行实物连接;
- 掌握以掌控板为智能终端,通过BXY软件编写代码采集CO2和TVOC浓度数据的方法.
四、实践准备
硬件清单
知识链接
简介:CCS811空气质量传感器能够测量eCO2(equivalent CO2)和TVOC(Total Volatile Organic Compounds)浓度。可用于空气测量应用,例如:空气质量检测、空气净化器、新风系统等。
气质量传感器(后简称为空气质量传感器)的接口既不是数字口也不是模拟口,是IIC接口。IIC我们一般称为I2C(I平方C、I方C)IIC是一种通讯协议。IIC串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到IIC总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。对比扩展板的接口来看就很清楚了。在接口旁边有+、-、C、D分别对应的是正负极接口和SCL、SDA这几个接口。相较于之前使用的传感器多了一根信号线,所以在接线的时候需要注意不要接错位置。
简介:在空气质量变差需要加快空气流通时就需要使用风扇来辅助了,如何驱动风扇模块呢?风扇模块是数字信号模块,所以只需要给对应引脚高电平就可以开启风扇,低电平就停止风扇运行。
简介:这是一款基于LM35半导体的温度传感器,可以用来对环境温度进行定性的检测。LM35半导体温度传感器是美国国家半导体公司生产的线性温度传感器。其测温范围是-40℃到150℃,灵敏度为10mV/℃,输出电压与温度成正比。
五、实践过程
在本项目中,我们将利用空气质量传感器,分三步设计一个空气质量检测装置,来实时检测空气中CO2和TVOC浓度,并尝试利用风扇来改善环境。
- 实时检测CO2和TVOC浓度
- 添加环境改善功能
任务1:CO2和TVOC浓度实时检测
1、硬件搭建
STEP1:将掌控板插入I/O扩展板,注意正反
STEP2:按下图通过连接线将风扇接入扩展板P8口,DHT11接入P0 口,CCS811空气质量传感器接入IIC口。
注:空气质量传感器是IIC传感器,所以需要接到对应的位置,扩展板上有两组IIC接口,都可以使用,没有区别。
STEP3:通过USB连接线将掌控板接到计算机。
2、软件编写
STEP1:软件设置
1、创建与保存项目文件
(1)启动BXY编程软件,选择主控类型“掌控板”。
(2)新建项目,保存并命名为“z4.1”。
STEP2:CCS811库程序文件烧录
在编写实验程序之前,我们需要先烧录CCS811库程序至主控板中。程序见附录2。
STEP3:程序编写
#特别注意:
# 需要先将"ccs811.py"烧录到主控板中
from mpython import *
import time
from ccs811 import CCS811 #导入CCS811
ccs = CCS811()
while True:
if(ccs.check_data_ready()):
print("CO2:"+str(ccs.CO2_PPM())+" ppm")
print("TVOC:"+str(ccs.TVOC_PPB())+" ppb")
print("-----------------------")
time.sleep(0.5)
3、运行调试
STEP1:点击“烧录”上传程序并运行
观察软件,我们可以发现测得的CO2和TVOC浓度数据实时显示在终端中
STEP2:对空气质量传感器哈一口气
观察软件终端,可以看到检测到的浓度数据显著变大
任务2:改善环境
在上个任务中,我们已经完成了对于CO2和TVOC浓度的实时检测,且连接好了硬件设备。接下来,我们可在此基础上改善环境,当浓度变大时使风扇转动起来。
1、硬件搭建
STEP1:由于上一步已将所有硬件连接好,这里无需再接入做其他硬件
2、软件编写
STEP1:软件设置
1、创建与保存项目文件
(1)启动BXY编程软件,选择主控类型“掌控板”。
(2)新建项目,保存并命名为“z4.2”。
STEP2:程序编写
#特别注意:
# 需要先将"ccs811.py"烧录到主控板中
from mpython import *
import time #导入程序必要的包和块
from ccs811 import CCS811 #导入CCS811
ccs = CCS811()
P8=MPythonPin(8,PinMode.OUT)
# 实例化MPythonPin,将P8设置为"PinMode.OUT"模式
while True:
if(ccs.check_data_ready()):
CO2 = ccs.CO2_PPM()
TVOC = ccs.TVOC_PPB()
print("CO2:"+str(CO2)+" ppm")
print("TVOC:"+str(TVOC)+" ppb")
print("-----------------------")
if (CO2 >= 1000 or TVOC >=88 ):
P8.write_digital(1) #开风扇
else:
P8.write_digital(0) #关风扇
time.sleep(0.5)
3、运行调试
STEP1:点击“烧录”上传程序并运行
观察软件可以看到CO2和TVOC的浓度实时显示在串口终端。
STEP2:对空气质量传感器哈一口气
随着软件终端浓度的变大,我们可以看到风扇转动起来。
六、延伸拓展
- 尝试修改程序,将环境温湿度的数据同时检测并显示在掌控板屏幕上
- 进一步优化项目,当CO2和TVOC的浓度过高时使蜂鸣器发出警报声
- 调查资料,了解空气中还有什么物质会影响到健康的?可以通过什么手段来监测他们,他们的变化趋势是怎样的?是否有规律可寻?
附录
附录1:扩展阅读
-
CO2对人体的影响
-
TVOC
简介:
室内空气品质的研究人员通常把他们采样分析的所有室内有机气态物质称为TVOC,它是Volatile Organic Compound三个词第一个字母的缩写,各种被测量的VOC被总称为总挥发性有机物TVOC(Total Volatile Organic Compounds)。
TVOC是三种影响室内空气品质污染中影响较为严重的一种。TVOC是指室温下饱和蒸气压超过了133.32pa的有机物,其沸点在50℃至250℃,在常温下可以蒸发的形式存在于空气中,它的毒性、刺激性、致癌性和特殊的气味性,会影响皮肤和黏膜,对人体产生急性损害。世界卫生组织(WHO)、美国国家科学院/国家研究理事会(NAS/NRC)等机构一直强调TVOC是一类重要的空气污染物。美国环境署(EPA)对VOC的定义是:除了一氧化碳,二氧化碳,碳酸,金属碳化物,碳酸盐以及碳酸铵外,任何参与大气中光化学反应的含碳化合物。
TVOC的主要成分:
烃类、卤代烃、氧烃和氮烃,它包括:苯系物、有机氯化物、氟里昂系列、有机酮、胺、醇、醚、酯、酸和石油烃化合物等。
TVOC的主要危害:
TVOC有刺激性气味,而且有些化合物具有基因毒性。一般认为,TVOC能引起机体免疫水平失调,影响中枢神经系统功能,出现头晕、头痛、嗜睡、无力、胸闷等自觉症状;还可能影响消化系统,出现食欲不振、恶心等,严重时可损伤肝脏和造血系统,出现变态反应等。眼睛不适:灼热、干燥、异物感、水肿;喉咙不适:喉干;呼吸问题:呼吸短促;哮喘 头痛、贫血、头昏、疲乏、易怒。
我们每天的绝大部分时间都是留在家中、办公室或者其他室内环境。如果室内的空气质量不佳的话,容易引发的疾病数不胜数,这其中最轻的症状就有头痛、眼睛很痒、呼吸困难、皮肤过敏、疲劳或呕吐等。
通过资料我们知道TVOC也是关系到我们身体健康的参数之一,而且主要是在积聚在房间内。
附录2:CCS811库程序
from machine import I2C,Pin
class CCS811:
CCS811_IIC_ADDR = 0x5A
def __init__(self):
self.i2c = I2C(scl=Pin(22), sda=Pin(23), freq=100000)
buf = bytearray(1)
buf[0] = 0xF4
self.i2c.writeto(self.CCS811_IIC_ADDR, buf)
self._set_measurement_mode(0, 0, 4)
self._set_in_temp_hum(25, 50)
self.set_meas_cycle(4)
def _read_reg(self, reg, size):
buf = bytearray(1)
buf[0] = reg
self.i2c.writeto(self.CCS811_IIC_ADDR,buf)
return self.i2c.readfrom(self.CCS811_IIC_ADDR, size)
def _set_measurement_mode(self, thresh, interrupt, mode):
measurement = [0]
measurement[0] = (thresh << 2) | (interrupt << 3) | (mode << 4)
buf = bytearray(2)
buf[0] = 0x01
buf[1] = measurement[0]
self.i2c.writeto(self.CCS811_IIC_ADDR, buf)
def _set_in_temp_hum(self, temperature, humidity):
envData = [0]*4
if(temperature > 0):
_temp = int(temperature+0.5)
else:
_temp = int(temperature-0.5)
_rh = int(humidity+0.5)
envData[0] = _rh << 1
envData[1] = 0
envData[2] = _temp << 1
envData[3] = 0
buf = bytearray(5)
buf[0] = 0x05
buf[1] = envData[0]
buf[2] = envData[1]
buf[3] = envData[2]
buf[4] = envData[3]
self.i2c.writeto(self.CCS811_IIC_ADDR, buf)
def check_data_ready(self):
buf = self._read_reg(0x00, 1)
if(not((buf[0] >> 3) & 0x01)):
return False
else:
return True
def set_meas_cycle(self, ecycle):
measurement = [0]
measurement[0] = ecycle << 4
buf = bytearray(2)
buf[0] = 0x01
buf[1] = measurement[0]
self.i2c.writeto(self.CCS811_IIC_ADDR, buf)
def read_baseline(self):
buf = bytearray(1)
buf[0] = 0x11
self.i2c.writeto(self.CCS811_IIC_ADDR, buf)
rbuf = self.i2c.readfrom(self.CCS811_IIC_ADDR, 2)
baseline = rbuf[0] << 8 | rbuf[1]
return hex(baseline)
def CO2_PPM(self):
buf = self._read_reg(0x02, 8)
self.eCO2 = buf[0] << 8 | buf[1]
return self.eCO2
def TVOC_PPB(self):
buf = self._read_reg(0x02, 8)
self.eTVOC = buf[2] << 8 | buf[3]
return self.eTVOC
def write_base_line(self, baseline):
data = [0]*2
data[0] = baseline >> 8
data[1] = baseline
buf = bytearray(3)
buf[0] = 0x11
buf[1] = data[0]
buf[2] = data[1]
self.i2c.writeto(self.CCS811_IIC_ADDR, buf)