首页 > 其他分享 >基于STM32的智能灌溉系统

基于STM32的智能灌溉系统

时间:2024-08-06 20:24:53浏览次数:13  
标签:HAL PIN void 灌溉系统 STM32 智能 Init GPIO DHT11

目录

  1. 引言
  2. 环境准备工作
    • 硬件准备
    • 软件安装与配置
  3. 系统设计
    • 系统架构
    • 硬件连接
  4. 代码实现
    • 初始化代码
    • 传感器读取和控制代码
  5. 应用场景
    • 农业灌溉
    • 花园自动灌溉
  6. 常见问题及解决方案
    • 常见问题
    • 解决方案
  7. 结论

1. 引言

智能灌溉系统通过实时监测土壤湿度和环境温度,自动控制灌溉设备的开启和关闭,有效节约水资源,提高灌溉效率。本文将介绍如何使用STM32微控制器设计和实现一个智能灌溉系统。

2. 环境准备工作

硬件准备

  1. STM32开发板(例如STM32F103C8T6)
  2. 土壤湿度传感器(例如YL-69)
  3. 温度传感器(例如DHT11)
  4. 继电器模块(用于控制水泵)
  5. 面包板和连接线
  6. USB下载线

软件安装与配置

  1. Keil uVision:用于编写、编译和调试代码。
  2. STM32CubeMX:用于配置STM32微控制器的引脚和外设。
  3. ST-Link Utility:用于将编译好的代码下载到STM32开发板中。
步骤:
  1. 下载并安装Keil uVision。
  2. 下载并安装STM32CubeMX。
  3. 下载并安装ST-Link Utility。

3. 系统设计

系统架构

智能灌溉系统的基本工作原理是通过STM32微控制器连接土壤湿度传感器和温度传感器,实时监测土壤湿度和环境温度,并通过继电器模块控制水泵的开启和关闭,实现自动灌溉。

硬件连接

  1. 将YL-69土壤湿度传感器的VCC引脚连接到STM32的5V引脚,GND引脚连接到GND,数据引脚连接到STM32的ADC引脚(例如PA0)。
  2. 将DHT11温度传感器的VCC引脚连接到STM32的3.3V引脚,GND引脚连接到GND,数据引脚连接到STM32的GPIO引脚(例如PA1)。
  3. 将继电器模块的控制引脚连接到STM32的GPIO引脚(例如PA2),并通过继电器模块控制水泵。

4. 代码实现

初始化代码

#include "stm32f1xx_hal.h"
#include "adc.h"
#include "dht11.h"
#include "usart.h"

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
static void MX_USART2_UART_Init(void);

int main(void) {
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_ADC1_Init();
  MX_USART2_UART_Init();
  
  DHT11_Init();
  
  while (1) {
    // 读取土壤湿度传感器值
    uint32_t soilMoisture = HAL_ADC_GetValue(&hadc1);
    
    // 读取温度传感器值
    DHT11_DataTypedef DHT11_Data;
    DHT11_ReadData(&DHT11_Data);
    
    // 根据传感器数据控制继电器
    if (soilMoisture < 3000) { // 土壤湿度低于设定值,启动水泵
      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
    } else { // 土壤湿度高于设定值,关闭水泵
      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
    }
    
    // 通过串口输出传感器数据
    char buffer[50];
    sprintf(buffer, "Soil: %lu, Temp: %d.%d C, Hum: %d.%d %%\r\n", 
            soilMoisture,
            DHT11_Data.Temperature, DHT11_Data.TemperatureDecimal,
            DHT11_Data.Humidity, DHT11_Data.HumidityDecimal);
    HAL_UART_Transmit(&huart2, (uint8_t*)buffer, strlen(buffer), HAL_MAX_DELAY);
    
    HAL_Delay(2000);
  }
}

void SystemClock_Config(void) {
  // 配置系统时钟
}

