10163-基于STM32的太阳能板清洁控制系统设计(详细设计说明书+原理图工程+源码工程+仿真工程)

本设计目标如下:
1、可以手动控制小车前进后退、左、右、停止
2、切换模式至蓝牙模式,可以控制前进后退、左、右停止
3、超声波检测距离避障
4、温湿度传感器检测环境
5、污渍检测传感器可以判断清洁前后的太阳能小板,如果清洁前比较干净则不清洁,清洁前较脏则启动清扫设备开始清洁。

摘要:
1, 规划:能根据光伏板的布局和尺寸,确保全面清洁。
2, 自动清洁功能(检测灰尘浓度进行清洁),
3, 对比检测:通过对比当前采集的光学数据与清洁后的标准数据,确定是否需要进行清洁。
4, 障碍物检测:采用超声波、红外等传感器感知光伏板上的障碍物,如异物、其他设备等,避免碰撞。
5, 数据处理:对传感器采集到的数据进行分析和处理,判断太阳能板的脏污状况、环境状态等,并据此做出相应的控制决策。
6, 数据显示:通过液晶显示屏等设备,实时显示太阳能板的相关信息,如脏污程度、环境参数、清洁状态等。
7 自动充电功能:机器人可以利用光能充电,在充电过程中通过声光报警系统反馈充电状态。
8. 远程控制功能:借助无线通信模块,如蓝牙、Wi-Fi等,实现用户通过手机或其他设备远程控制机器人的运动方向、启动和停止等操作。
本文基于STM32微控制器,设计了一套太阳能板清洁控制系统,旨在实现太阳能板的智能化、自动化清洁。选OLED显示器显示各项参数便于观察清洁系统的状态,在控制方式上系统提供手动与蓝牙远程两种模式。手动模式下,操作人员可通过实体按键实现清洁小车前进、后退、左转、右转及停止的精准操控;切换至蓝牙模式后,借助移动终端可完成远程控制,适用于大面积光伏电站的清洁作业,装置内置超声波控制模块。采取超声波范围测距的原理,能够实时监测小车与障碍物之间的距离。当检测到故障时,系统迅速响应。集成环境监测、污渍检测功能,温湿度传感器(DHT11)实时采集环境温湿度数据,可以方便工作人员分析环境因素,制定更科学的管理策略。污渍检测传感器采用光电检测原理,通过对比太阳能板表面反射光强度与标准值,精准判断表面清洁程度,若检测到污渍积累达到设定阈值,系统自动启动清扫设备,进行针对性清洁;若板面较干净,则保持待机状态,这一设计显著提升了清洁效率,降低了能源消耗。

资料包含:电子设计全套资料(精品)
1、原理图工程文件
2、仿真模型工程文件
3、仿真源代码工程文件
4、详细设计说明书-15894字
5、英文文献及翻译
等等等

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述



/* Includes -----------------------------------------------------------------*/
#include "App_HCSR04.h"

/* Defines ------------------------------------------------------------------*/

/* Variables Define ---------------------------------------------------------*/
uint8_t ditance_flag = 0;//开始测量标志
uint32_t ditance_count = 0;//测量计数 10us/次
uint16_t MM_ditance = 0;//输出测量距离 单位毫米
/* Function prototypes ------------------------------------------------------*/
/*******************************************************************************
 * 函数名:User_HCSR04_Init
 * 描述  :HCSR04初始化
 * 输入  :void
 * 输出  :void
 * 调用  :初始化
 * 备注  :
*******************************************************************************/
void User_HCSR04_Init(void)
{
	User_TIM1_Init();
  HCSR04_GPIO_Init();
}

/*******************************************************************************
 * 函数名:HCSR04_GPIO_Init
 * 描述  :HCSR04引脚初始化
 * 输入  :void
 * 输出  :void
 * 调用  :初始化
 * 备注  :
*******************************************************************************/
void HCSR04_GPIO_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出   

	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

	GPIO_InitStructure.GPIO_Pin = Trig_Pin;//控制脚 Trig	

	GPIO_Init(HCSR04_GPIO_Port, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//下拉输入 

	GPIO_InitStructure.GPIO_Pin = Echo_Pin;//接收脚 Echo	

	GPIO_Init(HCSR04_GPIO_Port, &GPIO_InitStructure);	
}

