【Proteus仿真】【STM32单片机】太阳能追光系统设计

文章目录


一、功能简介

本项目使用Proteus8仿真STM32单片机控制器,使用LCD1602液晶、光敏传感器、PCF8591 ADC模块、按键模块、28BYJ48步进电机驱动模块、直流电机模块等。

主要功能:

系统运行后,LCD1602显示四个方向光线强度、工作模式及控制状态;

系统默认工作在自动模式,当系统检测为白天晴天,可以开始工作,当上光线值比下光线值还高于阈值,则直流电机工作上升;

当下光线值比上光线值还高于阈值,则直流电机工作下降;

当左光线值比右光线值还高于阈值,则步进电机工作左转;

当右光线值比左光线值还高于阈值,则步进电机工作右转;

当系统检测为夜晚,停止工作。

当按下K1键,切换为手动模式,可通过K2-K5键对上下左右方向控制;


二、软件设计

c 复制代码
/*
作者:嗨小易(QQ:3443792007)

*/


//系统数据显示
void sys_data_show(void)
{
	while(1)
	{
		//光线显示
		lcd1602_show_nums(2,0,sys_ctrl.light[0],2,0);//上
		lcd1602_show_nums(8,0,sys_ctrl.light[1],2,0);//下
		lcd1602_show_nums(2,1,sys_ctrl.light[2],2,0);//左
		lcd1602_show_nums(8,1,sys_ctrl.light[3],2,0);//右

		//自动手动显示
		if(sys_ctrl.auto_flag)lcd1602_show_string(12,0,"SD");
		else lcd1602_show_string(12,0,"Au");

		//上升下降状态显示
		if(sys_ctrl.udrun==0)lcd1602_show_string(15,0,"N");
		else if(sys_ctrl.udrun==1)lcd1602_show_string(15,0,"U");
		else if(sys_ctrl.udrun==2)lcd1602_show_string(15,0,"D");

		//左右转状态显示
		if(sys_ctrl.lrrun==0)lcd1602_show_string(15,1,"N");
		else if(sys_ctrl.lrrun==1)lcd1602_show_string(15,1,"L");
		else if(sys_ctrl.lrrun==2)lcd1602_show_string(15,1,"R");
		
		break;			
	}
}

//系统功能控制
void sys_fun_ctrl(void)
{
	//手动模式下
	if(sys_ctrl.auto_flag==1)
	{
		switch(sys_ctrl.udrun)
		{
			case 0: _dc_motor_stop();break;//停止
			case 1: _dc_motor_fturn();break;//上升
			case 2: _dc_motor_zturn();break;//下降
		}
		switch(sys_ctrl.lrrun)
		{
			case 1: step_motor_28BYJ48_send_pulse(8,0,STEPMOTOR_MAXSPEED,1,1);break;//左转
			case 2: step_motor_28BYJ48_send_pulse(8,1,STEPMOTOR_MAXSPEED,1,1);break;//右转
		}	
	}
	//自动控制模式
	else
	{
		//如果是晴天,根据4个传感器检测光线强弱自动调节
		if(sys_ctrl.light[0]>LIGHT_D_MIN && sys_ctrl.light[1]>LIGHT_D_MIN &&
			sys_ctrl.light[2]>LIGHT_D_MIN && sys_ctrl.light[3]>LIGHT_D_MIN)
		{
			//上比下亮,下降
			if(sys_ctrl.light[0]>sys_ctrl.light[1]+LIGHT_VALUE)
			{
				sys_ctrl.udrun=2;
				_dc_motor_zturn();	
			}
			//下比上亮,上升
			else if(sys_ctrl.light[1]>sys_ctrl.light[0]+LIGHT_VALUE)
			{
				sys_ctrl.udrun=1;
				_dc_motor_fturn();
			}
			//上下亮度差不多,停止
			else 
			{
				sys_ctrl.udrun=0;
				_dc_motor_stop();	
			}

			//左比右亮,左转
			if(sys_ctrl.light[2]>sys_ctrl.light[3]+LIGHT_VALUE)
			{
				sys_ctrl.lrrun=1;
				step_motor_28BYJ48_send_pulse(8,0,STEPMOTOR_MAXSPEED,1,1);	
			}
			//右比左亮,右转
			else if(sys_ctrl.light[3]>sys_ctrl.light[2]+LIGHT_VALUE)
			{
				sys_ctrl.lrrun=2;
				step_motor_28BYJ48_send_pulse(8,1,STEPMOTOR_MAXSPEED,1,1);	
			}
			else
			{
				sys_ctrl.lrrun=0;
			}
		}
		//如果是夜晚,系统不工作
		else if(sys_ctrl.light[0]<LIGHT_N_MIN && sys_ctrl.light[1]<LIGHT_N_MIN &&
			sys_ctrl.light[2]<LIGHT_N_MIN && sys_ctrl.light[3]<LIGHT_N_MIN)
		{
			sys_ctrl.udrun=0;
			sys_ctrl.lrrun=0;
			_dc_motor_stop();		
		}
	}
}

//应用控制系统
void appdemo_show(void)
{
	sys_parm_init();//系统参数初始化
	KEY_Init();
	pcf8591_init();
	dc_motor_init();
	step_motor_gpio_init();
	lcd1602_init();//LCD1602初始化
	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设计,视频分享,技术交流。

相关推荐
森焱森3 小时前
水下航行器外形分类详解
c语言·单片机·算法·架构·无人机
小殷学长6 小时前
【单片机毕业设计17-基于stm32c8t6的智能倒车监测系统】
stm32·单片机·课程设计
TESmart碲视7 小时前
HKS201-M24 大师版 8K60Hz USB 3.0 适用于 2 台 PC 1台显示器 无缝切换 KVM 切换器
单片机·嵌入式硬件·物联网·游戏·计算机外设·电脑·智能硬件
花落已飘9 小时前
STM32中实现shell控制台(shell窗口输入实现)
stm32·单片机·嵌入式硬件
花落已飘9 小时前
STM32中实现shell控制台(命令解析实现)
stm32·shell
没有钱的钱仔9 小时前
STM32低功耗模式全面指南
css·stm32·css3
牵牛老人11 小时前
Qt处理USB摄像头开发说明与QtMultimedia与V4L2融合应用
stm32·单片机·qt
宇钶宇夕12 小时前
针对工业触摸屏维修的系统指南和资源获取途径
单片机·嵌入式硬件·自动化
和风化雨12 小时前
stm32的三种开发方式
stm32·单片机·嵌入式硬件
kanhao10013 小时前
三态逻辑详解:单片机GPIO、计算机总线系统举例
单片机·嵌入式硬件