基于STM32设计的智能灌溉控制系统

发布者:NatureLover最新更新时间:2024-09-26 来源: elecfans关键字:STM32  控制系统 手机看文章 扫描二维码
随时随地手机看文章

一、项目介绍

随着现代农业的发展,人们对于水资源的合理利用越来越重视。而传统的灌溉方式往往存在着浪费水资源、劳动力投入大、效率低等问题。因此,设计一款智能灌溉控制系统,可以实现对灌溉水量的精准控制,增加水资源利用率,提高农业生产效率,具有广泛的应用前景。

当前文章介绍一款高性能的智能灌溉控制系统的开发过程,可自动采集电压、电流、累计用水量,并根据用户需要实现自动灌溉、定时灌溉、周期灌溉和手动灌溉等多种模式,同时具备中控室控制、手机短信、现场遥控及现场手动等多种方式控制功能。该系统可以对现场温湿度限值进行设置和修改,并通过控制器或后台监控系统完成灌溉起始时间、停止时间、喷灌时间等参数设置。系统显示功能包括液晶屏以中文菜单方式显示现场采集数据以及后台监控系统配大屏幕显示器,图形、表格等多种形式动态显示整个灌溉区运行情况。同时,在电压、电流或者流量出现异常时,系统可以及时报警。该系统供电为220VAC,流量计量误差精度为2级,使用二维码或卡实现预付费功能,通讯使用4G与云平台连接。

image-20230427151119821

二、设计功能

本系统采用STM32作为主控芯片,并通过AD模块采集电压、电流和流量等数据。同时,通过继电器控制灌溉设备的启停,使用PWM控制阀门的开合程度,从而实现精确控制灌溉水量。通信模块则采用4G模块与云平台连接,实现远程监控及控制功能。预付费模块则使用二维码或卡实现预付费功能,用户需在充值后才能使用该系统进行灌溉操作。

系统软件设计包括采集程序、控制程序、前端程序和后台程序。其中,采集程序主要负责采集电压、电流、流量等数据,并将采集到的数据上传到云平台;控制程序主要负责控制灌溉设备的启停和阀门的开合程度,从而实现灌溉控制;前端程序主要负责实现中文菜单方式显示现场采集数据,并提供灌溉模式选择、参数设置等功能;后台程序主要负责实现大屏幕显示器、图形、表格等多种形式动态显示整个灌溉区运行情况。

【1】硬件部分

  1. MCU:本系统采用STM32作为主控芯片,其具有高性能、低功耗等优点,可满足该系统的高要求。

  2. 数据采集模块:本系统通过AD模块采集电压、电流和流量等数据,然后使用MCU进行处理,并将采集到的数据存储到Flash中。

  3. 控制模块:本系统通过继电器控制灌溉设备的启停,同时使用PWM控制阀门的开合程度,从而实现精确控制灌溉水量。

  4. 通信模块:本系统采用4G模块与云平台连接,实现远程监控及控制功能。

  5. 预付费模块:本系统使用二维码或卡实现预付费功能,用户需在充值后才能使用该系统进行灌溉操作。

【2】软件部分

  1. 采集程序:本系统的采集程序主要负责采集电压、电流、流量等数据,并将采集到的数据上传到云平台。

  2. 控制程序:本系统的控制程序主要负责控制灌溉设备的启停和阀门的开合程度,从而实现灌溉控制。

  3. 前端程序:本系统的前端程序主要负责实现中文菜单方式显示现场采集数据,并提供灌溉模式选择、参数设置等功能。

  4. 后台程序:本系统的后台程序主要负责实现大屏幕显示器、图形、表格等多种形式动态显示整个灌溉区运行情况。

三、系统实现

具体实现过程如下:

(1)采集程序

采集程序主要由AD模块和STM32芯片完成。AD模块采集电压、电流和流量等数据,经过滤波和放大处理后,传输到STM32芯片上。STM32芯片通过串口将采集到的数据上传到云平台,并存储在Flash中。

