【单片机毕业设计】【mcuclub-dz-100】教室灯光控制

本文详细介绍了一个基于STM32F103C8T6单片机的教室灯光控制系统,包括光照、人体感应、人数统计、时间管理、按键控制和蓝牙远程控制等功能。系统通过光敏电阻、红外传感器和OLED显示屏实现智能化操作。
摘要由CSDN通过智能技术生成

一、基本介绍

项目名:基于单片机的教室灯光控制系统设计

项目名:教室灯光控制(实物)
项目编号:mcuclub-dz-100
单片机类型:STM32F103C8T6
具体功能:
1、通过光敏电阻检测光照值,当光照值小于设置最小值,则进行开灯,并能根据光照值自动调节亮度
2、设为A、B、C、D四个区域,每个区域2个灯。分别四个人体热释电传感器检测,检测到人对应的LED亮,人离开10s延时关闭。
3、通过两对红外计数传感器模拟前后门进行统计教室人数
4、通过内部RTC获取时间,并能通过按键修正时间
5、通过按键可设置光照最小值、教室座位总数、并可以手动控制四个区域灯的开关
6、通过OLED可以实时显示当前时间 、日期、光照度、教室人数、教室座位总数、剩余座位总数。
7、通过蓝牙模块,手机端可控制每个灯的开关,并显示灯的状态。

二、资料总览

实物资料

请添加图片描述

仿真资料

请添加图片描述

三、51单片机部分资料展示

1、实物图展示

单片机型号:STC89C52
供电接口:TYPE-C
板子类型:PCB集成板,厚度1.2,两层板(上下层覆铜接地)
器件类型:元器件基本上为插针式,个别降压芯片会使用贴片式。
在这里插入图片描述

3、原理图展示

软件版本:AD2013
电路连线方式:网络标号连线方式
注意:原理图只是画出了模块的引脚图,而并不是模块的内部结构图

在这里插入图片描述

4、PCB图展示

由原理图导出,中间有一个项目编号,隐藏在单片机底座下,插入单片机后不会看到。
两层板,上下覆铜接地。
在这里插入图片描述

四、系统框图

绘制软件:VISIO
在这里插入图片描述

本设计以单片机为核心控制器,加上其他模块一起组成此次设计的整个系统,其中包括中控部分、输入部分和输出部分。中控部分采用了单片机控制器,其主要作用是获取输入部分的数据,经过内部处理,逻辑判断,最终控制输出部分。输入由三部分组成,第一部分是光照检测模块,通过该模块检测当前环境的光照强度;第二部分是对射管计数模块,统计当前教室人数;第三部分是人体热释电红外感应模块,监测是否有人;第五部分是按键模块,通过该模块可以切换界面、设置阈值、切换模式等;第六部分是供电模块,通过该模块可给整个系统进行供电。输出由两部分组成,第一部分是显示模块,通过该模块可以显示监测的数据以及设置的阈值;第二部分是照明模块。除此之外,蓝牙模块既作为输入又作为输出,蓝牙模块和手机进行连接,可以将监测的数据传输到用户手机端,用户也可以通过手机端发送指令照明灯的工作及其模式的切换。具体系统框图如图3.1所示。

五、部分程序展示

软件版本:keil5
注意:逻辑程序和驱动程序分开,分布于main.c和其他.c文件