static void MX_GPIO_Init(void) {
  // 初始化GPIO
  __HAL_RCC_GPIOA_CLK_ENABLE();
  
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

static void MX_ADC1_Init(void) {
  // 初始化ADC1
  ADC_ChannelConfTypeDef sConfig = {0};

  hadc1.Instance = ADC1;
  hadc1.Init.ScanConvMode = ADC_SCAN_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;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_55CYCLES_5;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) {
    Error_Handler();
  }

  HAL_ADC_Start(&hadc1);
}

static void MX_USART2_UART_Init(void) {
  // 初始化USART2
  huart2.Instance = USART2;
  huart2.Init.BaudRate = 115200;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart2) != HAL_OK) {
    Error_Handler();
  }
}

传感器读取和控制代码

#include "dht11.h"
#include "adc.h"

void DHT11_Init(void) {
  // 初始化DHT11传感器
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  
  __HAL_RCC_GPIOA_CLK_ENABLE();
  GPIO_InitStruct.Pin = GPIO_PIN_1;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

void DHT11_ReadData(DHT11_DataTypedef *DHT11_Data) {
  uint8_t i, j;
  uint8_t data[5] = {0};
  
  // 启动信号
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
  HAL_Delay(18);
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
  HAL_Delay(20);
  
  // 等待DHT11响应
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
  HAL_Delay(40);
  
  // 读取数据
  for (j = 0; j < 5; j++) {
    for (i = 0; i < 8; i++) {
      while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_RESET);
      HAL_Delay(40);
      if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_SET) {
        data[j] |= (1 << (7 - i));
      }
      while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_SET);
    }
  }
  
  DHT11_Data->Humidity = data[0];
  DHT11_Data->HumidityDecimal = data[1];
  DHT11_Data->Temperature = data[2];
  DHT11_Data->TemperatureDecimal = data[3];
}

uint32_t ReadSoilMoisture(void) {
  // 读取土壤湿度传感器值
  return HAL_ADC_GetValue(&hadc1);
}

void ControlPump(GPIO_PinState state) {
  // 控制水泵的开启和关闭
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, state);
}

⬇帮大家整理了单片机的资料

包括stm32的项目合集【源码+开发文档】

点击下方蓝字即可领取,感谢支持!⬇

点击领取更多嵌入式详细资料

问题讨论,stm32的资料领取可以私信!

5. 应用场景

农业灌溉

本系统可以应用于农业灌溉,通过自动监测土壤湿度和环境温度,智能控制灌溉设备,提高农业生产效率,节约水资源。

花园自动灌溉

本系统还可以应用于家庭花园的自动灌溉,通过实时监测花园的土壤湿度,自动控制灌溉设备,确保植物健康生长。

6. 常见问题及解决方案

常见问题

  1. 土壤湿度传感器读取不准确
    • 检查土壤湿度传感器的连接是否正确。
    • 确认传感器的校准是否正确。
  2. 温度传感器读取错误
    • 检查DHT11传感器的连接是否正确。
    • 确认传感器的校准是否正确。

解决方案

  1. 校准传感器
    • 使用已知环境校准土壤湿度传感器和DHT11传感器,确保读取值准确。
  2. 检查连接
    • 确认STM32和传感器的连接无误,确保传感器工作正常。

7. 结论

本文介绍了如何使用STM32微控制器和多种传感器实现一个智能灌溉系统,从硬件准备、环境配置到代码实现,详细介绍了每一步的操作步骤。通过本文的学习,读者可以掌握基本的嵌入式开发技能,并将其应用到实际项目中。

 

标签:HAL,PIN,void,灌溉系统,STM32,智能,Init,GPIO,DHT11
From: https://blog.csdn.net/2401_84204806/article/details/140965409

