在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于STM32設計的智能灌溉控制系統

DS小龍哥-嵌入式技術 ? 來源:DS小龍哥-嵌入式技術 ? 作者:DS小龍哥-嵌入式技 ? 2023-05-17 09:25 ? 次閱讀

一、項目介紹

隨著現代農業的發展,人們對于水資源的合理利用越來越重視。而傳統的灌溉方式往往存在著浪費水資源、勞動力投入大、效率低等問題。因此,設計一款智能灌溉控制系統,可以實現對灌溉水量的精準控制,增加水資源利用率,提高農業生產效率,具有廣泛的應用前景。

當前文章介紹一款高性能的智能灌溉控制系統的開發過程,可自動采集電壓、電流、累計用水量,并根據用戶需要實現自動灌溉、定時灌溉、周期灌溉和手動灌溉等多種模式,同時具備中控室控制、手機短信、現場遙控及現場手動等多種方式控制功能。該系統可以對現場溫濕度限值進行設置和修改,并通過控制器或后臺監控系統完成灌溉起始時間、停止時間、噴灌時間等參數設置。系統顯示功能包括液晶屏以中文菜單方式顯示現場采集數據以及后臺監控系統配大屏幕顯示器,圖形、表格等多種形式動態顯示整個灌溉區運行情況。同時,在電壓、電流或者流量出現異常時,系統可以及時報警。該系統供電為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占空比。

最后,可以按照以下步驟將代碼封裝成子函數調用:

  1. 將以上代碼復制到單獨的.c文件中,并包含必要的頭文件。
  2. 在該文件中定義一個名為Motor_Control的函數,該函數接收三個參數:TIM句柄結構體,指定的通道,以及電機的轉速。
  3. 在Motor_Control函數中調用PWM_Init和Set_Motor_Speed函數,并傳遞相應的參數。
  4. 在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模數轉換器)來測量電壓和電流,并通過乘法器計算電功率和電能。

下面是實現方案和實現代碼:

  1. 選擇合適的傳感器: 為了測量電壓,可以使用AC-AC變壓器將220V交流電壓降至低電平,再使用電阻分壓器將電壓信號調整在ADC的輸入范圍內。 為了測量電流,可以使用霍爾傳感器或者電阻式傳感器,將電流信號轉換成電壓信號,然后通過電阻分壓器調整信號范圍。
  2. 配置ADC: 使用STM32CubeMX軟件選擇相應的引腳和配置ADC模塊,設置采樣頻率、參考電壓等參數。需要注意的是,ADC模塊只能同時轉換一路模擬信號,因此需要輪流采樣電壓和電流信號。
  3. 計算電流、電壓、功率和能量: 將電壓和電流信號轉換成數字值后,可以使用下面的公式計算電流、電壓、功率和能量:
Copy Code電流 = AD值 / 靈敏度
電壓 = AD值 / 分壓比
功率 = 電壓 * 電流
能量 = 功率 * 時間

其中,靈敏度是傳感器的轉換系數,分壓比是電阻分壓器的比值,時間可以通過定時器計算。

  1. 輸出數據: 將測量的電流、電壓、功率和能量輸出到串口或者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
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6040

    文章

    44594

    瀏覽量

    636941
  • 控制系統
    +關注

    關注

    41

    文章

    6642

    瀏覽量

    110725
  • 4G
    4G
    +關注

    關注

    15

    文章

    5528

    瀏覽量

    119294
  • STM32
    +關注

    關注

    2270

    文章

    10915

    瀏覽量

    356774
