【Proteus仿真】【Arduino单片机】路灯控制系统

发布时间:2024年01月09日


一、功能简介

本项目使用Proteus8仿真Arduino单片机控制器,使用LCD1602显示模块、人体红外传感器、光线检测模块、路灯继电器控制等。

主要功能:
系统运行后,LCD1602显示时间、工作模式,光线强度及路灯工作状态。
如果晚上11点到凌晨4点,通过红外感应方式控制路灯;
当感应有人,路灯开启;当感应没人,延迟一会儿关闭路灯;
如果在时间之外则通过光线强弱方式控制路灯;
当光线较暗,路灯开启;当光线较亮,延迟一会儿关闭路灯;


二、软件设计

/*
作者:嗨小易(技术QQ交流群:570487280)

*/




//系统数据获取
void sys_data_get(void)
{
	while(1)
	{
		//读取光线值
		sys_ctrl.light=pcf8591_read_adcvalue(0);
		sys_ctrl.light=cal_map(sys_ctrl.light,0,255,0,100);

		//检测是否有人
		if(IRED==0)sys_ctrl.man=1;
		else sys_ctrl.man=0;

		//根据时间选择光控还是红外控
		if(sys_ctrl.hour>=23 || sys_ctrl.hour<=3)sys_ctrl.mode=1;
		else sys_ctrl.mode=0;	

		break;
	}	
}

//系统数据显示
void sys_data_show(void)
{
	while(1)
	{
		//时间显示
		lcd1602_show_nums(0,0,sys_ctrl.hour,2,0x80);
		lcd1602_show_nums(3,0,sys_ctrl.min,2,0x80);
		lcd1602_show_nums(6,0,sys_ctrl.sec,2,0x80);
		
		//控制模式显示
		if(sys_ctrl.mode==1)lcd1602_show_string(11,0,"Ired ");
		else lcd1602_show_string(11,0,"Light");

		//显示光线强度
		lcd1602_show_nums(2,1,sys_ctrl.light,3,0);

		//是否有人显示
		if(sys_ctrl.man==1)lcd1602_show_string(8,1,"Y");
		else lcd1602_show_string(8,1,"N");
		
		break;			
	}
}


//系统数据设置
void sys_data_set(void)
{
	
}

//系统功能控制
void sys_fun_ctrl(void)
{
	//如果是光控
	if(sys_ctrl.mode==0)
	{
		//光线很强,路灯关闭
		if(sys_ctrl.light>LIGHT_MAX)sys_ctrl.sta=0;
		//如果光线暗,路灯打开
		else if(sys_ctrl.light<LIGHT_MIN)sys_ctrl.sta=1;
//		//中间强度,路灯关闭
//		else sys_ctrl.sta=0;	
	}
	//如果是红外控制
	else
	{
		//如果感应到有人,路灯打开
		if(sys_ctrl.man==1)sys_ctrl.sta=1;
		else 
		{
			delay_ms(1000);
			sys_ctrl.sta=0;	
		}
	}
	//路灯关闭
	if(sys_ctrl.sta==0)
	{
		LED=1;
		lcd1602_show_string(11,1,"Close");
	}
	else 
	{
		LED=0;
		lcd1602_show_string(11,1,"Open ");	
	}
}

//应用控制系统
void appdemo_show(void)
{
	u8 i=2;
	sys_parm_init();//系统参数初始化
	ctrl_pin_init();
	pcf8591_init();
	lcd1602_init();//LCD1602初始化
	//读取数据,等待稳定
	while(i--)
	{
		//读取光线值
		sys_ctrl.light=pcf8591_read_adcvalue(0);
		sys_ctrl.light=cal_map(sys_ctrl.light,0,255,0,100);
		delay_ms(100);
	}
	TIM2_Init(400-1,70);//定时10ms
	TIM_Cmd(TIM2,ENABLE);//打开定时器
	sys_open_show();//系统初始界面显示

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





三、实验现象

B站演示视频:https://space.bilibili.com/444388619
在这里插入图片描述
在这里插入图片描述


联系作者

视频地址:https://space.bilibili.com/444388619/video
专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

文章来源:https://blog.csdn.net/Hello_Muyi/article/details/135479543
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。