/*******************************************************************************
 * 函数名:User_TIM1_Init
 * 描述  :定时器1初始化
 * 输入  :void
 * 输出  :void
 * 调用  :初始化
 * 备注  :
*******************************************************************************/
void User_TIM1_Init(void)
{
    RCC_APB2PeriphClockCmd(HCSR04_TIM_CLK_ENABLE, ENABLE); // 启用TIM1时钟

    TIM_InternalClockConfig(HCSR04_TIM);// 设置TIM1使用内部时钟

    TIM_TimeBaseInitTypeDef TIM1_TimeBaseInitStructure;// 定义结构体,配置定时器
    TIM1_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 设置1分频(不分频)
    TIM1_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;// 设置计数模式为向上计数
    TIM1_TimeBaseInitStructure.TIM_Period = PERIOD_COUNT - 1;    // 设置最大计数值,达到最大值触发更新事件
    TIM1_TimeBaseInitStructure.TIM_Prescaler = PRESCALER_COUNT - 1;    // 设置时钟预分频
    TIM1_TimeBaseInitStructure.TIM_RepetitionCounter = 0;    // 重复计数器
    TIM_TimeBaseInit(HCSR04_TIM, &TIM1_TimeBaseInitStructure);    // 初始化TIM1定时器

    TIM_ClearFlag(HCSR04_TIM, TIM_FLAG_Update);    // 清除更新中断标志位
    TIM_ITConfig(HCSR04_TIM, TIM_IT_Update, ENABLE);    // 开启更新中断

//	  TIM1_NVIC_Init();
	 
    TIM_Cmd(HCSR04_TIM, ENABLE);    // 开启定时器
}

/*******************************************************************************
 * 函数名:TIM1_NVIC_Init
 * 描述  :定时器1中断配置初始化
 * 输入  :void
 * 输出  :void
 * 调用  :初始化
 * 备注  :
*******************************************************************************/
void TIM1_NVIC_Init(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);    // 设置中断优先级分组

    NVIC_InitTypeDef NVIC_InitStructure;    // 定义结构体,配置中断优先级
    NVIC_InitStructure.NVIC_IRQChannel = HCSR04_TIM_IRQn; // 指定中断通道
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;    // 中断使能
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;    // 设置抢占优先级为最高
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;    // 设置响应优先级为最高
    NVIC_Init(&NVIC_InitStructure);
}

/*******************************************************************************
 * 函数名:HCSR04_TIM_IRQHandler
 * 描述  :定时器1中断服务程序
 * 输入  :void
 * 输出  :void
 * 调用  :初始化
 * 备注  :
*******************************************************************************/
void HCSR04_TIM_IRQHandler(void)
{
    if(TIM_GetITStatus(HCSR04_TIM, TIM_IT_Update) != RESET)
    {
			  if(ditance_flag)
				{
				   ditance_count++;
				}
        TIM_ClearITPendingBit(HCSR04_TIM, TIM_IT_Update); //清除中断挂起位
    }
}

/*******************************************************************************
 * 函数名:Trig_out_High
 * 描述  :Trig输出高电平
 * 输入  :void
 * 输出  :void
 * 调用  :内部调用
 * 备注  :
 *******************************************************************************/
void Trig_Out_High(void)
{
  GPIO_SetBits(HCSR04_GPIO_Port,Trig_Pin);//Trig= 1
}

/*******************************************************************************
 * 函数名:Trig_Out_Low
 * 描述  :Trig输出低电平
 * 输入  :void
 * 输出  :void
 * 调用  :内部调用
 * 备注  :
 *******************************************************************************/
void Trig_Out_Low(void)
{
  GPIO_ResetBits(HCSR04_GPIO_Port,Trig_Pin);//Trig= 0		
}

/*******************************************************************************
 * 函数名:Read_Echo_Level
 * 描述  :读取Echo引脚电平
 * 输入  :void
 * 输出  :void
 * 调用  :内部调用
 * 备注  :
 *******************************************************************************/
uint8_t Read_Echo_Level(void)
{
  return GPIO_ReadInputDataBit(HCSR04_GPIO_Port,Echo_Pin);
}

/*******************************************************************************
 * 函数名:Measurement_function
 * 描述  :HCSR04测距函数
 * 输入  :void
 * 输出  :void
 * 调用  :内部调用
 * 备注  :
 *******************************************************************************/
void Measurement_function(void)
{
  Trig_Out_High();  
	Delay_20us();
  Trig_Out_Low();	
	while(Read_Echo_Level()==0);//等待低电平结束
	    ditance_count = 0;	
	while(Read_Echo_Level()==1);//等待高电平结束	
      ditance_flag = 1;	
	if(ditance_count < Overtime)//小于超时时间 38ms
	{
	   MM_ditance = ((ditance_count * 340)/2)/91;//单位毫米
	}
}

/*******************************************************************************
 * 函数名:Delay_20us
 * 描述  :延时20us
 * 输入  :void
 * 输出  :void
 * 调用  :
 * 备注  ://实际大概20us
 *******************************************************************************/
void Delay_20us(void)
{
		uint8_t i = 0;
		for(i=0;i<10;i++)
		{
        Delay_2us();
		}	
    IWDG_ReloadCounter();//清开门狗 		
}

/*******************************************************************************
 * 函数名:Delay_2us
 * 描述  :延时2us
 * 输入  :void
 * 输出  :void
 * 调用  :
 * 备注  ://实际大概2us
 *******************************************************************************/
void Delay_2us(void)
{
		uint8_t i = 0;
		for(i=0;i<50;i++)
		{
        __NOP();		
		}	
    IWDG_ReloadCounter();//清开门狗 		
}


Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