STM32土壤湿度传感器学习指南
STM32是一款非常流行的微控制器,广泛应用于各种嵌入式系统中。在本篇文章中,我们将介绍如何使用STM32来读取土壤湿度传感器的数据。本文将包含以下几个部分:
- 硬件准备
- 传感器原理
- 传感器接线
- STM32代码实现
硬件准备:
为了完成本次任务,我们需要准备以下硬件:
- STM32开发板:这里我们选择了最常用的STM32F103C8T6开发板。
- 土壤湿度传感器:常用的土壤湿度传感器有许多种类,如YL-69、YL-38等。在本文中,我们将使用YL-69传感器。
- 杜邦线:用于连接STM32开发板与传感器。
传感器原理:
土壤湿度传感器通过测量土壤中的电导率来判断土壤的湿度。当土壤湿度较高时,土壤中的离子浓度也较高,电导率也较大。当土壤湿度较低时,土壤中的离子浓度也较低,电导率也较小。
传感器接线:
接下来,我们需要将传感器与STM32开发板进行连接。在本文中,我们将使用以下接线方式:
- 将传感器的VCC引脚连接到STM32开发板的5V引脚。
- 将传感器的GND引脚连接到STM32开发板的GND引脚。
- 将传感器的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.