欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PM2.5检测

程序员文章站 2024-03-07 16:59:15
...

PM2.5检测

一、传感器的概述

GP2Y1010AUOF是日本夏普公司开发的一款光学灰尘浓度检测传感器。此传感器内部成对角分布的红外发光二极管和光电晶体管,利用光敏原理来工作。用于检测特别细微的颗粒,如香烟颗粒、细微灰尘。依靠输出脉冲的高度来判断颗粒浓度。
供电电压;5-7V
工作温度;-10-65℃
监测最小直径;0.8μm
夏普GP2Y1010AU0F灰尘传感器价格较便宜,只能检测出室内空气中的灰尘和烟尘含量.并不能测出所谓的PM2.5浓度,然而现在市面上有好多红外发光二极管的传感器都称自己是PM2.5传感器,能测PM2.5的值,其实并不是,真正能测PM2.5浓度的是那种上百的激光传感器,这种红外的连PM10都测不了,只能用来玩玩,或者大概描述空气质量的等级而已,经我多次实验,发现这传感器显示的灰尘浓度与网上公布的AQI空气质量指数比较接近,跟真实的PM2.5浓度有很大的区别,这测出的灰尘浓度其实就是所有不同直径的颗粒物总和,里面包含了PM1.0,PM2.5,PM10。
二、硬件连接
PM2.5检测
PM2.5检测
PM2.5检测
传感器中心有个洞可以让空气*流过,定向发射LED光,通过检测经过空气中灰尘折射过后的光线来判断灰尘的含量。

三、检测原理
GP2Y1010AU 插上电源后 1 秒内会稳定、正常地运作,可以进行检出。
对 GP2Y1010AU 输出电压的绝对值,并不是判定检出的有无,使用方法是:无尘时,从输出电压的变化量来做判定。
另外,可以根据输出电平时间上的变化来对检出对象物的种别进行判别。
关于一般被采用的灰尘和烟的判别方法,一般,香烟的烟是细微粒子,密度高,会扩散式的大范围漂移。与此相比,灰尘是一个一个大颗粒,密度低,断断续续式的进入灰尘传感器的检出领域。 就如下图所述,烟是连续的表现出较高的输出电压,灰尘是间隔的表现出较高的输出电压。因此,根据传感器的输出电压(发光素子和已同期的脉冲输出电压值)在时间上的推移向微机软件的读取,是否尘/是否有烟/是否有灰尘,不管是哪种状态,及空气污染的程度是多少,都可以进行检出。
PM2.5检测

灰尘的检出是在规定时间内,在某一输出电压变化的标准以上,判定在某一时间
的输出被记入什么,从而检出灰尘的有无
四、特性
PM2.5检测
根据技术手册可知,当空气洁净的时候,Vo的范围是0~1.5V,典型值是0.9V。
当空气灰尘浓度很高的时候,Vo的数值大于3.6V。但是该传感器输出的最大电压为3.6V,所以当灰尘浓度再增加时,我们这款传感器已经测不出了。
五、程序代码

#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char //宏定义
//下载资源可见端口定义
/*****************************????????
*********************************************/
void lcd_init()//?????????//
{ 
 delay1ms(15);
 wr_com(0x38);
 delay1ms(5);
 wr_com(0x01);
 delay1ms(5);
 wr_com(0x06);
 delay1ms(5);
 wr_com(0x0c);
 delay1ms(5);

 wr_com(0x80);
 wr_dat('P');//
 wr_com(0x81);
 wr_dat('M');//:
 wr_com(0x82);
 wr_dat('2');//
 wr_com(0x83);
 wr_dat('.');//:
 wr_com(0x84);
 wr_dat('5');//:
 wr_com(0x85);
 wr_dat(':');

wr_com(0x8b);
 wr_dat('m');
 wr_com(0x8c);
 wr_dat('g');
 wr_com(0x8d);
 wr_dat('/');
 wr_com(0x8e);
 wr_dat('m');
 wr_com(0x8f);
 wr_dat('3');

 wr_com(0xc0);
 wr_dat('A');
 wr_com(0xc1);
 wr_dat('l');
 wr_com(0xc2);
 wr_dat('a');
 wr_com(0xc3);
 wr_dat('r');
 wr_com(0xc4);
 wr_dat('m');
 wr_com(0xc5);
 wr_dat(':');

 wr_com(0xcb);
 wr_dat('m');
 wr_com(0xcc);
 wr_dat('g');
 wr_com(0xcd);
 wr_dat('/');
 wr_com(0xce);
 wr_dat('m');
 wr_com(0xcf);
 wr_dat('3');
 }

uchar Error_Correct(uchar *str,uchar num)
{
 unsigned char i=0;
 unsigned char j=0;
 unsigned char Temp=0;
 //????
 for(i=0;i<num-1;i++)
 {
 for(j=i+1;j<num;j++)
 {
    if(str[i]<str[j])
  {
  Temp=str[i];
  str[i]=str[j];
  str[j]=Temp;
  }
 }
}
 //去除误差取中间值
 return str[num/2];
}
//主函数
void main(void)
{
 InitTimer(); /初始化定时器
 BEEP=1;
 lcd_init();//初始化lcd
 delay1ms(500);
 while(1)
 {
  checkkey();//按键检测
 if(set_st==0)
 {
 	if(FlagStart==1) //1次数据采集完成
  {
  num++;
  ADC_Get[num]=abc;
  if(num>9)
  {
  num=0;
  DUST=Error_Correct(ADC_Get,10);
     DUST_Value=(DUST/256.0)*5;//转化成电压值
     DUST_Value=(DUST_Value*0.17-0.1)*1000;//固体悬浮颗粒
  if(DUST_Value<0) DUST_Value=0;
  if(DUST_Value>760) DUST_Value=760; //限位
  DUST=(uint)DUST_Value;
  }
  TL0 = (65536-10000)/256;
  TH0 = (65536-10000)%256;
  TR0 = 1; //开始定时器
  EA = 1;
  FlagStart=0;
  }
  Alarm(); //报警
 }
 disp(DUST);//显示粉尘浓度
 baojing();//显示报警值
   if(set_st==1)
  {
  wr_com(0xca);
  wr_com(0x0d);
  delay1ms(150);
  }
 }
}