基于51单片机的PM2.5+温湿度检测仪

硬件电路

        单片机实时通过ADC0832转换芯片采集GP2Y1010AU粉尘传感器的粉尘的浓度,和读取环境的温湿度,通过单片机的数据转换处理后在液晶屏上显示空气中的质量,当测量空间中的粉尘浓度、温度、湿度大于设置值时,蜂鸣器和发光二极管发出声光报警。粉尘的浓度、温度、湿度报警值可以通过按键进行设置。
        整体电路主要由51单片机最小系统,LCD1602液晶,ADC0832转换电路,蜂鸣器报警电路,DHT11温湿度传感器,按键电路,GP2Y1010AUOF粉尘传感器及发光二极管设计而成;

        原理图如图:

         仿真图及PCB图如下:

设计功能

  1. LCD1602液晶第一行显示当前测到PM2.5空气质量值,第二行显示当前温度和湿度值。
  2. 使用夏普的GP2Y1010AUOF粉尘传感器实时检测空气中的PM2.5值并通过1602显示出来,检测更加准确。
  3. 当粉尘浓度值高于设定值时、温度湿度超出上下限范围,蜂鸣器和指示灯会发出声光报警。
  4. PM2.5值具有等级划分功能。用3个不同颜色的指示灯指示不同范围。绿灯亮表示环境良好,黄灯亮表示轻度污染,红灯亮,表示重度污染。
  5. 本系统设置有4个按键,除1个为复位按键外,其他三个按键用来设定浓度报警值的,分别为减键、加键、设置键,设定的参数具有掉电保存,保存在STC单片机的内部,上电无需重新设置。

软件设计

主程序源码

/************************************************
** 函数名称 : void main(void)
** 函数功能 : 主函数
** 输    入 : 无
** 输    出 : 无
** 说    明 :
************************************************/
void main(void)
{
    double PM,pm1,pm2;
    int PMVAL=0,HPM=200,PM_count=0,pm1_count=0;
    uchar T1_data=0,R1_data=0,T2_data=0,R2_data=0;//温度、湿度变量
    uchar shezhi_flag=1,Mode_flag=1,n=1;//设置变量
    uchar bueezr_flag=0,count=0,buzzer_time=9;//蜂鸣器报警变量
    uint Mode_count=0; 
    uchar disp[16]  ={"PM2.5:0000ug/m3 "};
    uchar disp1[16]= {"T :00C    RH:00%"}; 
    uchar Tx_Buf[15];
     InitUART();            //初始化串口                                      
    LCD_Init();
    WriteChar(1,0,16,disp); //在第一行显示‘内容’
    WriteChar(2,0,16,disp1); //在第二行显示‘内容’
    while(1)
    {
        
        T1_data=Read_TRH(0,0);//温度
        disp1[3]=T1_data/10+0x30;//十位
        disp1[4]=T1_data%10+0x30;//个位

        R1_data=Read_TRH(1,0);//湿度
        disp1[13]=R1_data/10+0x30;//十位
        disp1[14]=R1_data%10+0x30;//个位
                                      
        pm1+=read_data(1);
        if(++PM_count>=20)
        {
              PM_count=0;
               pm1=pm1/20;
            pm2+=pm1;
            pm1=0;
            if(++pm1_count>=5)
            {
                pm1_count=0;
                PM=pm2/5;
                PM=PM*50/255;
                PM-=4;
                PM/=5;
                PM*=1000;
                PMVAL=PM;
                PMVAL+=235;    PMVAL=PMVAL/9;
                if(PMVAL>=9999)PMVAL=9999;
                WriteCOMDATA(0x86,0);
                if(PMVAL<0)//PMVAL=0;
                {WriteCOMDATA(0+0x30,1);PMVAL=abs(PMVAL);}
                else 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;
            }
        }

        /*调用报警函数,温湿度是否在设定范围内*/
        //温度值与报警值比较
        if(T1_data<T1L)
        {
            bueezr_flag=1;//报警标志位置1
        }
        else if(T1_data>T1H)
        {
            bueezr_flag=1;//报警标志位置1
        } 
        //湿度值与报警值比较
        if(R1_data<R1L)
        {
            bueezr_flag=1;//报警标志位置1
        }
        else if(R1_data>R1H)
        {
            bueezr_flag=1;//报警标志位置1
        }
        //PM值与报警值比较
        if(PMVAL>HPM)
        {    
            bueezr_flag=1;
        } 
        if(T1_data>T1L&&T1_data<T1H  && R1_data>R1L&&R1_data<R1H  &&  PMVAL<HPM) 
        {
            bueezr_flag=0;
            BUZZER=1;
        }
        /*******蜂鸣器报警********/
        count++;if(count>buzzer_time*10)count=buzzer_time+1;
        if(count%buzzer_time==0 && bueezr_flag)
        {
            BUZZER=~BUZZER;//蜂鸣器取反  发出声音提示
        }
        
        /*******Mode键设置报警参数********/ 
        if(Mode==0 && Mode_flag)
        {     
            WriteCOMDATA(0x0F,0);//LCD显示光标
            Delay(100);
            if(Mode==0)
            {
                BUZZER=1;
                bueezr_flag=0;

                Mode_flag=0;
                shezhi_flag=1;
                n=1;
                while(1)          
                {                                                    
                        key();
                        if(Mode_count>6)
                        {
                            Mode_count=0;shezhi_flag=0;
                            //当下限值大于上限值时,蜂鸣器鸣叫1S提示,参数设置有误
                            if(T1L>T1H || R1L>R1H)
                            {
                                BUZZER=0;Delay(1000);BUZZER=1;
                            }
                            //否则退出设置页面,返回主页面
                            else 
                            {        

                                WriteCOMDATA(0x0C,0);//关闭LCD光标
                                Delay(10);
                                n=0;
                                break;                        
                            }
                        }
                        else Mode_count=0; 
                        shezhi_flag++;
                        if(shezhi_flag>5)shezhi_flag=1;
                        if(shezhi_flag==1 || shezhi_flag==5)n=1;
        pm1+=read_data(1);
        if(++PM_count>=20)
        {
              PM_count=0;
               pm1=pm1/20;
            pm2+=pm1;
            pm1=0;
            if(++pm1_count>=15)
            {
                pm1_count=0;
                PM=pm2/15;
                PM=PM*50/255;
                PM-=4;
                PM/=5;
                PM*=1000;
                PMVAL=PM;
                PMVAL-=480;    PMVAL=PMVAL/3;
                if(PMVAL>=9999)PMVAL=9999;
                PM=pm1=pm2=0;
            }
        }        
                    }
                }    
            }
        }        
        /********LCD1602显示********/                        
        //WriteChar(1,0,16,disp); //在第一行显示‘内容’
        WriteChar(2,0,16,disp1); //在第二行显示‘内容’
    }
}

资料链接:https://pan.baidu.com/s/14RIZnbpPCpjv4huWUyPMaw?pwd=6zbd 
提取码:6zbd

猜你喜欢

转载自blog.csdn.net/m0_60790717/article/details/127821748