一,PM2.5概念
细颗粒物又称细粒、细颗粒、PM2.5。细颗粒物指环境空气中空气动力学当量直径小于等于 2.5 微米的颗粒物。它能较长时间悬浮于空气中,其在空气中含量浓度越高,就代表空气污染越严重。虽然PM2.5只是地球大气成分中含量很少的组分,但它对空气质量和能见度等有重要的影响。与较粗的大气颗粒物相比,PM2.5粒径小,面积大,活性强,易附带有毒、有害物质(例如,重金属、微生物等),且在大气中的停留时间长、输送距离远,因而对人体健康和大气环境质量的影响更大。2013年2月,全国科学技术名词审定委员会将PM2.5的中文名称命名为细颗粒物。细颗粒物的化学成分主要包括有机碳(OC)、元素碳(EC)、硝酸盐、硫酸盐、铵盐、钠盐(Na⁺)等。
(摘自百度)
二,ZPH01传感器介绍
ZPH01传感器是整合了成熟的VOC检测技术与先进PM2.5检测机理,实现对VOC与PM2.5的同时检测。该传感器中VOC检测单元对甲醛、苯、一氧化碳、氨气、氢气、酒精、香烟烟雾、香精等有机挥发气体具有极高的灵敏度。PM2.5检测单元采用粒子计数原理,可灵敏检测直径1μm以上灰尘颗粒物。
备注:VOC是Volatile Organic Compounds的缩写,即有机挥发物。含甲苯、乙苯、苯乙烯、甲醛、乙醇、十四碳烷、TVOC等。
ZPH01传感器的特点:极高的灵敏度、优异的长期稳定性、出厂已标定校准、内置加热器可实现空气的自动吸入。
三,ZPH01传感器技术指标
1,工作电压范围 5±0.2 V DC
2,输出方式 PWM /UART
3,检测能力
(1)VOC检测气体 总类
甲醛、苯、一氧化碳、氢气、酒精、氨气、香烟烟雾、香精等
(2)粉尘最小粒子检出能力 1 μm
4,预热时间 ≤5 min
5,检测粒子范围 15000 个/283 ml
6,工作电流 ≤150 mA
7,湿度范围
储存环境 ≤90% RH
工作环境 ≤90% RH
8,温度范围
储存环境 -20 ℃~50 ℃
工作环境 0 ℃~50 ℃
四,传感器使用时须注意的事项:
1、传感器必须垂直安装,避免接触有机溶剂(包括硅胶及其他胶粘剂)、涂料、药剂、油类及高浓度气体。远离人工气流如风扇,如当用于空气清新机时,风扇的前方和后方都不能安装,可任选外壳一侧安装,但外壳上要保留通风口以保证外部气流可以流进来。
2、粉尘传感器能检测到像粉尘一样的水蒸气,请不要在有水蒸气的地方像浴室或空气加湿气附近使用传感器。
3、粉尘传感器利用红外线的 LED 和可见光截止的光电传感器,在光学区域灯光的辐射会影响粉尘传感器的输出准确度。使用时建议用海绵遮盖粉尘传感器中心三角孔,防止外部光照照进传感器的镜头。切记勿遮挡传感器的进气口和出气口。
4、模组初次上电使用需要预热 5 分钟以上,切勿应用到涉及人身安全的系统中。
5、当传感器受潮湿将会影响它的正常功能,因此应避免受潮。
6、透镜需要根据使用环境定时进行清洁,约 6 个月一次。清洁时用棉签一头醮清水轻擦,然后用另一头擦干。不可以用酒精等有机溶剂擦拭透镜。
五,原理示意:
六,ZPH01传感器输出对照转化表
注:空气检测领域中常用“优、良、中、差”区分当前空气质量状况。模组内部经过标定校准,直接输出0x00-0x03四个等级,依次对应“优、良、中、差”
备注:空气检测领域中常用“优、良、中、差”区分当前空气质量状况,业内常用划分等级标准为:
1:较高灵敏度方案:
优:0.00%-2.00%
良:2.00%-4.00%
中:4.00%-6.00%
差:6.00%以上
2:较好一致性方案:
优:0.00%-4.00%
良:4.00%-8.00%
中:8.00%-12.00%
差:12.00%以上
七,ZPH01传感器接口定义
说明:
1、加热源:传感器内置一个加热器,加热引起气流上升使外部空气流进传感器内部。
2、检测的粒子类型:此传感器被设计成可以检测 1μm 以上粒子,如香烟、房屋灰尘、霉菌、 花粉、孢子。
3、控制脚 :此脚位为输出模式控制(悬空为 PWM 模式,GND 为串口模式)。
4、输出脚 OUT2/RXD :此脚位串口模式下为 RXD,PWM 模式下为普通输出脚位,灵敏度已预设定,最小粒子检出能力为 1μm。
5、输出脚 OUT1/TXD :此脚位串口模式下为 TXD,PWM 模式下为普通输出脚位,输出 VOC 等级。
备注:
1、LT 一个周期内低电平的脉宽
2、UT 一个周期的脉宽
3、低脉冲率RT:RT=LT/ UT × 100%
九,ZPH01传感器通讯协议
1 通用设置
波特率 9600
数据位 8 位
停止位 1 位
校验位 无
2 通讯命令
模块每间隔1S发送一次浓度值,只发送不接收。命令行格式如下:
0 1 2 3 4 5 6 7 8
起始位 检测类型名称编码 单位(低脉冲率)低脉冲率整数部分 低脉冲率小数部分预留 模式 VOC等级 校验值
0xFF 0x18 0x00 0x00-0x63 0x00-0x63 0x00 0x01 0x00-0x03 0x00-0xFF
注:模式0x01表示PWM为1Hz输出模式。
备注:
对占空比的换算:例如,传感器发出一帧数据,第三位0x12,第四位0x13,则表示传感器输出占空比为18.19%。
对PM2.5的换算:将比例系数k*18.19%即可得到探测器测到的环境PM2.5的浓度,经验值:k=1000左右。
十,ZPH01传感器校验和
/**********************************************************************
* 函数名: FucCheckSum(uchar *i,ucharln)
* 功能描述:求和校验(取发送、接收协议的1\2\3\4\5\6\7的和取反+1)
* 函数说明:将数组的元素1-倒数第二个元素相加后取反+1(元素个数必须大于2)
**********************************************************************/
unsigned char FucCheckSum(unsigned char *i,unsigned char len)
{
unsigned char j,result=0;
i+=1;
for(j=0;j<(len-2);j++)
{
result+=*i;
i++;
}
result=(~result)+1;
return result;
}
十一,程序源码
//串口2C文件
#include "usart2.h"
#include "timer.h"
#include "led.h"
#include "usart.h"
#include "beep.h"
USART usart2={0,0,0};
/*
* 串口中断函数
*/
void USART2_IRQHandler(void)
{
u8 res;
static u8 flag=0;
if((USART2->SR&(1<<5))) //接收到数据
{
res=USART2->DR;
if(res==255)
{
flag=1;
LED1=0;
}
if(flag)
{
usart2.usart_rx_buff[usart2.count++]=res;
if(usart2.count>8)
{
USART2->CR1 &=~(1<<5);
usart2.flag=1;
BEEP=!BEEP;
flag=0;
LED1=1;
// printf("\r\ncount=%d\r\n",usart2.count);
}
}
}
}
/*
* 初始化IO 串口2
* pclk2:PCLK2时钟频率(Mhz)
* bound:波特率
*/
void uart2_Init(u32 pclk2,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk2*1000000)/(bound*16);
mantissa=temp;
fraction=(temp-mantissa)*16;
mantissa<<=4;
mantissa+=fraction;
GPIOA->CRL&=0XFFFF00FF;
GPIOA->CRL|=0x00008b00;
RCC->APB2ENR|=1<<2;
RCC->APB1ENR|=1<<17;
RCC->APB1RSTR|=1<<17;
RCC->APB1RSTR&=~(1<<17);
USART2->BRR=mantissa;
USART2->CR1|=0X2004;
USART2->CR1|=1<<5;
MY_NVIC_Init(2,2,USART2_IRQn,2);
}
//ZPH01c部分文件
#include "ZPH01.h"
#include "usart2.h"
#include "usart.h"
#include "led.h"
#include "beep.h"
#include "delay.h"
/*
控制脚 :此脚位为输出模式控制(悬空为 PWM 模式,GND 为串口模式)
*/
typedef struct __ZPH01
{
uchar flag;
uchar timerFlag;
uchar checkSum;
uchar datBasic[9];
float datProcess;
}ZPH01;
#if (0==ZPH01MODESEL)
/*
* ZPH01初始化函数(串口模式)
*/
void ZPH01_InitUART(void)
{
uart2_Init(72,9600);
usart2.count=0;
usart2.flag=0;
TIM3->CR1|=0x01;
}
//ZPH01头文件
#ifndef __ZPH01_H
#define __ZPH01_H
#include "stm32f10x.h"
#include "sys.h"
#define uchar unsigned char
#define uint unsigned int
//ZPH01MODESEL=0 串口模式 ZPH01MODESEL=1 PWM模式
#define ZPH01MODESEL 0
#if (0==ZPH01MODESEL)
void ZPH01_InitUART(void);
void ZPH01_HandlerUART(void);
uchar ZPH01_FucCheckSumUART(uchar *dat,uchar len);
#else
void ZPH01_InitPWM(void);
void ZPH01_HandlerPWM(void);
uchar ZPH01_FucCheckSumPWM(uchar *dat,uchar len);
#endif
#endif
//定时器C文件
#include "timer.h"
#include "led.h"
#include "usart2.h"
#include "beep.h"
//定时器3中断服务程序
void TIM3_IRQHandler(void)
{
if(TIM3->SR&0X0001)//溢出中断
{
LED0=!LED0;
if(usart2.timerFlag==1)
{
USART2->CR1 &=~(1<<5);
usart2.timerFlag=0;
}
else
{
USART2->CR1|=1<<5;
usart2.timerFlag=1;
}
}
TIM3->SR&=~(1<<0);//清除中断标志位
}
//通用定时器3中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void TIM3_Int_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1; //TIM3时钟使能
TIM3->ARR=arr; //设定计数器自动重装值//刚好1ms
TIM3->PSC=psc; //预分频器7200,得到10Khz的计数时钟
TIM3->DIER|=1<<0; //允许更新中断
TIM3->CR1|=0x00; //使能定时器3
MY_NVIC_Init(1,2,TIM3_IRQn,2);//抢占1,子优先级3,组2
}
//ledC文件
#include "led.h"
//初始化PB5和PE5为输出口.并使能这两个口的时钟
//LED IO初始化
void LED_Init(void)
{
RCC->APB2ENR|=1<<3; //使能PORTB时钟
RCC->APB2ENR|=1<<6; //使能PORTE时钟
GPIOB->CRL&=0XFF0FFFFF;
GPIOB->CRL|=0X00300000;//PB.5 推挽输出
GPIOB->ODR|=1<<5; //PB.5 输出高
GPIOE->CRL&=0XFF0FFFFF;
GPIOE->CRL|=0X00300000;//PE.5推挽输出
GPIOE->ODR|=1<<5; //PE.5输出高
LED1=LED0=1;
}
注意:ZPH01传感器安装位置特别重要,安装位置会影响数据采集的准确性