文章目录
- 一、功能简介
- 二、软件设计
- 三、实验现象
- 联系作者
一、功能简介
本项目使用Proteus8仿真51单片机控制器,使用报警模块、LCD1602液晶模块、按键模块、人体红外传感器、HCSR04超声波、有害气体传感器、SG90舵机等。
主要功能:
系统运行后,LCD1602显示超声波检测距离和传感器采集有害气体浓度值极其阈值。
当感应到有人时,桶盖舵机开启,此时系统检测垃圾高度是否超限,如果超限,则开启压缩机打包,完成后蜂鸣器报警提示。当人离开,桶盖舵机关闭。如果有害气体浓度超限,蜂鸣器报警。
可通过按键K3进入阈值设置模式,K1和K2调节数据,K4确定。
二、软件设计
/*
作者:嗨小易(QQ:3443792007)
*/
//系统数据获取
void sys_data_get(void)
{
while(1)
{
//获取距离
sys_ctrl.dis=ultrasonicwave_measure();
//获取有害气体浓度
sys_ctrl.gas=pcf8591_read_adcvalue(0);
sys_ctrl.gas=cal_map(sys_ctrl.gas,0,255,0,99);
//检测有无人
if(IRED==0)sys_ctrl.man=1;
else sys_ctrl.man=0;
break;
}
}
//系统数据显示
void sys_data_show(void)
{
while(1)
{
//距离显示
lcd1602_show_nums(4,0,sys_ctrl.dis,3,0);
//气体浓度显示
lcd1602_show_nums(4,1,sys_ctrl.gas,2,0);
//有无人状态显示
if(sys_ctrl.man==1)lcd1602_show_string(8,1,"Y");
else lcd1602_show_string(8,1,"N");
//距离阈值显示
lcd1602_show_nums(13,0,sys_ctrl.dish,3,0);
//气体阈值显示
lcd1602_show_nums(13,1,sys_ctrl.gash,2,0);
//阈值闪烁指示
switch(sys_ctrl.mode)
{
case 1://距离
lcd1602_show_string(13,0," ");
delay_ms(50);
lcd1602_show_nums(13,0,sys_ctrl.dish,3,0);
break;
case 2://气体
lcd1602_show_string(13,1," ");
delay_ms(50);
lcd1602_show_nums(13,1,sys_ctrl.gash,2,0);
break;
}
break;
}
}
//系统数据设置
void sys_data_set(void)
{
u8 key=0;
key=key_scan(0);
//设置
if(key==KEY3_PRESS)
{
sys_ctrl.mode++;
if(sys_ctrl.mode>2)sys_ctrl.mode=1;
}
//阈值设置模式
if(sys_ctrl.mode!=0)
{
//加
if(key==KEY1_PRESS)
{
switch(sys_ctrl.mode)
{
case 1://距离
sys_ctrl.dish++;
if(sys_ctrl.dish>500)sys_ctrl.dish=0;
break;
case 2://气体
sys_ctrl.gash++;
if(sys_ctrl.gash>99)sys_ctrl.gash=0;
break;
}
}
//减
else if(key==KEY2_PRESS)
{
switch(sys_ctrl.mode)
{
case 1://距离
sys_ctrl.dish--;
if(sys_ctrl.dish<0)sys_ctrl.dish=500;
break;
case 2://气体
sys_ctrl.gash--;
if(sys_ctrl.gash<0)sys_ctrl.gash=99;
break;
}
}
//确定
else if(key==KEY4_PRESS)
{
sys_ctrl.mode=0;
}
}
}
//系统功能控制
void sys_fun_ctrl(void)
{
static u8 oneflag=0;
//如果红外检测到有人
if(sys_ctrl.man==1)
{
//打开桶盖舵机
steer_control(2);
//如果垃圾高度到达阈值,开启打包
if(sys_ctrl.dis>sys_ctrl.dish)
{
if(oneflag==0)//压缩机启动一次
{
oneflag=1;
_dc_motor_zturn();
delay_ms(1000);
_dc_motor_stop();
beep_alarm(100,2000);
}
}
else oneflag=0;
}
//如果红外未检测到有人
else
{
//关闭桶盖舵机
steer_control(0);
}
//如果有害气体浓度高于阈值,报警
if(sys_ctrl.gas>sys_ctrl.gash)beep_alarm(10,1000);
}
三、实验现象
B站演示视频:https://space.bilibili.com/444388619
联系作者
视频地址:https://space.bilibili.com/444388619/video
专注于51单片机、STM32、国产32、DSP、Proteus、arduino、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。