基于STM32F103zet6雨滴传感器的简单使用(学习传感器篇一)

目录

一、雨滴传感器的基本原理

二、STM32CubeMX的配置

三、通过stm32单片机采集数值

四、整体代码


一、雨滴传感器的基本原理

雨滴传感器是一种用于检测雨水的设备,当雨滴落在传感器表面时,改变了板间的介电常数,导致电容值发生变化。电子电路监测这些变化,并将其转换为相应的电信号输出。

主要的两种使用方法:

①通过DO引脚输出的高低电平变化来检测是否有雨滴

②通过AO引脚输出的ADC值观察数值的变化检测是否有雨滴

雨滴传感器的设计和选择应根据具体应用需求,如灵敏度、响应时间、工作环境等来确定。

二、STM32CubeMX的配置

以配置ADC为例

①配置RCC

②配置时钟树(STM32F103ZET6主频72MHZ)

③配置AO引脚为ADC(另一种方式主要就是配置一个引脚为输入模式与DO相连)

④配置串口(目的是将数据打印到串口调试助手上观察)

⑤设置一下工程,最后生成一下代码完美

三、通过stm32单片机采集数值

配置完成后打开keil5,编译一下这是常识。采集过程如下

HAL_ADC_Start(&hadc1);——-开启ADC1这是必须的

HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);———-等待转换完成,可有可无

HAL_ADC_GetValue(&hadc1);———获取ADC的值

最后将数值发送到串口观察即可,当然也可以将ADC的值转换成电压幅值观察。

可以看到在无水状态下时传感器输出的ADC值为4056左右,因为stm32单片机是12位ADC,当有水滴滴落时它会降低电阻,因为水是电的导体,并且水的存在使镍线并联连接,因此降低了电阻并降低了其两端的电压降。

四、整体代码

#include "main.h"
#include "usart.h"
#include "gpio.h"
#include "stdio.h"
#include "string.h"

char buf[100];
void SystemClock_Config(void);
int main(void)
{

  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();

  // 开始ADC转换
  HAL_ADC_Start(&hadc1);

  while (1)
  {
    // 等待转换完成
    HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
    // 获取ADC值
    uint32_t adc_value = HAL_ADC_GetValue(&hadc1);
    sprintf(buf,"rian value:%d\n",adc_value);//也可以转换成电压幅值发送到串口上
    HAL_UART_Transmit(&huart1,(uint8_t *)buf,sizeof(buf),10000);
    memset(buf,0,sizeof(buf));
    // 根据adc_value处理雨滴数据
    if (adc_value > 2000) // 你可以根据需要调整阈值
    {
      // 没有检测到雨滴
      sprintf(buf,"rian faild\n");
      HAL_UART_Transmit(&huart1,(uint8_t *)buf,sizeof(buf),10000);
    }
    else
    { 
      // 检测到雨滴
      sprintf(buf,"rian successful\n");
      HAL_UART_Transmit(&huart1,(uint8_t *)buf,sizeof(buf),10000);
    }

  }

}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  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_2) != HAL_OK)
  {
    Error_Handler();
  }
}

DO方式:

      // 读取PA0引脚的状态
    GPIO_PinState State = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);

    // 根据引脚状态处理雨滴检测
    if (State == GPIO_PIN_RESET) // DO输出低电平,表示检测到雨滴
    {
      // 检测到雨滴
      // 在这里执行相应的操作,例如点亮LED灯 方便观察水滴
      HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_RESET); // PE5连接LED1
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET); // PB5连接LED2
    }
    else // DO输出高电平,表示没有雨滴
    {
      // 没有检测到雨滴
      // 在这里执行相应的操作,例如关闭LED灯
      HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_SET); // PE5连接LED1
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET); // PB5连接LED2
    }
 
    HAL_Delay(1000); // 延迟1秒

作者:m0_75082707

物联沃分享整理
物联沃-IOTWORD物联网 » 基于STM32F103zet6雨滴传感器的简单使用(学习传感器篇一)

发表回复