收藏 人收藏

    評論

    相關推薦

    STM32智能溫室控制系統

    STM32智能溫室控制系統
    發表于 09-28 15:05 ?74次下載
    <b class='flag-5'>STM32</b>的<b class='flag-5'>智能</b>溫室<b class='flag-5'>控制系統</b>

    自動灌溉控制系統

    ? ? ? ? ? ? ? ? ? ? ? ? ???自動灌溉控制系統?公司產品主要有:滴灌智能控制系統,大田智能
    發表于 12-15 10:37 ?4791次閱讀

    基于FDRE的節水灌溉智能控制系統

    基于FDRE的節水灌溉智能控制系統
    發表于 06-29 14:28 ?26次下載

    單片機控制系統課程設計《基于單片機的大棚智能灌溉控制系統

    單片機控制系統課程設計《基于單片機的大棚智能灌溉控制系統
    發表于 03-07 10:37 ?55次下載

    智慧農業灌溉控制系統

    應用在花卉灌溉、綠化工程等場景下,實現了手機一鍵遠程控制灌溉。 智慧農業灌溉控制系統,由管理云平臺軟件,配合
    的頭像 發表于 11-09 16:08 ?2230次閱讀

    智能灌溉控制系統

    在現代化技術的支撐下,農業灌溉作業也實現了自動化控制,不僅節省了人工灌溉成本,還大大提高了水資源利用效率。慢慢被運用在園林綠化、果蔬種植、菌菇栽培、花園草坪等場景中。 智能
    的頭像 發表于 11-09 16:23 ?2095次閱讀

    景觀綠化智能灌溉控制系統

    灌溉作業。 智能灌溉控制系統方案,基于灌溉區域的實際情況、種植作物的生理狀態,在線獲取灌區的氣象數據、土壤墑情,自動執行云平臺設定的
    的頭像 發表于 11-10 15:20 ?1564次閱讀

    花卉智能灌溉控制系統

    在農業物聯網系統的應用中,智能灌溉控制系統應用廣泛,在花卉種植、大田農業、綠化草坪等場景中都有用武之地。 節水灌溉是在低限的用水量下獲得大產
    的頭像 發表于 12-05 16:14 ?1621次閱讀

    組成灌溉智能控制系統設備

    會在土壤中腐爛。 如果水太低,將無法提供植物生長所需的水。灌溉是在適合植物生長的范圍內,最大限度地增加土壤水分的過程。實現灌溉智能化的前提,是灌溉
    發表于 12-29 16:47 ?402次閱讀

    大田智能灌溉控制系統

    ,不僅僅是浪費人力,而且人工灌溉不能準確地把握土壤墑情多少,導致了不同程度上的灌溉不均勻和水資源的浪費,且灌溉效率低,一旦遇到上千畝、上萬畝的灌溉農田時,顯然就無法應對了。
    的頭像 發表于 02-06 15:16 ?1364次閱讀

    基于ARM9內核的智能灌溉控制系統的設計

    電子發燒友網站提供《基于ARM9內核的智能灌溉控制系統的設計.pdf》資料免費下載
    發表于 10-12 09:47 ?0次下載
    基于ARM9內核的<b class='flag-5'>智能</b><b class='flag-5'>灌溉</b><b class='flag-5'>控制系統</b>的設計

    農業智能灌溉控制系統

    ,農業發達國家除普遍采用噴灌、微灌等節水灌溉技術外,還應用了智能控制技術,也就是農業智能灌溉控制系統
    的頭像 發表于 12-01 17:48 ?1344次閱讀

    智能灌溉控制系統方案

    缺水;二是勞動強度大,難以適應大規模農場的管理需求;三是受氣候、土壤等自然因素影響大,灌溉效果不穩定。 智能灌溉控制系統作為現代農業的重要組成部分,正在逐步改變著傳統農業的生產方式和管
    的頭像 發表于 08-04 11:18 ?1304次閱讀

    花卉智能灌溉控制系統功能應用

    花卉智能灌溉控制系統,作為現代農業技術與信息技術融合的典范,正逐步改變著傳統花卉種植與養護的模式。這一系統的應用,旨在提高灌溉效率,確保花卉
    的頭像 發表于 11-19 17:04 ?257次閱讀

    溫室大棚智能灌溉控制系統

    智能灌溉控制系統是現代農業技術的重要創新之一,旨在實現對溫室大棚內作物灌溉的精準管理,這一系統不僅提高了農作物的產量和質量,降低農業用水量和
    的頭像 發表于 11-20 17:11 ?264次閱讀
    主站蜘蛛池模板: 欧色美| 玖玖激情| 亚洲天堂婷婷| 最近2018免费中文字幕视频| 综合亚洲色图| 天天摸日日摸| 欧美在线色视频| 久久精品免费观看视频| 国产农村妇女毛片精品久久久| 国产成人a一区二区| aaa大片| 天天做天天爽爽快快| 手机看片日韩福利| 精品福利| 欧美18性欧美丶黑吊| 特黄aa级毛片免费视频播放| 综合爱| 三级毛片网站| 狠狠色狠色综合曰曰| 最新激情网站| 久久国产精品岛国搬运工| 日韩草逼| 最近的中文字幕免费动漫视频| 四虎网址| 国产又色又爽又黄的网站在线一级| 97干97吻| 国产精品久久久久久久免费 | 国产高清免费视频| 午夜免费视频网站| 丁香视频在线| 黄色插插插| 日韩高清毛片| 国产va在线| 久久国产精品99久久久久久牛牛| 成人午夜大片免费7777| 亚洲午夜久久久精品影院视色 | 男人j进人女人j 的视频| 性欧美乱又伦| 精品一区视频| 天天操天天噜| 亚洲天堂视频一区|