(2)控制程序

控制程序主要由继电器和PWM模块完成。继电器用于控制灌溉设备的启停,PWM模块则用于控制阀门的开合程度,从而实现精确控制灌溉水量。控制程序通过读取Flash中存储的参数,确定灌溉起始时间、停止时间、喷灌时间等操作流程,并根据实时采集到的数据进行动态调整,保证灌溉操作的准确性和稳定性。

(3)前端程序

前端程序主要是通过液晶屏以中文菜单方式显示现场采集数据,并提供灌溉模式选择、参数设置等功能。用户可以通过按键或触摸屏来进行操作,并实时查看灌溉操作的运行情况。此外,用户还可以通过手机短信、现场遥控或现场手动等方式对灌溉操作进行控制。

(4)后台程序

后台程序主要负责实现大屏幕显示器、图形、表格等多种形式动态显示整个灌溉区运行情况,同时还能够将采集到的数据进行分析和统计,为灌溉管理提供决策参考。


四、核心代码

【1】电机控制代码

以下是STM32F103ZET6通过PWM控制直流电机转速的代码,并封装成子函数调用的示例:


首先,需要在STM32CubeMX中配置TIM定时器和GPIO引脚,以及将PWM模式设置为嵌套边沿对齐模式,然后生成代码,并在main.c文件中添加以下代码:


#include 'main.h'

#include 'stm32f1xx_hal.h'

/* TIM handle structure */

TIM_HandleTypeDef htim;

/* Function prototypes */

void PWM_Init(TIM_HandleTypeDef *htim, uint32_t channel);

void Set_Motor_Speed(TIM_HandleTypeDef *htim, uint32_t channel, uint16_t speed);

int main(void)

{

 /* Initialize the HAL Library */

 HAL_Init();

 /* Initialize TIM2 PWM with a frequency of 10 kHz */

 PWM_Init(&htim2, TIM_CHANNEL_1);

 /* Set the motor speed to 50% */

 Set_Motor_Speed(&htim2, TIM_CHANNEL_1, 5000);

 while (1)

  {

  /* Infinite loop */

  }

}

/**

 * @brief  Initializes PWM output on specified TIM channel.

 * @param  htim: TIM handle structure.

 * @param  channel: TIM channel to be used for PWM output.

 * @retval None

 */

void PWM_Init(TIM_HandleTypeDef *htim, uint32_t channel)

{

 TIM_OC_InitTypeDef sConfigOC = {0};

 /* Configure PWM output on specified TIM channel */

 sConfigOC.OCMode    = TIM_OCMODE_PWM1;

 sConfigOC.Pulse    = 0;

 sConfigOC.OCPolarity  = TIM_OCPOLARITY_HIGH;

 sConfigOC.OCFastMode  = TIM_OCFAST_DISABLE;

 HAL_TIM_PWM_ConfigChannel(htim, &sConfigOC, channel);

 /* Start PWM output */

 HAL_TIM_PWM_Start(htim, channel);

}

/**

 * @brief  Sets the motor speed on specified TIM channel.

 * @param  htim: TIM handle structure.

 * @param  channel: TIM channel to be used for PWM output.

 * @param  speed: Motor speed in units of 1/10,000th of the maximum speed.

 *         For example, a speed of 5000 would set the motor speed to 50%.

 * @retval None

 */

void Set_Motor_Speed(TIM_HandleTypeDef *htim, uint32_t channel, uint16_t speed)

{

 uint16_t max_speed = htim->Init.Period;

 /* Ensure that speed is within range */

 if (speed > max_speed)

  speed = max_speed;

 /* Update PWM duty cycle */

 __HAL_TIM_SET_COMPARE(htim, channel, speed);

}

