自制甲醛检测仪

这几年买房、买车的朋友越来越多,当然我不在买房买车的行列,做开源的嘛,穷是必然的(笑)。新房装修、新车内饰的甲醛问题也随之而来。一些朋友网购了百十元的甲醛检测仪,也有三五百元的,找我来鉴定这些设备是否可靠。经过拆解部分的甲醛检测仪、以及在网上论坛的了解,发现甲醛检测仪这方面的水很深。比如,有些甲醛检测仪内部的传感器乃是十分廉价的模拟电路,有些甚至和抽油烟机的气体传感器同一级别。个别论坛里也有揭露,近千元的甲醛检测仪,打着进口的品牌,其实是廉价的传感器,以次充好。虽然廉价的传感器在检测甲醛时有一定的参考性,但其精确到和可靠性大打折扣。鉴于此,工作室设计了一款较为精准的DIY甲醛检测仪,可以测量甲醛数值、温湿度,并配有安卓APP显示。如图所示。

自制甲醛检测仪_第1张图片
显示效果.jpg

这个设计有点bug:APP与LCD显示会有误差,经过研究,发现是安卓平台和单片机硬件的差异导致的,如下图:

自制甲醛检测仪_第2张图片
误差演示.jpg

可以看到,app中显示甲醛浓度为0.362mg/m³,温度为30.2℃,而LCD12864显示的是0.363mg/m³和30.3℃,这是因为,单片机硬件在保留小数位的时候,自动向上取整了。比如实际读取到的温度是30.26℃,当保留1位小数时,应该是30.2℃,但实际结果是30.3℃(有兴趣的可以保留多位小数观察一下)。同时,安卓app这边,小数处理上也有类似的问题。不过这些误差是可以接受的,毕竟分辨率比较高了。

本设计由单片机系统、WZ-S型甲醛传感器、温湿度传感器、OLED显示、和蓝牙模块组成,其中,OLED显示屏和蓝牙模块可以同时兼有,也可以只取其一。只需要手机APP显示时,可以舍弃OLED显示部分;如果不需要手机APP显示,也可以舍弃蓝牙模块。 单片机使用STC15F2K系列增强型8051,该单片机具有两个UART串口,串口1用于甲醛模块数据的读取,串口2用于连接蓝牙模块。发送数据到安卓APP。该单片机I/O口可通过软件配置为开漏模式,用于Si7201通信。

模块说明

甲醛检测模块

甲醛检测仪使用英国达特甲醛传感器,具有nqa ISO9001 和UKAS认证,采用电化学检测测原理,分辨率可达0.001ppm(换算为甲醛浓度为1.34μg/m³),与采用廉价的半导体传感器的甲醛检测备相比,测量数据更可靠,足够满足一般民用检测。

WZ-S型甲醛模块部分参数:

产品型号 WZ-S
检测原理 燃料电池
检测气体 甲醛
检测量程 0-2ppm
最大过载 10ppm
供电电压 5-7V
预热时间 <3min
响应时间 (T 90 ) <40S
恢复时间 (T 10 ) <60S
分辨率 0.001ppm
工作温度 -20℃~50℃
工作湿度 10%-90%RH(非凝结)
存储温度 0~20℃
使用寿命 5 年(正常使用)
重量 4g

甲醛传感器内置数模转换电路,直接通过UART串口输出数字数据,用户只需要根据通信协议将数据进行转换便可得到甲醛浓度值。模块供电为5V,但TX和RX通信端口电压为3.3V,因此与5V单片机通信时,需要5V转3.3V电平转换模块,以免甲醛模块无法承受5V单片机I/O口的电压。

蓝牙模块

蓝牙模块为HC05,可通过AT指令配置主从模式,当与手机蓝牙通信时,需要配置为从模式。通过AT指令,仅需要配置如下参数:

  1. AT+NAME="XXX" 配置模块名称
  2. AT+ROLE=0 配置为从模式(ROLE=1为主模式)
  3. AT+CMODE=1 配置为任意连接模式
  4. AT+PSWD=1234 配置配对密码
  5. AT+UART=9600,0,0 配置蓝牙串口波特率为9600,停止位1位,无校验位(和单片机串口参数一致)
    蓝牙模块配置的时候有点坑,需要加个回车,有些串口助手软件自带了回车,需要注意。

