Advertisement

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

阅读量:

文章目录

  • 一、功能简介
  • 二、软件设计
  • 三、实验现象
  • 联系作者

一、功能简介

本项目采用Proteus8软件进行Arduino单片机控制器的仿真实验,并集成LCD1602显示屏、光敏传感器、采集模块、控制面板以及28BYJ-48步进电机驱动电路和动力系统模块等关键组件进行开发。

主要功能如下:
在系统运行后,LCD1602将显示四个方向的光线强度、工作模式以及控制状态。
默认状态下,系统处于自动模式,并在检测到晴朗的白天时启动运行。
当检测到上方光线强度高于下方时,则直流电机开始上升运动。
当检测到下方光线强度超过阈值时,则直流电机开始下降运动。
当左边光强高于右边时,则步进电机向左转动。
当右边光强超过左边时,则步进电机向右转动。
在夜晚被检测到时,默认关闭。
通过按下K1键切换至手动模式后,
可通过K2-K5键分别对上下左右方向进行控制操作。


二、软件设计

复制代码
    /*
    作者:嗨小易(QQ技术交流群:570487280)
    
    */
    
    
    //系统数据显示
    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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

联系作者

视频地址链接:此处
涵盖51单片机、STM32、国产32位处理器、DSP等电子系统开发技术及应用研究;涉及Proteus电路仿真软件与arduinio电子工程实践;介绍ESP32智能硬件开发及物联网相关技术;并提供相关PCB设计经验与视频分享平台的技术交流机会

全部评论 (0)

还没有任何评论哟~