*******处理函数
*****/
void Manage_function(void)
{
if(flag_display == 0) //测量界面
{
if(HW_front_in == 1 && HW_front_out == 0)
flag_front_in = 1;
if(HW_front_in == 0 && flag_front_in == 1 && HW_front_out == 1) //红外进未触发且红外进标志位为1且红外出触发
{
flag_front_in = 2; //红外进标志位置2
flag_front_out = 1; //红外出标志位置1
}
if(HW_front_in == 0 && flag_front_in == 2 && HW_front_out == 0 && flag_front_out == 1) //红外进未触发且红外进标志位为2且红外出未触发且红外出标志位为1
{
number_people++; //人数+1
flag_front_out = 0; //清除红外出标志位
flag_front_in = 0; //清除红外进标志位
}

	if(HW_front_out == 1 && HW_front_in == 0)																	//红外出触发且红外进未触发
		flag_front_out = 1;																											//红外出标志位置1
	if(HW_front_out == 0 && flag_front_out == 1 && HW_front_in == 1)					//红外出未触发且红外出标志位为1且红外进触发
	{
		flag_front_out = 2;																											//红外出标志位置2
		flag_front_in = 1;																											//红外进标志位置1
	}
	if(HW_front_out == 0 && flag_front_out == 2 && HW_front_in == 0 && flag_front_in == 1)		//红外出未触发且红外出标志位为2且红外进未触发且红外进标志位为1
	{
		if(number_people > 0)
			number_people--;																											//人数-1
		flag_front_in = 0;																											//清除红外进标志位
		flag_front_out = 0;																											//清除红外出标志位
	}
	
	if(HW_after_in == 1 && HW_after_out == 0)
		flag_after_in = 1;
	if(HW_after_in == 0 && flag_after_in == 1 && HW_after_out == 1)						//红外进未触发且红外进标志位为1且红外出触发
	{
		flag_after_in = 2;																											//红外进标志位置2
		flag_after_out = 1;																											//红外出标志位置1
	}
	if(HW_after_in == 0 && flag_after_in == 2 && HW_after_out == 0 && flag_after_out == 1)		//红外进未触发且红外进标志位为2且红外出未触发且红外出标志位为1
	{
		number_people++;																												//人数+1
		flag_after_out = 0;																											//清除红外出标志位
		flag_after_in = 0;																											//清除红外进标志位
	}
	
	
	if(HW_after_out == 1 && HW_after_in == 0)																	//红外出触发且红外进未触发
		flag_after_out = 1;																											//红外出标志位置1
	if(HW_after_out == 0 && flag_after_out == 1 && HW_after_in == 1)					//红外出未触发且红外出标志位为1且红外进触发
	{
		flag_after_out = 2;																											//红外出标志位置2
		flag_after_in = 1;																											//红外进标志位置1
	}
	if(HW_after_out == 0 && flag_after_out == 2 && HW_after_in == 0 && flag_after_in == 1)		//红外出未触发且红外出标志位为2且红外进未触发且红外进标志位为1
	{
		if(number_people > 0)
			number_people--;																											//人数-1
		flag_after_in = 0;																											//清除红外进标志位
		flag_after_out = 0;																											//清除红外出标志位
	}		
			
	if(flag_mode == 0 && number_people != 0)																	//自动模式且教室人数不为0
	{
		if(light_value < light_min)																							//光照小于设置光照最小值
		{		
			if(IRED_north == 0)																										//北面有人,LED随着光照值变化而变化
			{
				pwm_north_value = 10-10*light_value/light_min;
				flag_rt_north = 1;
			}
			else																																	//北面人走后10S关闭LED
			{
				if(flag_rt_north == 1)
					flag_timer_begin_north = 1;
				else
					flag_timer_begin_north = 0;
				if(flag_north == 1)
				{
					pwm_north_value = 0;	
					flag_rt_north = 0;			
				}
			}
			if(IRED_south == 0)																										//南面有人,LED随着光照值变化而变化
			{
				pwm_south_value = 10-10*light_value/light_min;
				flag_rt_south = 1;
			}
			else																																	//南面人走后10S关闭LED
			{
				if(flag_rt_south == 1)
					flag_timer_begin_south = 1;
				else
					flag_timer_begin_south = 0;
				if(flag_south == 1)
				{
					pwm_south_value = 0;	
					flag_rt_south = 0;			
				}
			}		
			if(IRED_west == 0)																										//西面有人,LED随着光照值变化而变化
			{
				pwm_west_value = 10-10*light_value/light_min;
				flag_rt_west = 1;
			}
			else																																	//西面人走后10S关闭LED
			{
				if(flag_rt_west == 1)
					flag_timer_begin_west = 1;
				else
					flag_timer_begin_west = 0;
				if(flag_west == 1)
				{
					pwm_west_value = 0;	
					flag_rt_west = 0;			
				}
			}
			if(IRED_east == 0)																										//东面有人,LED随着光照值变化而变化
			{
				pwm_east_value = 10-10*light_value/light_min;
				flag_rt_east = 1;
			}
			else																																	//东面人走后10S关闭LED
			{
				if(flag_rt_east == 1)
					flag_timer_begin_east = 1;
				else
					flag_timer_begin_east = 0;
				if(flag_east == 1)
				{
					pwm_east_value = 0;	
					flag_rt_east = 0;			
				}
			}				
		}
		else																																		//光照不小于最小值关闭所有LED
		{
			pwm_north_value = 0;
			pwm_west_value = 0;
			pwm_south_value = 0;
			pwm_east_value = 0;
		}
	}
}
else													       																			  //设置界面
{
	pwm_north_value = 0;
	pwm_west_value = 0;
	pwm_south_value = 0;
	pwm_east_value = 0;
	flag_timer_begin_north = 0;							
	flag_timer_begin_south = 0;							
	flag_timer_begin_west = 0;							
	flag_timer_begin_east = 0;							
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值