温湿度传感器

温湿度传感器使用Si7201模块,与DHT11相比,体积更小,测量精度更高。使用该模块时需要注意,模块需要3.3V供电,SDA和SCL端口与单片机连接时,单片机I/O口必须配置为开漏模式,否则有可能无法读到准确的数据。

软件设计

程序中,设定查询时间为5秒,即每隔5秒可查询一次甲醛浓度数据,甲醛模块收到单片机的查询指令后,溢出9字节的数据,存储在数组receive_buf[9]中。源代码中,给出了处理甲醛数据的方法:

方法1:直接读取receive_buf[2]、receive_buf[3]的浓度数据,把两个8位数据整合为float型,代码如下:

HCHO = (float) (receive_buf[2]<<8 | receive_buf[3]);
HCHO = HCHO/1000;   //μg转换为mg,1mg=1000μg

求助来的数值单位是μg/m³,除以1000便可得到mg/m³

方法2:读取receive_buf[6]、receive_buf[7]的ppb数据,把两个8位数据整合为float型,此时得到的单位是ppb,ppb除以1000,得到ppm值。

HCHO = (float) (receive_buf[6]<<8 | receive_buf[7]);   //求出ppb值
HCHO = HCHO / 1000 * 1.3393 ;                          //根据ppb得到ppm值,再换算为甲醛浓度

ppm(parts per million) 是百万分率(或百万分之几)是用溶质质量占全部溶液质量的百万分比来表示的浓度 。1ppm与mg/m³的关系为,X = C * M /22.4,其中,X是气体浓度质量分数,单位mg/m³;C是气体体积分数,量纲是ppm;M是气体相对分子质量(此处是甲醛),甲醛的分子式HCHO,相对分子质量为30。22.4空气在标准大气压下的相对分子质量。所以,1ppm甲醛气体体积浓度相当于:1ppm*30/22.4=1.3393mg/m³

上述方法选其一求出甲醛浓度后,格式化数据,最后输出到液晶屏显示。

温湿度传感器Si7201的数据较为简单,使用标准IIC协议读取数据,为节约篇幅,本文只介绍温湿度数据处理部分。数组Data_buf[]中,Data_buf[0]、Data_buf[1]分别存储温度高字节、温度低字节;Data_buf[2]、Data_buf[3]分别存储湿度高字节、湿度低字节。这些数据得到后,并不能直接合并后输出显示,而是要跟手册公式计算出数值。温度、湿度转换公式分别为:

自制甲醛检测仪_第3张图片
湿度公式
自制甲醛检测仪_第4张图片
温度公式

转换为C代码为:

temp_u16 = Data_buf[0] << 8 | Data_buf[1];    
tmp_value = 175.72 * temp_u16 /65536 - 46.85;   

temp_u16 = Data_buf[2]<<8 | Data_buf[3];
RH_value =  temp_u16;                       
RH_value = 125 * RH_value/65536-6;          

tmp_value为最终求得的温度数值,RH_value为最终求得的湿度数值。最后格式化数据,输出到12864显示。

现在,有了甲醛浓度数据、温湿度数据显示在液晶屏,如何发送到手机显示呢?此处借助蓝牙通信实现。单片机将得到的数据,通过串口2传输给蓝牙模块,蓝牙模块与手机蓝牙连接,获取单片机数据,APP用和单片机相同的方法处理数据后,得到数值并显示。单片机硬件和手机软件进行通信时,要制定一个数据通信协议,即硬件以一定的方式发送数据,手机软件收到数据后,根据一定的格式解析数据,解析后的数据与单片机显示的的数据应当一致。设定的通信协议如下:

0 1 2 3 4 5 6 7 8
帧头 甲醛浓度高位 甲醛浓度低位 温度高位 温度低位 湿度高位 湿度低位 校验位 帧尾
FA 0 0 0 0 0 0 0 FC

由于协议字节数不长,实际上,只校验了帧头和帧尾,没有加入实际的校验位,读者可根据自实际情况加入校验方法。甲醛浓数据、温湿度数据与单片机读取的数据格式完全一致,安卓程序中,套用单片机C代码中的公式即可得到实际数据。

资料下载: 戳我下载

若资料失效,请留言告知

你可能感兴趣的:(自制甲醛检测仪)