相关文章

  • 想学习人工智能、大语言模型?这份学习路线与免费学习资源最值得推荐
    想学习人工智能吗?但不知道如何开始?要熟练掌握人工智能相关的技术,光学习很多课程是不够的。为了摆脱只是跟着教程学习,你需要亲自动手,从头开始编写算法,动手实践,并通过使用人工智能解决问题来做一些有趣的边项目。这篇文章试图创建一份免费的课程路径,希望对大家学习有帮助。(注......
  • 基于K210智能人脸识别+车牌识别系统(完整工程资料源码)
    运行效果:基于K210的智能人脸与车牌识别系统工程目录:运行效果:目录:前言:一、国内外研究现状与发展趋势二、相关技术基础2.1人脸识别技术2.2车牌识别技术三、智能小区门禁系统设计3.1系统设计方案3.2系统设计目标3.3智能小区门禁系统硬件设计3.3.1控制模块......
  • (连续四届EI检索|稳定ACM出版、EI检索|线上线下结合)2024年第五届医学人工智能国际学术
    第五届医学人工智能国际学术会议(ISAIMS2024)将于2024年8月13-17日于荷兰阿姆斯特丹自由大学召开,国内分会场将于2024年10月25-27日于中国武汉召开。会议自2020年至今已经成功举办四届,吸引了来自海内外相关领域学者600余名。本届会议将继续围绕人工智能在医学领域的最新研究成果,为......
  • 智能加速计算卡设计原理图:628-基于VU3P的双路100G光纤加速计算卡 XCVU3P板卡
    基于VU3P的双路100G光纤加速计算卡  一、板卡概述     基于XilinxUltraScale+16nmVU3P芯片方案基础上研发的一款双口100GFPGA光纤以太网PCI-Expressv3.0x16智能加速计算卡,该智能卡拥有高吞吐量、低延时的网络处理能力以及辅助CPU进行网络功能......
  • 大模型与人工智能有什么区别?看完涨知识了
    前言人工智能是一个广泛的概念,涵盖了多个领域和技术,旨在实现各种智能化应用。大模型则是人工智能领域中的一个特定技术或方法,主要通过构建规模庞大的模型来处理复杂任务。随着科技的飞速发展,人工智能(ArtificialIntelligence,简称AI)已经成为了我们生活中不可或缺的一部分。......
  • 智能猫砂盆pcba解决方案设计
    大多数养猫家庭都经常要做铲猫砂的工作,传统的猫砂盆气味大、细菌多,在多猫使用的情况下几天就需要更换一次猫砂,还要对猫砂盆进行清理除菌。面对这种情况而言,铲屎官们可以选择使用智能猫砂盆,不仅可以轻松清理猫砂,而且能够封锁气味1.自动清理与除臭系统:内置智能感应装置,当猫......
  • 使用智能AI在农业养殖业中风险预警的应用
    一、前言之前写过一篇《物联网浏览器(IoTBrowser)-使用深度学习开发防浸水远程报警》文章,主要介绍了通过摄像头麦克风监测浸水报警器有无异常,当出现异常后进行紧急报警并推送微信通知,避免浸水导致房屋损失。基于深度学习和物联网技术继续探讨在农业养殖领域的应用和实践。 监......
  • (CubeIDE/CubeMX STM32引脚布局)将配置的引脚转移到其它引脚
            新建了项目,配置好引脚,但是想将原先的配置换到别的引脚上,我教大家一个方法。    这里以STM32F103芯片为例,其它芯片也同样适用,先打开工程,如下图所示。     假设我现在想使用PA7点灯,但是现在PA7被SPI1占用了,那我们需要知道还有没有其它引脚可......
  • STM32启动文件,在启动文件中理解IAP
    ;********************(C)COPYRIGHT2017STMicroelectronics********************;*FileName:startup_stm32f103xe.s;*Author:MCDApplicationTeam;*Description:STM32F103xEDevicesvectortableforMDK-ARMtoolchain.;*......
  • 数字人客服:让人机互动更加自然、智能的新技术!
    随着科技的不断发展,数字人客服已经成为了一种让人机互动更加自然、智能的新技术。数字人客服是一种基于人工智能技术的虚拟客服,它能够通过自然语言处理、语音识别、机器学习等技术,实现与用户的自然、智能的交互。数字人客服的主要特点包括:1、自然语言处理:数字人客服能够理......