1、设计需求及目标
(1)利用PM2.5传感器模块检测环境PM2.5浓度值,用数码管显示PM2.5值;便携式系统,USB供电;
(2)利用CPU或其他flash存储芯片将PM2.5值进行存储,要求可存储24小时的PM2.5的值,PM2.5值测量采集可以设定1分钟采集一次,或10分钟采集一次,两种采集时间之间可以通过开关相互切换;
(3)PM2.5采集器可连续工作24个小时,进行数据采集;
(4)可以设置PM2.5范围,超过范围时报警 。
2、设计思路及方案
本设计采用由STC89C52单片机最小系统、GP2Y1010AU粉尘传感器、ADC0832模数转换器模块、LCD1602液晶模块、电源模块、蜂鸣器报警模块和按键模块模块组成。单片机实时通过ADC0832转换芯片采集GP2Y1010AU粉尘传感器的粉尘的浓度,通过单片机的数据转换处理后在液晶屏上显示空气中的质量,当测量空间中的粉尘浓度大于设置粉尘浓度时,蜂鸣器和发光二极管发出声光报警。粉尘的浓度报警值可以通过按键进行设置。电路图:
3、部分代码
#include"LCD1602.h" //添加LCD1602头文件
#include"adc0832.h"//添加ADC0832头文件
//#include"time0.h"
sbit BUZZER = P1^3; //蜂鸣器驱动端口==P1^2
sbit Reduc = P1^7; //按键键输入端口==P1^7
sbit Add = P3^0; //按键加输入端口==P3^1
sbit vled = P3^2;
void Delay1us(uint t) //@12MHz
{
while(t--)_nop_();
}
uint read_data(uchar N)
{
uint val=0;
vled=0;
Delay1us(20);
val=adc0832(N);
vled=1;
Delay1us(400);
return val;
}
/************************************************
** 函数名称 : void main(void)
** 函数功能 : 主函数
** 输 入 : 无
** 输 出 : 无
** 说 明 :
************************************************/
void main(void)
{
double PM,pm1,pm2;
int PMVAL=0,HPM=200,PM_count=0,pm1_count=0;
uchar bueezr_flag=0,bueezr_count=0,buzzer_time=25;//蜂鸣器报警变量
LCD_Init();
WriteChar(1,0,16,"PM:0020ug/m3"); // 初始化显示
WriteChar(2,0,16,"HPM2.5:0200ug/m3");
while(1)
{
Delay(120); //延时
pm1+=read_data(1); //ad数据采集
if(++PM_count>=40) //40次数据累加
{
PM_count=0;
pm1=pm1/40; //40次求平均值
pm2+=pm1; //再次累加3次数据
if(++pm1_count>=3)
{
PM=pm2/3; //取平均值
PM=PM*50/255; //数据转换
PM-=4;
PM/=5;
PM*=1000; //单位转换成ug/m3
PMVAL=PM;
// PMVAL+=235;
PMVAL+=625; PMVAL=PMVAL/4; //参数修正
if(PMVAL>=9999)PMVAL=9999; //范围内显示
if(PMVAL<=0)PMVAL=0;
WriteCOMDATA(0x83,0); //显示的数据地址
WriteCOMDATA(PMVAL/1000+0x30,1); //显示千位
WriteCOMDATA(PMVAL/100%10+0x30,1); //显示百位
WriteCOMDATA(PMVAL/10%10+0x30,1); //显示十位
WriteCOMDATA(PMVAL%10+0x30,1); //显示个位
PM=pm1=pm2=0;
}
}
//PM值与报警值比较
if(PMVAL>HPM)
{
bueezr_flag=1;
}
else
{
bueezr_flag=0;
BUZZER=1;
}
if(PMVAL>=100)
WriteChar(1,12,4,"weak");
else if((PMVAL<100)&&(PMVAL>=50))
WriteChar(1,12,4,"good");
else if(PMVAL<50)
WriteChar(1,12,4,"best");
/*******蜂鸣器报警********/
bueezr_count++;if(bueezr_count>buzzer_time*10)bueezr_count=buzzer_time+1;
if(bueezr_count%buzzer_time==0 && bueezr_flag)
{
BUZZER=~BUZZER;//蜂鸣器取反 发出声音提示
}
if(!Reduc)
{
Delay(100);
HPM--;
WriteCOMDATA(0xC7,0);
WriteCOMDATA(HPM/1000+0x30,1);
WriteCOMDATA(HPM/100%10+0x30,1);
WriteCOMDATA(HPM/10%10+0x30,1);
WriteCOMDATA(HPM%10+0x30,1);
}
if(!Add)
{
Delay(100);
HPM++;
WriteCOMDATA(0xC7,0);
WriteCOMDATA(HPM/1000+0x30,1);
WriteCOMDATA(HPM/100%10+0x30,1);
WriteCOMDATA(HPM/10%10+0x30,1);
WriteCOMDATA(HPM%10+0x30,1);
}
}
}