30.空气质量检测(温湿度+有害气体+PM2.5)--家用燃气泄漏自动报警器设计

发布时间:2024年01月10日

https://www.bilibili.com/video/BV16t4y1d7F3/?vd_source=6ff7cd03af95cd504b60511ef9373a1d

对应题目

1.家用燃气泄露自动报警器的设计

设计一种放在家庭室内燃气开关及燃气设备附近的报警器,可以自动检测空气中燃气密度,如有泄露引发报警,并关闭燃气阀门(需要电动燃气阀门)

2.家用智能换气系统的设计与实现

设计一种基于传感器和MCU的家用智能换气系统,能够实时检测室内外的空气质量情况和温湿度,并与空调和换气装置相连从而实现室内空气质量和温湿度的稳定,稳定系数可以调节

作品主要功能

本设计由DHT11温湿度传感器+MQ-2烟雾传感器+PM2.5传感器+LCD1602显示屏组成。

  1. 可检测环境温度、烟雾浓度和PM2.5值并通过显示屏显示;
  2. 可通过按键设置报警值,当检测值超过报警值时进行报警,相应指示灯亮;

使用方法说明

1、首先插上电源线,按下电源开关。

2、初始化介绍之后,显示屏显示当前温湿度和有害气体浓度和PM2.5值。

3、通过设置报警,按下设置按键,进入设置温度报警值状态,按加键可增加报警,按减键可减小报警值;再按设置键,进入设置湿度报警值状态;再按加、减键进行调节,同理再设置烟雾浓度和PM2.5报警值,最后再按下设置键回到正常状态。

4、按下取消/打开报警键,可关闭或打开蜂鸣器报警的功能

实物图

设计原理图

Proteus仿真图

设置界面

程序源码

主程序源码

void main()
{  	  
   U16 len;
   U8 m;

  //Init_Timer0();	//定时器初始化
   
  InitLcd1602();     //初始化液晶
  LcdShowStr(0, 0,"T:  C");
  LcdShowStr(0, 1,"H:  %RH");
  LcdShowStr(6, 0,"P:   ug/m3");
  LcdShowStr(8, 1,"C:   ppm");
  while(1)
 {
   Key_set_scan();//按键扫描
 if(moshi == 0)	  //设置模式切换
 {

   RH();    //调用温湿度读取子程序
   WSDXS(); //温湿度显示
     for(m=0;m<50;m++)
	{
		Value1 = adc0832(0); //PM2.5检测
		Delay_Ms(1);
		sum=sum+Value1;
	}
	Value1=sum/50;
	sum=0; 
   Value1 =  Value1*(float)(Value1/5);//浓度校准
   if(Value1>999)Value1=999;
   len = IntToString(str_pm,Value1); //转换成字符串

    while (len < 3)                  //用空格补齐到3个字符长度
    {
        str_pm[len++] = ' ';
    }
     str_pm[len] = '\0';              //添加字符串结束符

   LcdShowStr(8, 0, str_pm); //烟雾浓度显示到液晶屏上  
  
	Value2 =  adc0832(1);   //CO检测
    Value2 =  (float)(Value2*1.5);//浓度校准
    len = IntToString(str_co,Value2); //转换成字符串
    while (len < 3)               //用空格补齐到3个字符长度
    {
        str_co[len++] = ' ';
    }
     str_co[len] = '\0';              //添加字符串结束符
 
   LcdShowStr(10, 1, str_co); //烟雾浓度显示到液晶屏上  
	
	if(qx_flag == 1)
   {
   if((U8T_data_H>T_baojing)||(U8RH_data_H>H_baojing)||(Value1>=P_baojing)||(Value2>=C_baojing)) BUZZER = 0; else BUZZER = 1;
   }
   else BUZZER = 1;
   if(U8T_data_H>T_baojing)  LED_T = 0;   else  LED_T = 1;	
   if(U8RH_data_H>H_baojing) LED_H = 0;   else  LED_H = 1;  
   if(Value1>=P_baojing)     LED_P = 0;   else  LED_P = 1;	
   if(Value2>=C_baojing)     LED_C = 0;   else  LED_C = 1;	
  }
   else if(moshi == 1)	//设置温度上限模式
   {	
   T_buff[0] = T_baojing/10+0x30;
   T_buff[1] = T_baojing%10+0x30;
   T_buff[2] = '\0';
   LcdShowStr(6, 1,T_buff);
   }
   else if(moshi == 2)	  //设置湿度上限模式
   {
   H_buff[0] = H_baojing/10+0x30;
   H_buff[1] = H_baojing%10+0x30;
   H_buff[2] = '\0';
   LcdShowStr(6, 1,H_buff);
   }
   else if(moshi == 3)	 //设置PM2.5浓度上限模式
   {
   P_buff[0] = P_baojing/100+0x30;
   P_buff[1] = P_baojing%100/10+0x30;
   P_buff[2] = P_baojing%10+0x30;
   P_buff[3] = '\0';
   LcdShowStr(6, 1,P_buff);
   }
   else if(moshi == 4)	 //设置CO浓度上限模式
   {
   C_buff[0] = C_baojing/100+0x30;
   C_buff[1] = C_baojing%100/10+0x30;
   C_buff[2] = C_baojing%10+0x30;
   C_buff[3] = '\0';
   LcdShowStr(6, 1,C_buff);
   }
				                                                                           
 }
}
/* 整型数转换为字符串,str-字符串指针,dat-待转换数,返回值-字符串长度 */
unsigned char IntToString(unsigned char *str, int dat)
{
    signed char i = 0;
    unsigned char len = 0;
    unsigned char buf[6];
    
    if (dat < 0)  //如果为负数,首先
	
    {
        dat = -dat;
        *str++ = '-';
        len++;
    }
    do {          //先转换为低位在前的十进制数组
        buf[i++] = dat % 10;
        dat /= 10;
    } while (dat > 0);
    len += i;     //i最后的值就是有效字符的个数
    while (i-- > 0)   //将数组值转换为ASCII码反向拷贝到接收指针上
    {
        *str++ = buf[i] + '0';
    }

    *str = '\0';  //添加字符串结束符
    
    return len;   //返回字符串长度
}
/*------------------------------------------------
    定时器中断子程序(定时1ms)
------------------------------------------------*/
//void Timer0_isr(void) interrupt 1 
//{
//   static unsigned int j;
//   TH0=(65536-10000)/256;	 //重新赋值 10ms
//   TL0=(65536-10000)%256;
//    
//    j++;   
//	if(j>=10)
//   {
//     j = 0;
//	
//    } 
//	
//	 
//}

文章来源:https://blog.csdn.net/heilong99/article/details/135445823
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。