在以上代码中,定义了两个函数:PWM_Init和Set_Motor_Speed。PWM_Init用于初始化TIM定时器的PWM输出,并设置指定通道的PWM模式和默认占空比为0。Set_Motor_Speed用于设置电机的转速,其接收三个参数:TIM句柄结构体,指定的通道,以及电机的转速(单位为1/10,000最大速度)。该函数会将电机的转速转换为PWM占空比,并通过__HAL_TIM_SET_COMPARE函数更新PWM占空比。


最后,可以按照以下步骤将代码封装成子函数调用:


将以上代码复制到单独的.c文件中,并包含必要的头文件。

在该文件中定义一个名为Motor_Control的函数,该函数接收三个参数:TIM句柄结构体,指定的通道,以及电机的转速。

在Motor_Control函数中调用PWM_Init和Set_Motor_Speed函数,并传递相应的参数。

在main函数中调用Motor_Control函数,传递相应的参数。

以下是Motor_Control函数的示例代码:


#include 'motor_control.h'

void Motor_Control(TIM_HandleTypeDef *htim, uint32_t channel, uint16_t speed)

{

 /* Initialize PWM output on specified TIM channel */

 PWM_Init(htim, channel);

 /* Set the motor speed */

 Set_Motor_Speed(htim, channel, speed);

}

在以上示例中,将PWM的初始化和设置电机转速的函数封装成了一个名为Motor_Control的函数。可以在需要控制电机转速的其他地方调用Motor_Control函数即可。


注意,在调用Motor_Control函数之前,需要先定义并初始化TIM句柄结构体,并确保GPIO引脚已经正确配置为TIM模式。此外,如果需要控制多个电机,可以在Motor_Control函数中增加参数以区分不同的电机通道。


以下是motor_control.h头文件的示例代码:


cCopy Code#ifndef __MOTOR_CONTROL_H__

#define __MOTOR_CONTROL_H__

#include 'stm32f1xx_hal.h'

/* Function prototypes */

void PWM_Init(TIM_HandleTypeDef *htim, uint32_t channel);

void Set_Motor_Speed(TIM_HandleTypeDef *htim, uint32_t channel, uint16_t speed);

void Motor_Control(TIM_HandleTypeDef *htim, uint32_t channel, uint16_t speed);

#endif /* __MOTOR_CONTROL_H__ */

在以上头文件中,声明了三个函数:PWM_Init,Set_Motor_Speed和Motor_Control,并包含必要的头文件。


【2】电压、电流采集

为了采集220V抽水电机的用电量和当前电压,当前使用STM32F103ZET6的ADC(模数转换器)来测量电压和电流,并通过乘法器计算电功率和电能。


下面是实现方案和实现代码:


选择合适的传感器: 为了测量电压,可以使用AC-AC变压器将220V交流电压降至低电平,再使用电阻分压器将电压信号调整在ADC的输入范围内。 为了测量电流,可以使用霍尔传感器或者电阻式传感器,将电流信号转换成电压信号,然后通过电阻分压器调整信号范围。

配置ADC: 使用STM32CubeMX软件选择相应的引脚和配置ADC模块,设置采样频率、参考电压等参数。需要注意的是,ADC模块只能同时转换一路模拟信号,因此需要轮流采样电压和电流信号。

计算电流、电压、功率和能量: 将电压和电流信号转换成数字值后,可以使用下面的公式计算电流、电压、功率和能量:

Copy Code电流 = AD值 / 灵敏度

电压 = AD值 / 分压比

功率 = 电压 * 电流

能量 = 功率 * 时间

其中,灵敏度是传感器的转换系数,分压比是电阻分压器的比值,时间可以通过定时器计算。


输出数据: 将测量的电流、电压、功率和能量输出到串口或者LCD显示屏上。可以设置一个定时器,在一定时间间隔内输出一次数据。

实现代码:


#include 'stm32f1xx_hal.h'

ADC_HandleTypeDef hadc1;

TIM_HandleTypeDef htim2;

void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_ADC1_Init(void);

static void MX_TIM2_Init(void);

