【Proteus仿真】【51单片机】智能家居检测与控制系统
文章目录
- 一、功能简介
- 二、软件设计
- 三、实验现象
- 联系作者
一、功能简介
本项目使用Proteus8仿真51单片机控制器,使用按键、LCD1602液晶、DHT11温湿度模块、HC05/06蓝牙、人体红外传感器、继电器、加湿器、空调制冷制热、热水器等。
主要功能:
系统运行后,LCD1602显示检测温度和湿度、系统模式、安防状态、有无人、时间;
系统处于自动模式,可按下K5键打开安防,如果检测有人,蜂鸣器报警;无人,报警取消;
可按下K3键进入阈值设置模式,K3切换参数和时间,K1和K2调节,K4键确定并返回主界面;
如果检测温度高于上限,打开空调制冷,如果低于下限,打开空调制热;
如果检测湿度高于上限,关闭加湿器,如果低于下限,打开加湿器;
如果热水器开启时间到达,热水器打开;如果热水器关闭时间到达,热水器关闭;
可按下K4键切换为手动模式,K1控制加湿器开关,K2控制空调开关,K5控制热水器开关;
可通过蓝牙发送检测温湿度数据,并控制加湿器、空调、热水器设备;
蓝牙控制指令如下:(十六进制)
0X01–>K1键功能
0X02–>K2键功能
0X03–>K3键功能
0X04–>K4键功能
0X05–>K5键功能
二、软件设计
/*
作者:嗨小易(QQ技术交流群:570487280)
*/
//系统数据设置
void sys_data_set(void)
{
u8 key=0;
key=key_scan(0);
//设置
if(key==KEY3_PRESS || UART_RX_BUF[0]==KEY3_CMD)
{
sys_ctrl.mode++;
if(sys_ctrl.mode>10)sys_ctrl.mode=1;
sys_parm_set_show();//系统参数设置界面显示
}
//设置模式
if(sys_ctrl.mode!=0)
{
//加
if(key==KEY1_PRESS || UART_RX_BUF[0]==KEY1_CMD)
{
switch(sys_ctrl.mode)
{
case 1://温度下
sys_ctrl.set_temp[0]++;
if(sys_ctrl.set_temp[0]>99)sys_ctrl.set_temp[0]=0;
break;
case 2://温度上
sys_ctrl.set_temp[1]++;
if(sys_ctrl.set_temp[1]>99)sys_ctrl.set_temp[1]=0;
break;
case 3://湿度下
sys_ctrl.set_humi[0]++;
if(sys_ctrl.set_humi[0]>99)sys_ctrl.set_humi[0]=0;
break;
case 4://湿度上
sys_ctrl.set_humi[1]++;
if(sys_ctrl.set_humi[1]>99)sys_ctrl.set_humi[1]=0;
break;
case 5://开-时
sys_ctrl.set_time[0][0]++;
if(sys_ctrl.set_time[0][0]>23)sys_ctrl.set_time[0][0]=0;
break;
case 6://开-分
sys_ctrl.set_time[0][1]++;
if(sys_ctrl.set_time[0][1]>59)sys_ctrl.set_time[0][1]=0;
break;
case 7://开-秒
sys_ctrl.set_time[0][2]++;
if(sys_ctrl.set_time[0][2]>59)sys_ctrl.set_time[0][2]=0;
break;
case 8://关-时
sys_ctrl.set_time[1][0]++;
if(sys_ctrl.set_time[1][0]>23)sys_ctrl.set_time[1][0]=0;
break;
case 9://关-分
sys_ctrl.set_time[1][1]++;
if(sys_ctrl.set_time[1][1]>59)sys_ctrl.set_time[1][1]=0;
break;
case 10://关-秒
sys_ctrl.set_time[1][2]++;
if(sys_ctrl.set_time[1][2]>59)sys_ctrl.set_time[1][2]=0;
break;
}
}
//减
else if(key==KEY2_PRESS || UART_RX_BUF[0]==KEY2_CMD)
{
switch(sys_ctrl.mode)
{
case 1://温度下
sys_ctrl.set_temp[0]--;
if(sys_ctrl.set_temp[0]<0)sys_ctrl.set_temp[0]=99;
break;
case 2://温度上
sys_ctrl.set_temp[1]--;
if(sys_ctrl.set_temp[1]<0)sys_ctrl.set_temp[1]=99;
break;
case 3://湿度下
sys_ctrl.set_humi[0]--;
if(sys_ctrl.set_humi[0]<0)sys_ctrl.set_humi[0]=99;
break;
case 4://湿度上
sys_ctrl.set_humi[1]--;
if(sys_ctrl.set_humi[1]<0)sys_ctrl.set_humi[1]=99;
break;
case 5://开-时
sys_ctrl.set_time[0][0]--;
if(sys_ctrl.set_time[0][0]<0)sys_ctrl.set_time[0][0]=23;
break;
case 6://开-分
sys_ctrl.set_time[0][1]--;
if(sys_ctrl.set_time[0][1]<0)sys_ctrl.set_time[0][1]=59;
break;
case 7://开-秒
sys_ctrl.set_time[0][2]--;
if(sys_ctrl.set_time[0][2]<0)sys_ctrl.set_time[0][2]=59;
break;
case 8://关-时
sys_ctrl.set_time[1][0]--;
if(sys_ctrl.set_time[1][0]<0)sys_ctrl.set_time[1][0]=23;
break;
case 9://关-分
sys_ctrl.set_time[1][1]--;
if(sys_ctrl.set_time[1][1]<0)sys_ctrl.set_time[1][1]=59;
break;
case 10://关-秒
sys_ctrl.set_time[1][2]--;
if(sys_ctrl.set_time[1][2]<0)sys_ctrl.set_time[1][2]=59;
break;
}
}
//确定
else if(key==KEY4_PRESS || UART_RX_BUF[0]==KEY4_CMD)
{
sys_ctrl.mode=0;
sys_open_show();//系统开机界面显示
}
}
//正常模式
else
{
//自动手动模式
if(key==KEY4_PRESS || UART_RX_BUF[0]==KEY4_CMD)
{
sys_ctrl.auto_flag=!sys_ctrl.auto_flag;
}
//安防
else if(key==KEY5_PRESS || UART_RX_BUF[0]==KEY5_CMD)
{
sys_ctrl.af_onoff=!sys_ctrl.af_onoff;
}
//手动模式
if(sys_ctrl.auto_flag==1)
{
//加湿
if(key==KEY1_PRESS || UART_RX_BUF[0]==KEY1_CMD)
{
sys_ctrl.js_onoff=!sys_ctrl.js_onoff;
}
//空调
else if(key==KEY2_PRESS || UART_RX_BUF[0]==KEY2_CMD)
{
sys_ctrl.kt_onoff++;
if(sys_ctrl.kt_onoff>2)sys_ctrl.kt_onoff=0;
}
//热水器
else if(key==KEY5_PRESS || UART_RX_BUF[0]==KEY5_CMD)
{
sys_ctrl.rsq_onoff=!sys_ctrl.rsq_onoff;
}
}
}
if(UART_RX_BUF[0]!=0)UART_RX_BUF[0]=0;
}
//系统功能控制
void sys_fun_ctrl(void)
{
//正常模式
if(sys_ctrl.mode==0)
{
//自动模式
if(sys_ctrl.auto_flag==0)
{
//如果温度高于上限,打开空调制冷
if(sys_ctrl.temp>sys_ctrl.set_temp[1])sys_ctrl.kt_onoff=1;
//如果温度低于下限,打开空调制热
else if(sys_ctrl.temp<sys_ctrl.set_temp[0])sys_ctrl.kt_onoff=2;
else sys_ctrl.kt_onoff=0;
//如果湿度高于上限,关闭加湿器
if(sys_ctrl.humi>sys_ctrl.set_humi[1])sys_ctrl.js_onoff=0;
//如果湿度低于下限,打开加湿器
else if(sys_ctrl.humi<sys_ctrl.set_humi[0])sys_ctrl.js_onoff=1;
//如果热水器开启时间到达
if(sys_ctrl.time[0]==sys_ctrl.set_time[0][0] &&
sys_ctrl.time[1]==sys_ctrl.set_time[0][1] &&
sys_ctrl.time[2]==sys_ctrl.set_time[0][2])
{
sys_ctrl.rsq_onoff=1;
}
//如果热水器关闭时间到达
if(sys_ctrl.time[0]==sys_ctrl.set_time[1][0] &&
sys_ctrl.time[1]==sys_ctrl.set_time[1][1] &&
sys_ctrl.time[2]==sys_ctrl.set_time[1][2])
{
sys_ctrl.rsq_onoff=0;
}
}
//如果安防开启,检测有人,报警
if(sys_ctrl.af_onoff==1)
{
if(sys_ctrl.man==1)beep_alarm(10,1000);//报警
}
//设备控制
if(sys_ctrl.js_onoff==0)JS_PIN=1;
else JS_PIN=0;
if(sys_ctrl.rsq_onoff==0)RSQ_PIN=1;
else RSQ_PIN=0;
if(sys_ctrl.kt_onoff==0){ZL_PIN=1;ZR_PIN=1;}
else if(sys_ctrl.kt_onoff==1){ZL_PIN=0;ZR_PIN=1;}
else if(sys_ctrl.kt_onoff==2){ZL_PIN=1;ZR_PIN=0;}
}
}
//应用控制系统
void appdemo_show(void)
{
u8 i=10;
sys_parm_init();//系统参数初始化
lcd1602_init();
DHT11_Init();
time0_init();//定时器初始化,10ms
TR0=1;//打开定时器
UART_Init();//波特率4800
UART_SendString("UART Init OK\r\n");
sys_open_show();//系统开机界面显示
while(1)
{
sys_data_get();//系统数据获取
sys_data_show();//系统数据显示
sys_data_set();//系统数据设置
sys_fun_ctrl();//系统功能控制
}
}
//定时器0中断函数
void time0() interrupt 1
{
static u8 i=0;
TH0=0XDC; //给定时器赋初值,定时10ms
TL0=0X00;
i++;
if(i>=100)//1S
{
i=0;
sys_ctrl.time[2]++;
if(sys_ctrl.time[2]>59)
{
sys_ctrl.time[2]=0;
sys_ctrl.time[1]++;
if(sys_ctrl.time[1]>59)
{
sys_ctrl.time[1]=0;
sys_ctrl.time[0]++;
if(sys_ctrl.time[0]>23)sys_ctrl.time[0]=0;
}
}
}
}
三、实验现象
B站演示视频:https://space.bilibili.com/444388619
联系作者
视频地址:https://space.bilibili.com/444388619/video
专注于51单片机、STM32、国产32、DSP、Proteus、arduino、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。