STM32土壤湿度传感器学习指南

STM32是一款非常流行的微控制器,广泛应用于各种嵌入式系统中。在本篇文章中,我们将介绍如何使用STM32来读取土壤湿度传感器的数据。本文将包含以下几个部分:

  1. 硬件准备
  2. 传感器原理
  3. 传感器接线
  4. STM32代码实现

硬件准备:

为了完成本次任务,我们需要准备以下硬件:

  1. STM32开发板:这里我们选择了最常用的STM32F103C8T6开发板。
  2. 土壤湿度传感器:常用的土壤湿度传感器有许多种类,如YL-69、YL-38等。在本文中,我们将使用YL-69传感器。
  3. 杜邦线:用于连接STM32开发板与传感器。

传感器原理:

土壤湿度传感器通过测量土壤中的电导率来判断土壤的湿度。当土壤湿度较高时,土壤中的离子浓度也较高,电导率也较大。当土壤湿度较低时,土壤中的离子浓度也较低,电导率也较小。

传感器接线:

接下来,我们需要将传感器与STM32开发板进行连接。在本文中,我们将使用以下接线方式:

  1. 将传感器的VCC引脚连接到STM32开发板的5V引脚。
  2. 将传感器的GND引脚连接到STM32开发板的GND引脚。
  3. 将传感器的OUT引脚连接到STM32开发板的PA0引脚。

STM32代码实现:

在本节中,我们将使用STM32CubeIDE来编写代码。

首先,我们需要创建一个新的STM32项目。在创建项目时,选择正确的芯片型号(STM32F103C8T6)和开发板(NUCLEO-F103RB)。

一旦项目创建完成,我们可以开始编写代码。首先,我们需要在main函数中初始化GPIO和ADC:

#include "stm32f1xx_hal.h"

ADC_HandleTypeDef hadc1;

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

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_ADC1_Init();

  while (1)
  {

  }
}

接下来,我们需要在MX_ADC1_Init函数中配置ADC:

void MX_ADC1_Init(void)
{
  ADC_ChannelConfTypeDef sConfig = {0};

  __HAL_RCC_ADC1_CLK_ENABLE();

  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 = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
}

然后,我们需要在MX_GPIO_Init函数中配置GPIO引脚:

void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  __HAL_RCC_GPIOA_CLK_ENABLE();

  GPIO_InitStruct.Pin = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

接下来,我们可以编写代码来读取土壤湿度传感器的数值:

uint16_t soil_moisture;

while (1)
{
  HAL_ADC_Start(&hadc1);
  HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
  soil_moisture = HAL_ADC_GetValue(&hadc1);
  HAL_ADC_Stop(&hadc1);
}

上述代码中,我们首先启动ADC转换,然后等待转换完成,并将转换结果存储在soil_moisture变量中。最后,停止ADC转换。

现在,我们可以使用soil_moisture变量来获取土壤湿度传感器的数值。如果我们想要将土壤湿度以百分比的形式显示,我们可以使用以下公式:

soil_moisture_percent = (float)soil_moisture / 4095 * 100;

上述公式将ADC读数映射到0-100的百分比范围内。

最后,我们可以使用串口输出将土壤湿度传感器的数值打印出来:

char uart_msg[50];

sprintf(uart_msg, "Soil Moisture: %.2f %%\r\n", soil_moisture_percent);
HAL_UART_Transmit(&huart2, (uint8_t *)uart_msg, strlen(uart_msg), HAL_MAX_DELAY);

上述代码中,我们使用sprintf函数将土壤湿度格式化为字符串,并使用HAL_UART_Transmit函数将字符串通过串口发送。

为了使上述代码正常工作,我们还需要在STM32CubeIDE中进行一些配置。首先,在Project Explorer窗口中选择"Core"选项卡,然后双击"Src"文件夹。选择main.c文件并右击,选择Properties。在弹出的对话框中选择"C/C++ Build" -> "Settings" -> "Tool Settings" -> "Target" -> "C/C++ Compiler"。在"Defines"栏中添加以下内容:

USE_HAL_DRIVER

然后,在"Tool Settings" -> "Target" -> "Linker"中的"Libraries"栏添加以下内容:

m
c
gcc
stm32f1

最后,在"Tool Settings" -> "Target" -> "Linker"中的"Script"栏中选择正确的链接脚本文件。

现在,我们可以编译代码并下载到STM32开发板中。在下载完成后,我们可以通过串口监视器来查看土壤湿度传感器的数值。

综上所述,本文详细介绍了如何使用STM32读取土壤湿度传感器的数值。通过上述代码和方法,我们可以方便地获取土壤湿度,并据此决定是否需要浇水。

作者:大黄鸭duck.

物联沃分享整理
物联沃-IOTWORD物联网 » STM32土壤湿度传感器学习指南

发表回复