https://www.bilibili.com/video/BV16t4y1d7F3/?vd_source=6ff7cd03af95cd504b60511ef9373a1d
对应题目
1.家用燃气泄露自动报警器的设计
设计一种放在家庭室内燃气开关及燃气设备附近的报警器,可以自动检测空气中燃气密度,如有泄露引发报警,并关闭燃气阀门(需要电动燃气阀门)
2.家用智能换气系统的设计与实现
设计一种基于传感器和MCU的家用智能换气系统,能够实时检测室内外的空气质量情况和温湿度,并与空调和换气装置相连。从而实现室内空气质量和温湿度的稳定,稳定系数可以调节
作品主要功能
本设计由DHT11温湿度传感器+MQ-2烟雾传感器+PM2.5传感器+LCD1602显示屏组成。
- 可检测环境温度、烟雾浓度和PM2.5值并通过显示屏显示;
- 可通过按键设置报警值,当检测值超过报警值时进行报警,相应指示灯亮;
使用方法说明
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;
//
// }
//
//
//}