【Proteus仿真】【STM32单片机】智能阳台控制系统
文章目录
- 一、功能简介
- 二、软件设计
- 三、实验现象
- 联系作者
一、功能简介
本项目使用Proteus8仿真STM32单片机控制器,使用按键、LCD1604液晶、DHT11温湿度模块、PCF8591 ADC、光线传感器、PM2.5传感器、土壤湿度传感器、继电器、水泵、电灯、28BYJ48步进电机等。
主要功能:
系统运行后,LCD1604显示环境温湿度、光线、风速、PM2.5、土壤湿度,
窗帘和窗户开关状态;
若按下K4键可切换自动/手动模式,手动模式下,K1控制窗帘开关;
K2控制窗户开关;K5控制电灯开关;K6控制水泵开关;
在自动模式下,若按下K3键进入阈值设置模式,K3选择参数,
可通过K1和K2调节阈值,当设定好后按下K4键确定并退出设置界面;
如果光线太亮或者晚上,关闭窗帘;
如果晚上,检测有人,打开电灯,人离开关闭电灯;
如果PM2.5检测超限,关闭窗户,否则打开窗户;
如果土壤湿度高于上限,关闭水泵;
如果土壤湿度低于下限,打开水泵;
二、软件设计
/*
作者:嗨小易(QQ技术交流群:570487280)
*/
//系统数据设置
void sys_data_set(void)
{
u8 key=0;
key=KEY_Scan(0);
//模式设置
if(key==KEY3_PRESS)
{
sys_ctrl.mode++;
if(sys_ctrl.mode>5)sys_ctrl.mode=1;
sys_parm_set_show();//系统参数设置界面显示
}
//设置模式
if(sys_ctrl.mode!=0)
{
//加
if(key==KEY1_PRESS)
{
switch(sys_ctrl.mode)
{
case 1://光线下
sys_ctrl.set_light[0]++;
if(sys_ctrl.set_light[0]>99)sys_ctrl.set_light[0]=0;
break;
case 2://光线上
sys_ctrl.set_light[1]++;
if(sys_ctrl.set_light[1]>99)sys_ctrl.set_light[1]=0;
break;
case 3://PM2.5
sys_ctrl.set_pm25++;
if(sys_ctrl.set_pm25>255)sys_ctrl.set_pm25=0;
break;
case 4://土壤湿度低
sys_ctrl.set_trhumi[0]++;
if(sys_ctrl.set_trhumi[0]>99)sys_ctrl.set_trhumi[0]=0;
break;
case 5://土壤湿度高
sys_ctrl.set_trhumi[1]++;
if(sys_ctrl.set_trhumi[1]>99)sys_ctrl.set_trhumi[1]=0;
break;
}
}
//减
else if(key==KEY2_PRESS)
{
switch(sys_ctrl.mode)
{
case 1://光线下
sys_ctrl.set_light[0]--;
if(sys_ctrl.set_light[0]<0)sys_ctrl.set_light[0]=99;
break;
case 2://光线上
sys_ctrl.set_light[1]--;
if(sys_ctrl.set_light[1]<0)sys_ctrl.set_light[1]=99;
break;
case 3://PM2.5
sys_ctrl.set_pm25--;
if(sys_ctrl.set_pm25<0)sys_ctrl.set_pm25=255;
break;
case 4://土壤湿度低
sys_ctrl.set_trhumi[0]--;
if(sys_ctrl.set_trhumi[0]<0)sys_ctrl.set_trhumi[0]=99;
break;
case 5://土壤湿度高
sys_ctrl.set_trhumi[1]--;
if(sys_ctrl.set_trhumi[1]<0)sys_ctrl.set_trhumi[1]=99;
break;
}
}
//确定
else if(key==KEY4_PRESS)
{
sys_ctrl.mode=0;
sys_open_show();//系统开机界面显示
}
}
//正常模式
else
{
//自动手动
if(key==KEY4_PRESS)
{
sys_ctrl.auto_flag=!sys_ctrl.auto_flag;
}
//手动模式
if(sys_ctrl.auto_flag==1)
{
//窗帘开关
if(key==KEY1_PRESS)
{
sys_ctrl.cl_flag=!sys_ctrl.cl_flag;
}
//窗户开关
else if(key==KEY2_PRESS)
{
sys_ctrl.ch_flag=!sys_ctrl.ch_flag;
}
//电灯开关
else if(key==KEY5_PRESS)
{
DD_PIN=!DD_PIN;
}
//水泵开关
else if(key==KEY6_PRESS)
{
SB_PIN=!SB_PIN;
}
}
}
}
//系统功能控制
void sys_fun_ctrl(void)
{
static u8 cl_oneflag=0;
static u8 ch_oneflag=0;
//自动模式
if(sys_ctrl.auto_flag==0)
{
//正常模式
if(sys_ctrl.mode==0)
{
//如果光线太亮或者晚上,关闭窗帘
if(sys_ctrl.light>sys_ctrl.set_light[1]
|| sys_ctrl.light<sys_ctrl.set_light[0])
{
sys_ctrl.cl_flag=0;
}
else
{
sys_ctrl.cl_flag=1;
}
//如果晚上,检测有人,打开电灯,人离开关闭电灯
//如果晚上
if(sys_ctrl.light<sys_ctrl.set_light[0])
{
//如果检测有人,打开电灯
if(sys_ctrl.man==1)
{
DD_PIN=0;
}
else DD_PIN=1;
}
else
{
DD_PIN=1;
}
//如果PM2.5检测超限,关闭窗户,否则打开窗户
if(sys_ctrl.pm25>sys_ctrl.set_pm25)
{
sys_ctrl.ch_flag=0;
LED_PIN=0;//指示灯打开
}
else
{
sys_ctrl.ch_flag=1;
LED_PIN=1;//指示灯关闭
}
//如果土壤湿度高于上限,关闭水泵
if(sys_ctrl.trhumi>sys_ctrl.set_trhumi[1])
{
SB_PIN=1;
}
//如果土壤湿度低于下限,打开水泵
else if(sys_ctrl.trhumi<sys_ctrl.set_trhumi[0])
{
SB_PIN=0;
}
}
}
//窗帘打开
if(sys_ctrl.cl_flag==1)
{
if(cl_oneflag==0)
{
step_motor_28BYJ48_send_pulse(4,cl_oneflag,STEPMOTOR_MAXSPEED,3,1);
cl_oneflag=1;
}
}
//窗帘关闭
else
{
if(cl_oneflag==1)
{
step_motor_28BYJ48_send_pulse(4,cl_oneflag,STEPMOTOR_MAXSPEED,3,1);
cl_oneflag=0;
}
}
//窗户打开
if(sys_ctrl.ch_flag==1)
{
if(ch_oneflag==0)
{
step_motor2_28BYJ48_send_pulse(4,ch_oneflag,STEPMOTOR_MAXSPEED,3,1);
ch_oneflag=1;
}
}
//窗户关闭
else
{
if(ch_oneflag==1)
{
step_motor2_28BYJ48_send_pulse(4,ch_oneflag,STEPMOTOR_MAXSPEED,3,1);
ch_oneflag=0;
}
}
}
//应用控制系统
void appdemo_show(void)
{
sys_parm_init();//系统参数初始化
KEY_Init();
DHT11_Init();
ctrl_pin_init();
pcf8591_init();
step_motor_gpio_init();
step_motor2_gpio_init();
lcd1604_init();//LCD1604初始化
sys_open_show();//系统初始界面显示
while(1)
{
sys_data_get();//系统数据获取
sys_data_show();//系统数据显示
sys_data_set();//系统数据设置
sys_fun_ctrl();//系统功能控制
}
}
三、实验现象
联系作者
专注于51单片机、STM32、国产32、DSP、Proteus、arduino、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。