【Proteus仿真】【Arduino单片机】智能窗户设计

文章目录


一、功能简介

本项目使用Proteus8仿真Arduino单片机控制器,使用蜂鸣器模块、LCD1602显示模块、雨滴传感器、风速传感器、人体红外模块、ADC模块、按键模块、28BYJ48步进电机

模块、DS18B20温度传感器等。

主要功能:

系统运行后,LCD1602显示温度、湿度、风速检测值;

可通过按键K3进入阈值设置界面,默认进入温度下限设置模式;再次按下K3键,切换至温度上限设置;再次按下K3键,切换至风速阈值设置,再次按下K3键切换至湿度阈值设置,如此循环;然后K1和K2键用于调节阈值,设置好后按下K4键保存并返回主界面。在主界面,K1键用于系统布防设置,K2键用于系统撤防,布防后,若检测到有人则蜂鸣器报警,并且窗户关闭。若检测没有人,则报警取消,如果检测到下雨或大风时,窗户关闭;正常天气时,如果温度高于上限,开窗;

如果温度低于下限,关窗;温度在阈值范围内,开窗。当系统布防取消时,报警系统关闭,窗户开启。


二、软件设计

c 复制代码
/*
作者:嗨小易(技术QQ群:570487280)

*/


//系统数据显示
void sys_data_show(void)
{
	while(1)
	{
		//未进入设置模式
		if(sys_ctrl.mode==0)
		{
			//温度显示
			lcd1602_show_nums(3,0,sys_ctrl.temp,2,0);
			//风速值显示
			lcd1602_show_nums(10,0,sys_ctrl.wind,2,0);
			//湿度值显示
			lcd1602_show_nums(3,1,sys_ctrl.humi,2,0);

			//窗户状态
			if(sys_ctrl.window==1)lcd1602_show_string(7,1," Open");
			else lcd1602_show_string(7,1,"Close");
			
			//布防显示		
			if(sys_ctrl.fortify==1)lcd1602_show_string(14,0,"BF");
			else lcd1602_show_string(14,0,"CF");
			//有人显示
			if(sys_ctrl.man==1)lcd1602_show_string(13,1,"Yes");
			else lcd1602_show_string(13,1," No");	
		}
		//进入设置模式
		else
		{
			//温度下限显示
			lcd1602_show_nums(3,0,sys_ctrl.templ,2,0);
			//温度上限显示
			lcd1602_show_nums(6,0,sys_ctrl.temph,2,0);
			//风速上限显示
			lcd1602_show_nums(3,1,sys_ctrl.windh,2,0);
			//湿度上限显示
			lcd1602_show_nums(11,1,sys_ctrl.humih,2,0);
			
			//设置阈值位置闪烁
			switch(sys_ctrl.mode)
			{
				case 1://温度下限 
					lcd1602_show_string(3,0,"  ");
					delay_ms(50);
					//温度下限显示
					lcd1602_show_nums(3,0,sys_ctrl.templ,2,0);
					break;
				case 2://温度上限 
					lcd1602_show_string(6,0,"  ");
					delay_ms(50);
					//温度上限显示
					lcd1602_show_nums(6,0,sys_ctrl.temph,2,0);
					break;
				case 3://风速上限 
					lcd1602_show_string(3,1,"  ");
					delay_ms(50);
					//风速上限显示
					lcd1602_show_nums(3,1,sys_ctrl.windh,2,0);
					break;
				case 4://湿度上限 
					lcd1602_show_string(11,1,"  ");
					delay_ms(50);
					//湿度上限显示
					lcd1602_show_nums(11,1,sys_ctrl.humih,2,0);
					break;
			}		
		}

		break;				
	}
}

//系统参数设定
void sys_data_set(void)
{
	u8 key=0;
  static u8 one_flag=0;

	key=key_scan(0);
	
  //模式设置
	if(key==KEY3_PRESS)
	{
		sys_ctrl.mode++;
		if(sys_ctrl.mode>4)sys_ctrl.mode=1;
		//设置界面仅显示1次
		if(one_flag==0)
		{
			one_flag=1;
			_set_parm_show();//阈值参数设置界面显示
		}
	}
	//加&布防
	else if(key==KEY1_PRESS)
	{
		//阈值设置模式
		if(sys_ctrl.mode!=0)
		{
			switch(sys_ctrl.mode)
			{
				case 1://温度下限
					sys_ctrl.templ++;
					if(sys_ctrl.templ>99)sys_ctrl.templ=0;
					break;
				case 2://温度上限
					sys_ctrl.temph++;
					if(sys_ctrl.temph>99)sys_ctrl.temph=0;
					break;
				case 3://风速上限
					sys_ctrl.windh++;
					if(sys_ctrl.windh>99)sys_ctrl.windh=0;
					break;
				case 4://湿度上限
					sys_ctrl.humih++;
					if(sys_ctrl.humih>99)sys_ctrl.humih=0;
					break;	
			}		
		}
		//正常模式
		else
		{
			sys_ctrl.fortify=1;//布防
		}		
	}
	//减&撤防
	else if(key==KEY2_PRESS)
	{
		//阈值设置模式
		if(sys_ctrl.mode!=0)
		{
			switch(sys_ctrl.mode)
			{
				case 1://温度下限
					sys_ctrl.templ--;
					if(sys_ctrl.templ<0)sys_ctrl.templ=0;
					break;
				case 2://温度上限
					sys_ctrl.temph--;
					if(sys_ctrl.temph<0)sys_ctrl.temph=99;
					break;
				case 3://风速上限
					sys_ctrl.windh--;
					if(sys_ctrl.windh<0)sys_ctrl.windh=99;
					break;
				case 4://湿度上限
					sys_ctrl.humih--;
					if(sys_ctrl.humih<0)sys_ctrl.humih=99;
					break;	
			}		
		}
		//正常模式
		else
		{
			sys_ctrl.fortify=0;//撤防
		}		
	}
	//确定
	else if(key==KEY4_PRESS)
	{
		one_flag=0;	
		sys_ctrl.mode=0;
		sys_open_show();//系统开机界面显示
	}
}

