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。
二、硬件連接
傳感器中心有個洞可以讓空氣自由流過,定向發射LED光,通過檢測經過空氣中灰塵折射過後的光線來判斷灰塵的含量。
三、檢測原理
GP2Y1010AU 插上電源後 1 秒內會穩定、正常地運作,可以進行檢出。
對 GP2Y1010AU 輸出電壓的絕對值,並不是判定檢出的有無,使用方法是:無塵時,從輸出電壓的變化量來做判定。
另外,可以根據輸出電平時間上的變化來對檢出對象物的種別進行判別。
關於一般被採用的灰塵和煙的判別方法,一般,香菸的煙是細微粒子,密度高,會擴散式的大範圍漂移。與此相比,灰塵是一個一個大顆粒,密度低,斷斷續續式的進入灰塵傳感器的檢出領域。 就如下圖所述,煙是連續的表現出較高的輸出電壓,灰塵是間隔的表現出較高的輸出電壓。因此,根據傳感器的輸出電壓(發光素子和已同期的脈衝輸出電壓值)在時間上的推移向微機軟件的讀取,是否塵/是否有煙/是否有灰塵,不管是哪種狀態,及空氣污染的程度是多少,都可以進行檢出。
灰塵的檢出是在規定時間內,在某一輸出電壓變化的標準以上,判定在某一時間
的輸出被記入什麼,從而檢出灰塵的有無
四、特性
根據技術手冊可知,當空氣潔淨的時候,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);
}
}
}