【Proteus仿真】【STM32单片机】基于单片机的智能晾衣架控制系统

文章目录

  • 一、功能简介
  • 二、软件设计
  • 三、实验现象
  • 联系作者


一、功能简介

系统运行后,LCD1604显示传感器检测的温湿度、光线强度和风速,工作模式,以及相应阈值,系统工作状态等;系统默认为自动模式,
可通过K4键切换为手动模式,此时可通过K1键来控制晾衣架的开和关;
若系统处于自动模式时,可通过K3键进入阈值设置模式,K1和K2键调节各阈值参数,K4确定保存。
如果检测光线强度低于阈值,光线暗,晚上或阴雨天,此时晾衣架关闭;
如果检测光线强度高于阈值,光线强,白天,此时如果下雨或大风,关闭晾衣架,否则如果温度高于阈值且湿度低于阈值,代表晴天,打开晾衣架;
如果湿度高于阈值,则关闭晾衣架;
手动模式下,可通过串口远程控制,发送十六进制0X11指令实现开关控制;


二、软件设计

/*
作者:嗨小易(QQ:3443792007)

*/



//系统数据设置
void sys_data_set(void)
{
	u8 key=0;
	
	key=KEY_Scan(0);
	//确定/自动手动
	if(key==KEY4_PRESS)
	{
		if(sys_ctrl.mode!=0)//确定
		{
			sys_ctrl.mode=0;
		}
		else//自动/手动 
		{
			sys_ctrl.auto_flag=!sys_ctrl.auto_flag;
		}
	}
	//自动模式
	if(sys_ctrl.auto_flag==0)
	{
		//阈值设置
		if(key==KEY3_PRESS)
		{
			sys_ctrl.mode++;
			if(sys_ctrl.mode>4)sys_ctrl.mode=1;
		}
		//加
		else if(key==KEY1_PRESS)
		{
			switch(sys_ctrl.mode)
			{
				case 1://温度
					sys_ctrl.temph++;
					if(sys_ctrl.temph>99)sys_ctrl.temph=0;
					break;
				case 2://湿度
					sys_ctrl.humil++;
					if(sys_ctrl.humil>99)sys_ctrl.humil=0;
					break;
				case 3://光线
					sys_ctrl.lightl++;
					if(sys_ctrl.lightl>99)sys_ctrl.lightl=0;
					break;
				case 4://风速
					sys_ctrl.windh++;
					if(sys_ctrl.windh>10)sys_ctrl.windh=1;
					break;
			}
		}
		//减
		else if(key==KEY2_PRESS)
		{
			switch(sys_ctrl.mode)
			{
				case 1://温度
					sys_ctrl.temph--;
					if(sys_ctrl.temph<0)sys_ctrl.temph=99;
					break;
				case 2://湿度
					sys_ctrl.humil--;
					if(sys_ctrl.humil<0)sys_ctrl.humil=99;
					break;
				case 3://光线
					sys_ctrl.lightl--;
					if(sys_ctrl.lightl<0)sys_ctrl.lightl=99;
					break;
				case 4://风速
					sys_ctrl.windh--;
					if(sys_ctrl.windh<0)sys_ctrl.windh=10;
					break;
			}
		}
	}
	//手动模式
	else
	{
		//开/关
		if(key==KEY1_PRESS || USART1_RX_BUF[0]==OPEN_CMD)
		{
			USART1_RX_BUF[0]=0;
			sys_ctrl.run=!sys_ctrl.run;
			if(sys_ctrl.run==1)//开
			{
				_dc_motor_zturn();
				delay_ms(500);
				_dc_motor_stop();
			}
			else//关
			{
				_dc_motor_fturn();
				delay_ms(500);
				_dc_motor_stop();
			}
		}
	}
}

//系统功能控制
void sys_fun_ctrl(void)
{
	//自动模式
	if(sys_ctrl.auto_flag==0)
	{
		//正常模式下
		if(sys_ctrl.mode==0)
		{
			//如果白天
			if(sys_ctrl.light>sys_ctrl.lightl)
			{
				//如果下雨或大风,关闭晾衣架
				if(sys_ctrl.rain==1 || sys_ctrl.wind>=sys_ctrl.windh)
				{
					//如果晾衣架已打开,关闭晾衣架
					if(sys_ctrl.run==1)
					{
						sys_ctrl.run=0;
						_dc_motor_fturn();
						beep_alarm(40,2000);
						delay_ms(500);
						_dc_motor_stop();
					}
				}
				//没有下雨或大风
				else 
				{
					//如果温度高于阈值
					if(sys_ctrl.temp>sys_ctrl.temph)
					{
						//如果湿度低于阈值
						if(sys_ctrl.humi<sys_ctrl.humil)
						{
							//如果晾衣架已关闭,打开晾衣架
							if(sys_ctrl.run==0)
							{
								sys_ctrl.run=1;
								_dc_motor_zturn();
								delay_ms(500);
								_dc_motor_stop();
							}
						}
						//如果湿度高于阈值
						else 
						{
							//如果晾衣架已打开,关闭晾衣架
							if(sys_ctrl.run==1)
							{
								sys_ctrl.run=0;
								_dc_motor_fturn();
								delay_ms(500);
								_dc_motor_stop();
							}
						}
					}
				}
			}
			//如果晚上
			else
			{
				//如果晾衣架打开则关闭
				if(sys_ctrl.run==1)
				{
					sys_ctrl.run=0;
					_dc_motor_fturn();
					delay_ms(500);
					_dc_motor_stop();
				}
			}
		}
	}
}

//应用控制系统
void appdemo_show(void)
{
	u8 i=5;
	sys_parm_init();//系统参数初始化
	KEY_Init();
	BEEP_Init();
	DHT11_Init();
	ctrl_pin_init();
	pcf8591_init();
	dc_motor_init();
	USART1_Init(9600);
	while(i--)
	{
		//读取DHT11温湿度值
		DHT11_Read_Data(&sys_ctrl.temp,&sys_ctrl.humi);
		delay_ms(100);
	}
	lcd1604_init();//LCD1604初始化
	sys_open_show();//系统初始界面显示

	while(1)
	{
		sys_data_get();//系统数据获取
		sys_data_show();//系统数据显示
		sys_data_set();//系统数据设置
		sys_fun_ctrl();//系统功能控制		
	}
}




三、实验现象

B站演示视频:https://space.bilibili.com/444388619

【Proteus仿真】【STM32单片机】基于单片机的智能晾衣架控制系统_第1张图片
【Proteus仿真】【STM32单片机】基于单片机的智能晾衣架控制系统_第2张图片
【Proteus仿真】【STM32单片机】基于单片机的智能晾衣架控制系统_第3张图片
【Proteus仿真】【STM32单片机】基于单片机的智能晾衣架控制系统_第4张图片


联系作者

专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

你可能感兴趣的:(单片机,proteus,stm32)