//系统功能控制
void sys_fun_ctrl(void)
{
	//正常模式下
	if(sys_ctrl.mode==0)
	{
		//已开启布防
		if(sys_ctrl.fortify==1)
		{
			//检测到有人,蜂鸣器报警
			if(sys_ctrl.man==1)
			{
				beep_alarm(1,20000);
				//已开启过窗户,关闭
				if(sys_ctrl.window==1)
				{
					sys_ctrl.window=0;//关闭窗户
					step_motor_28BYJ48_send_pulse(8,sys_ctrl.window,STEPMOTOR_MAXSPEED,3,1);	
				}
			}
			//检测到无人,报警取消
			else
			{
				//如果下雨或大风天气
				if(sys_ctrl.humi>sys_ctrl.humih || sys_ctrl.wind>sys_ctrl.windh)
				{
					//已开启过窗户,关闭
					if(sys_ctrl.window==1)
					{
						sys_ctrl.window=0;//关闭窗户
						step_motor_28BYJ48_send_pulse(8,sys_ctrl.window,STEPMOTOR_MAXSPEED,3,1);	
					}	
				}
				//正常气候
				else
				{
					//如果温度高于上限,开窗
					if(sys_ctrl.temp>sys_ctrl.temph)
					{
						//已关闭过窗户,打开
						if(sys_ctrl.window==0)
						{
							sys_ctrl.window=1;//打开窗户
							step_motor_28BYJ48_send_pulse(8,sys_ctrl.window,STEPMOTOR_MAXSPEED,3,1);	
						}		
					}
					//如果温度低于下限,关窗
					else if(sys_ctrl.temp<sys_ctrl.templ)
					{
						//已开启过窗户,关闭
						if(sys_ctrl.window==1)
						{
							sys_ctrl.window=0;//关闭窗户
							step_motor_28BYJ48_send_pulse(8,sys_ctrl.window,STEPMOTOR_MAXSPEED,3,1);	
						}		
					}
					//正常温度,开窗
					else
					{
						//已关闭过窗户,打开
						if(sys_ctrl.window==0)
						{
							sys_ctrl.window=1;//打开窗户
							step_motor_28BYJ48_send_pulse(8,sys_ctrl.window,STEPMOTOR_MAXSPEED,3,1);	
						}		
					}
				}	
			}	
		}
		//布防取消,报警取消
		else
		{
			//已关闭过窗户,打开
			if(sys_ctrl.window==0)
			{
				sys_ctrl.window=1;//打开窗户
				step_motor_28BYJ48_send_pulse(8,sys_ctrl.window,STEPMOTOR_MAXSPEED,3,1);	
			}	
		}	
	}
}

三、实验现象

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



联系作者

视频地址:https://space.bilibili.com/444388619/video

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

相关推荐
SundayBear6 小时前
零基础入门MQTT协议
c语言·单片机
嗯嗯=6 小时前
STM32单片机学习篇9
stm32·单片机·学习
松涛和鸣11 小时前
DAY63 IMX6ULL ADC Driver Development
linux·运维·arm开发·单片机·嵌入式硬件·ubuntu
想放学的刺客14 小时前
单片机嵌入式试题(第23期)嵌入式系统电源管理策略设计、嵌入式系统通信协议栈实现要点两个全新主题。
c语言·stm32·单片机·嵌入式硬件·物联网
猫猫的小茶馆14 小时前
【Linux 驱动开发】五. 设备树
linux·arm开发·驱动开发·stm32·嵌入式硬件·mcu·硬件工程
jghhh0116 小时前
基于上海钜泉科技HT7017单相计量芯片的参考例程实现
科技·单片机·嵌入式硬件
恶魔泡泡糖16 小时前
51单片机外部中断
c语言·单片机·嵌入式硬件·51单片机
意法半导体STM3216 小时前
【官方原创】如何基于DevelopPackage开启安全启动(MP15x) LAT6036
javascript·stm32·单片机·嵌入式硬件·mcu·安全·stm32开发
v_for_van16 小时前
STM32低频函数信号发生器(四通道纯软件生成)
驱动开发·vscode·stm32·单片机·嵌入式硬件·mcu·硬件工程
电化学仪器白超17 小时前
③YT讨论
开发语言·python·单片机·嵌入式硬件