uint16_t ad_val_ch1, ad_val_ch2;

float voltage, current, power, energy;

int main(void)

{

 HAL_Init();

 SystemClock_Config();

 MX_GPIO_Init();

 MX_ADC1_Init();

 MX_TIM2_Init();

 while (1)

  {

  // ADC采样电压信号

  HAL_ADC_Start(&hadc1);

  HAL_ADC_PollForConversion(&hadc1, 100);

  ad_val_ch1 = HAL_ADC_GetValue(&hadc1);

  voltage = ad_val_ch1 * 3.3 / 4096 * 10; // 假设分压比为10

  // ADC采样电流信号

  HAL_TIM_Base_Start(&htim2);

  HAL_ADC_Start(&hadc1);

  HAL_ADC_PollForConversion(&hadc1, 100);

  ad_val_ch2 = HAL_ADC_GetValue(&hadc1);

  current = ad_val_ch2 * 3.3 / 4096 * 50; // 假设灵敏度为50mV/A

  // 计算功率和能量

  power = voltage * current;

  energy += power * 0.1; // 假设定时器时间间隔为100ms

  // 输出测量结果

  printf('Voltage: %.2f Vrn', voltage);

  printf('Current: %.2f Arn', current);

  printf('Power: %.2f Wrn', power);

  printf('Energy: %.2f Jrn', energy);

  HAL_Delay(1000); // 假设数据输出间隔为1s

  }

}

void SystemClock_Config(void)

{

 RCC_OscInitTypeDef RCC_OscInitStruct = {0};

 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

 __HAL_RCC_PWR_CLK_ENABLE();

 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

 RCC_OscInitStruct.OscillatorType = RCCRCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;

RCC_OscInitStruct.HSIState = RCC_HSI_ON;

RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;

RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;

if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

{

Error_Handler();

}

RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;

RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;

RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;

RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)

{

Error_Handler();

}

}

static void MX_ADC1_Init(void)

{

ADC_ChannelConfTypeDef sConfig = {0};

__HAL_RCC_ADC1_CLK_ENABLE();

hadc1.Instance = ADC1;

hadc1.Init.ScanConvMode = DISABLE;

hadc1.Init.ContinuousConvMode = ENABLE;

hadc1.Init.DiscontinuousConvMode = DISABLE;

hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;

hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;

hadc1.Init.NbrOfConversion = 1;

if (HAL_ADC_Init(&hadc1) != HAL_OK)

{

Error_Handler();

}

sConfig.Channel = ADC_CHANNEL_0; // 假设测量电压的ADC通道为0

sConfig.Rank = ADC_REGULAR_RANK_1;

sConfig.SamplingTime = ADC_SAMPLETIME_13CYCLES_5;

if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)

{

Error_Handler();

}

sConfig.Channel = ADC_CHANNEL_1; // 假设测量电流的ADC通道为1

if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)

{

Error_Handler();

}

}

static void MX_TIM2_Init(void)

{

__HAL_RCC_TIM2_CLK_ENABLE();

htim2.Instance = TIM2;

htim2.Init.Prescaler = 7200 - 1;

htim2.Init.CounterMode = TIM_COUNTERMODE_UP;

htim2.Init.Period = 10000 - 1; // 假设定时器时间间隔为100ms

if (HAL_TIM_Base_Init(&htim2) != HAL_OK)

{

Error_Handler();

}

}

void Error_Handler(void)

{

while (1)

{

}

}

#ifdef USE_FULL_ASSERT

void assert_failed(char *file, uint32_t line)

{

}

#endif


关键字:STM32  控制系统 引用地址:基于STM32设计的智能灌溉控制系统

上一篇:STM32单片机GPIO的配置模式
下一篇:STM32的DMA数据传输实例

推荐阅读最新更新时间:2026-03-24 17:33

