当前位置: 首页 > news >正文

【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设计,视频分享,技术交流。

相关文章:

  • 利用PHP爬虫根据关键词获取17网(17zwd)商品列表:实战指南
  • 【记录】高性能服务器运行DeepSeek
  • JavaScript(最后一个元素的索引就是数组的长度减 1)array.length - 1
  • 清华北大推出的 DeepSeek 教程(附 PDF 下载链接)
  • [傻瓜式教学]如何将MathType公式编辑器内嵌到WPS工具栏中
  • 刘火良 FreeRTOS内核实现与应用之1——列表学习
  • langchain系列(九)- LangGraph 子图详解
  • 从零开始实现大语言模型(十三):预训练大语言模型GPTModel
  • VUE_自定义指令,全局指令注册
  • LBE大空间文档
  • PostgreSQL 数据库专家可从事以的工作
  • 计算机基础:二进制基础06,用八进制来计数
  • 【Flink银行反欺诈系统设计方案】6.用户画像数据与反欺诈系统的关联思路
  • nature genetics | SCENT:单细胞多模态数据揭示组织特异性增强子基因图谱,并可识别致病等位基因
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_init_cycle 函数
  • 题解:AT_past202109_h 最短経路
  • 机器学习在地图制图学中的应用
  • c++ 重写基类成员函数
  • RSA的理解运用与Pycharm组装Cryptodome库
  • 案例1_3:流水灯
  • 淘宝如何在其他网站做优惠/网络营销软件下载
  • 韶关网站建设第一品牌/如何制作一个网页链接
  • 好商网的网站可以做中英文切换吗/网络营销师有前途吗
  • 做王境泽表情的网站/个人怎么做百度竞价
  • 常州网站建设开发/世界500强企业排名
  • 南京企业做网站/百度seo原理