基于STM32设计的智能灌溉控制系统
一、项目介绍 随着现代农业的发展,人们对于水资源的合理利用越来越重视。而传统的灌溉方式往往存在着浪费水资源、劳动力投入大、效率低等问题。因此,设计一款智能灌溉控制系统,可以实现对灌溉水量的精准控制,增加水资源利用率,提高农业生产效率,具有广泛的应用前景。 当前文章介绍一款高性能的智能灌溉控制系统的开发过程,可自动采集电压、电流、累计用水量,并根据用户需要实现自动灌溉、定时灌溉、周期灌溉和手动灌溉等多种模式,同时具备中控室控制、手机短信、现场遥控及现场手动等多种方式控制功能。该系统可以对现场温湿度限值进行设置和修改,并通过控制器或后台监控系统完成灌溉起始时间、停止时间、喷灌时间等参数设置。系统显示功能包括液晶屏以中文菜单方式显示现场
[单片机]
基于<font color='red'>STM32</font>设计的<font color='red'>智能</font><font color='red'>灌溉</font><font color='red'>控制系统</font>
基于单片机的智能浇花(灌溉)系统设计
智能浇花系统选择AT89C51单片机最小系统作为整体控制芯片。该系统功能为对土壤温度值与湿度值进行实时监测,并及时控制土壤中温度值与湿度值。将测量的温温度值与湿度值返回给单片机进行数据处理通过控制模块进行温湿度控制。智能浇花系统主要分为两个部分:监测模块选用湿度传感器YL-69来对土壤中湿度值进行监测以及温度传感器DS18B20对花周围温度进行实时检测。温度值与湿度值的控制则为连接在单片机上的SRD-05VDC-SL-C继电器,通过控制连接水管的电磁阀开关来实现对土壤浇水。通过电磁阀来控制风扇从而进行温度控制。模拟部分通过控制加热棒来模拟夏天高温天气,利用风扇降温。 本设计软件实现方法是将湿度传感器YL-69的探头完全插
[单片机]
基于单片机的<font color='red'>智能</font>浇花(<font color='red'>灌溉</font>)系统设计
这个智能灌溉系统可以在草坪最需要时浇水
通常来说,普通的洒水装置都是通过定时器或计时器来实现不同的浇灌周期,但是这种方式其实并非是最实惠最适合的方法。如果某一天下雨,你又忘记关掉计时器,不仅浪费水源,而且还会过度灌溉。最近一家名为ETwater的公司推出了更有效的解决方案,智能喷水器,只有在草坪真正需要水的时候,它才会开始工作。 ETwater的洒水装置结合了组合式传感器及实施气象数据,可以估测出植物需要多少水分。如果一直下雨,ETwater就会减少对植物的 灌溉。另外,ETwater系统还可以追踪当地的土壤环境和植物类型。ETwater公司表示自己的系统最多可以节省用水量高达50%,对于干旱的环境来说绝对拥有巨大的潜力。 目前,ETwater公司希望能够为公园
[安防电子]
神级DIY:智能灌溉器解决盆栽植物浇水难题
在TI,我们欢迎那些在业余时间享受发明与创新的创客和爱好者。在德州仪器持续推出的 神级DIY 系列博客中,我们将为大家分享他们通过TI的技术所创造的奇妙发明。 摘要:精心培养的盆栽植物总是在炎炎的夏日因为忘记浇水而枯萎死去,虽然现在市场上已经推出了智能浇水工具,但是往往都是针对大型温室或花园的灌溉系统。如何能够在节约花费同时保证安全的情况下让盆栽植物实现智能灌溉呢?或许TI MSP MCU产品营销工程师Dave Smith的故事能够为您带来一些自己动手的灵感。 Dave Smith酷爱烹饪。而能够给他带来同样满足感的事情就是从盆栽中摘下一个成熟的辣椒,把它扔到炖锅中,使之成为他最新烹饪乐趣的点睛之笔。
[单片机]
神级DIY:<font color='red'>智能</font><font color='red'>灌溉</font>器解决盆栽植物浇水难题
Eve智能灌溉系统 可通过传感器检测温湿度
    现在,全球似乎都笼罩在物联网的热潮中,各种传感器和其它连接装置已经纷纷开始入侵我们的日常用品。不过随着空间变得越来越拥挤,智能设备们也已经开始逐渐远离我们的房间,其中越来越多的新产品都开始向屋外拓展,甚至已经开始准备代替我们掌管整个草坪和花园。     刚刚在Kickstarter上亮相的这款Eve智能灌溉系统就是非常热门的类型。其实之前我们已经看到过不少具备类似功能的产品,但是这并不能说明Eve就没有任何独特的亮点,事实上,一切恰恰相反。     之前我们都见过像Lono和Rachio等其它智能灌溉系统,这些产品都是依靠网络信息来确定最佳的浇灌时间。它们利用读取来自气象站的地质数据,然后对当地的土壤进行分
[安防电子]
分享一种STM32单片机空调温度控制系统设计方案
一、功能简介 本项目使用Proteus8.12仿真STM32单片机控制器,使用继电器加热/保温模块、数码管模块、按键模块、电机驱动模块等。 主要功能: 系统运行后,LCD1602显示温度和空调启动温度阈值及工作模式;当检测温度高于设置的温度阈值,空调变频器会随温度升高速度加快,可通过SW1开关切换自动和手动模式,当系统处于手动模式时,K1和K2用于调节变频器转动速度;当系统处于自动模式时,K1和K2用于设置温度阈值。 主要功能如下: (1)温度检测; (2)LCD1602显示; (3)自动/手动控制变频器转速。 二、软件设计 //系统初始界面显示 void sys_open_show(void) { lcd1602_c
[单片机]
分享一种<font color='red'>STM32</font>单片机空调温度<font color='red'>控制系统</font>设计方案
基于STM32单片机的迪士尼环境控制系统
一.系统设计 由 STM32F103C8T6单片机最小系统+ESP8266无线模块+DHT11温湿度传感器+MQ-2烟雾传感器+MQ-4有害气体传感器+UNV6288语音播报模块+GPS定位模块。采用STM32F103C8T6单片机为主控制器,利用ESP8266无线模块实现采集信息向上位机端的发送,利用DHT11温湿度传感器对温湿度信息的采集,MQ-2对环境中烟雾信号的采集,MQ-4对环境中有害气体的信息采集,GPS定位模块对危险事故发生位置进行信息采集,当检测到烟雾浓度或者气体浓度超极限值以后,通过语音报警(语音模块)的方式提醒大家离开。 图1 系统框图 二.硬件设计 系统内的主要电路有单片机最小系统电路,烟雾浓度检测电
[单片机]
基于<font color='red'>STM32</font>单片机的迪士尼环境<font color='red'>控制系统</font>
基于STM32的四旋翼飞行器控制系统
四旋翼飞行器是一种具有6个自由度和4个控制输入的可垂直起降、悬停、前飞、侧飞和倒飞的无人驾驶飞行器,4只旋翼可相互抵消反扭力矩,不需要专门的反扭矩桨。被广泛应用于无人侦察、森林防火、灾情监测、城市巡逻等领域。飞行控制系统是四旋翼飞行器的核心部分,其性能的好坏决定了整个系统的性能。近年来,微小型四旋翼无人机的自主飞行控制得到了研究人员的广泛关注。随着计算机技术和电子技术的发展,国内的小型飞行器研究开发工作逐渐升温,许多公司形成了产业。例如大疆公司将四轴飞行器等多轴飞行器实现了商业化应用。国内研究的重点主要为三个方面:姿态控制、传感器技术发展以及新材料的应用、电池领域技术的研究。典型代表有哈工大、北京航空航天大学、南京航空航天大学、国
[单片机]
基于<font color='red'>STM32</font>的四旋翼飞行器<font color='red'>控制系统</font>
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved