实用指南:外设模块学习(14)——雨滴传感器、土壤湿度传感器(STM32实现)
目录
本次我们继续学习俩传感器,分别是雨滴传感器以及土壤湿度传感器,顾名思义,就是用于检测雨水量以及检测土壤湿度的传感器,如下图所示。

最右边就是雨滴传感器核心部件、中间是土壤湿度传感器核心部件,最左边是大家应该很熟悉的器件,用于调节检测灵敏度的比较器电路,可以通过调节蓝色电位器修改检测阈值(也就是判断雨水是否够多、土壤湿度是否够大),然后可以看见一共6个管脚,分别对应与传感器部件(2个引脚)和控制器(4个引脚)连接的引脚,详细内容下面来介绍。
一、雨滴传感器
1.1 雨滴传感器介绍
雨滴传感器是一种传感装置,主要用于检测是否下雨及雨量的大小,可用于天气状况的监测,可以检测有没有下雨。
这个传感器之所以能够检测雨水量,得益于它的感应板上分布了多排裸露的铜导线,他们可以充当一个可调电阻(电位器),这个电阻可以根据感应到的水量发生变化。

简单来说也就是:
(1)感应板上雨水越多,电阻越低,传导能力越强;
(2)感应板上雨水越少,电阻越高,导电性就变差。
所以当雨水滴落时,水分的增加使得电阻变小,导电性增强;反之,水分减少时,电阻增大,导电性降低。传感器会根据电阻变化输出不同大小的电压,我们可以连接单片机(如STM32、51等)的端口进而获取电压大小,进而获取当前外界环境雨水量,最终实现对当前天气的简单预测。
1.2 相关参数
名称 | 雨滴传感器 |
工作电压 | DC 3.3~5V |
比较器 | LM393 |
工作电流 | 15mA |
输出方式 | AO、DO |
1.3 硬件构成
正如前面所述,雨滴传感器硬件主要由两部分构成:雨水感应板和电子模块,如下图所示。

1.3.1 感应板(垫)
这是实现检测雨水量的核心部件,所以传感器核心原理也在此,前面简单介绍过,这里再详细说一下:
雨滴传感器有一个感应板,板上布满了一系列裸露的铜导线,这些导线通常放置在户外,可能安装在屋顶或者任何能直接受到雨水影响的地方。
这些导线通常是不连接的,而是通过水的桥接作用来传导电流。当水滴落在导线表面时,水的存在使得导线之间形成电流通路。水越多,导电性越强,电阻越低。
1.3.2 电子模块
传感器还有一个电子模块,它的2引脚那端会连接感应板,另一端4引脚会连接使用的单片机。这个模块可以根据感应板的电阻变化产生不同电压,然后通过模拟输出(AO)引脚提供给单片机(如STM32、51等)。

同时,该模拟量还会送到LM393高精度比较器进行数字化处理,输出结果能够通过数字输出(DO)引脚传给单片机。而且模块上放置了一个蓝色电位器,可以调节数字输出的灵敏度,换句话说,调节电位器旋钮可以设定雨水量阈值:当水量超过阈值时,数字输出DO引脚就会输出低电平,否则输出高电平。简单来说即:顺时针旋转旋钮可以增加灵敏度,逆时针旋转则减少灵敏度。
此外,模块上还有两个LED灯:电源LED,当模块通电时亮起;状态LED,当数字输出为低电平时亮起,表示感应到一定量雨水。
1.3.3 原理图

1.4 引脚定义及功能
引脚名称 | 功能描述 |
VCC | 电源正极,接3.3V~5V |
GND | 电源负极,接地 |
DO | 数字输出,0-超过阈值,1-低于阈值 |
AO | 模拟输出,描述雨水量 |
1.5 参考代码(STM32)
接下来,根据其原理基于STM32给出参考测试代码,该代码基于寄存器方式进行编写,当然由于传感器原理比较简单,因此逻辑应该容易理解。
1.5.1 rain.h
/*
* @Descripttion: 雨水传感器驱动文件(.h)
* @Author: JaRyon
* @version:
* @Date: 2025-11-03 07:49:56
*/
#ifndef __RAIN_H
#define __RAIN_H
#include "stm32f10x.h"
/**
* 引脚接线
*
* VCC ---> 3.3/5V
* GND ---> GND
* DO ---> PA0
* AO ---> PA1
*
*/
void Rain_Init(void);
uint8_t Rain_Detect(void);
#endif
/*** (C) COPYRIGHT 2025 END OF FILE ***/
1.5.2 rain.c
/*
* @Descripttion: 雨水传感器驱动文件(.c)
* @Author: JaRyon
* @version:
* @Date: 2025-11-02 10:19:57
*/
#include "rain.h"
/**
* @brief 雨水传感器初始化
* @param void 无
* @return void
* @example Rain_Init();
* @attention
*/
void Rain_Init(void)
{
// 1. 开启时钟 PA
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
// 2. DO-PA0 浮空输入 mode-00 cnf-01
GPIOA->CRL &= ~GPIO_CRL_MODE0;
GPIOA->CRL |= GPIO_CRL_CNF0_0;
GPIOA->CRL &= ~GPIO_CRL_CNF0_1;
}
/**
* @brief 检测雨水量,获取状态
* @param void 无
* @return uint8_t
* @example uint8_t gasState = Rain_Detect();
* @attention
*/
uint8_t Rain_Detect(void)
{
uint8_t rainState = 0;
if (GPIOA->IDR & GPIO_IDR_IDR0)
{
rainState = 1;
}
return rainState;
}
1.5.3 adc.h
1.5.4 adc.c
这部分可以参考前面使用的ADC代码如下
1.5.5 main.c
雨水量超过设定阈值,PC13连接的LED点亮,同时屏幕显示特定字符,反之LED熄灭,同样显示指定字符。
/*
* @Descripttion: 雨水传感器测试程序
* @Author: JaRyon
* @version:
* @Date: 2025-11-02 10:19:57
*/
#include "stm32f10x.h"
#include
#include "Systick.h"
#include "oled.h"
#include "rain.h"
#include "LED.h"
#include "adc.h"
int main(void)
{
uint32_t waitTimes = 0;
char *str = "Normal";
double RainIntensity = 0, RainRes = 0.0;
uint8_t count = 0;
// 初始化
Systick_Init();
LED_Init();
OLED_Init();
OLED_ClearAll();
ADC1_Init();
Rain_Init();
ADC1_StartConvert();
waitTimes = Systick_GetTick();
while (1)
{
if (Systick_GetTick() - waitTimes >= 10000)
{
if (Rain_Detect() == 0)
{
str = "rainDrops";
LED_On(LED1);
}
else
{
str = "Normal";
LED_Off(LED1);
}
// 提高精度 算10次均值
RainIntensity += (3.3 - ADC1_GetVol()) * 100 / 3.3;
count++;
if (count >= 10)
{
RainRes = RainIntensity / count;
count = 0;
RainIntensity = 0;
}
waitTimes = Systick_GetTick();
}
OLED_ShowString(63 - 8 * strlen(str) / 2, 27, str, 8);
OLED_ShowString(25, 45, "RI:", 8);
OLED_ShowFloat(53, 45, RainRes, 3, 1, 8);
OLED_Update();
}
}
二、土壤湿度传感器
2.1 土壤湿度传感器介绍
土壤湿度检测是现代智能农业、园林自动灌溉系统中的重要组成部分。本次介绍的四针式土壤湿度传感器模块可以通过探头的两个导电电极以及电子模块实现对土壤湿度的监测。
该传感器成本低、可靠性高、易于集成等,常用于土壤湿度监测等其他应用场景。
2.2 相关参数
| 参数 | 规格 |
|---|---|
| 工作电流 | 约15-20mA |
工作电压 | DC 3.3~5V |
| 模拟输出范围 | 0-VCC |
| 数字输出电平 | 0V或VCC |
| 响应时间 | <1s |
| 工作温度 | -10°C ~ +60°C |
2.3 硬件构成
土壤湿度传感器同样也由土壤探头以及电子模块由两部分组成,其中电子模块与前面介绍的雨滴传感器使用的电子模块一模一样,这里不再赘述。因此下面主要介绍其土壤探头。

2.3.1 土壤探头
这个探头部分是检测土壤湿度的核心部件,只需要将该探头插进土壤中即可。其检测原理如下:
该探头由两个导电电极组成,然后将这俩导电电极插进土壤中时,土壤水分含量会影响电极间的电阻值,土壤的水分含量越高,导电性越强,电阻越低。然后通过模块上的其他电路转换成电压,原理与雨滴传感器比较类似。
2.3.2 电子模块
由于土壤湿度传感器的电子模块与前面雨滴传感器使用的电子模块一模一样,原理类似,因此这里不再赘述。
2.3.3 原理图

2.4 引脚定义及功能
引脚名称 | 功能描述 |
VCC | 电源正极,接3.3V~5V |
GND | 电源负极,接地 |
DO | 数字输出,0-超过阈值,1-低于阈值 |
AO | 模拟输出,描述土壤湿度高低 |
2.5 参考代码(STM32)
接下来,根据其原理基于STM32给出参考测试代码,该代码基于寄存器方式进行编写,当然由于传感器原理比较简单,因此逻辑应该容易理解。
2.5.1 soilhum.h
/*
* @Descripttion: 土壤湿度传感器驱动文件(.h)
* @Author: JaRyon
* @version:
* @Date: 2025-11-03 8:22:12
*/
#ifndef __SOILHUM_H
#define __SOILHUM_H
#include "stm32f10x.h"
/**
* 引脚接线
*
* VCC ---> 3.3/5V
* GND ---> GND
* DO ---> PA0
* AO ---> PA1
*
*/
void SoilHum_Init(void);
uint8_t SoilHum_Detect(void);
#endif
/*** (C) COPYRIGHT 2025 END OF FILE ***/
2.5.2 soilhum.c
/*
* @Descripttion: 土壤湿度传感器驱动文件(.c)
* @Author: JaRyon
* @version:
* @Date: 2025-11-03 8:22:12
*/
#include "soilhum.h"
/**
* @brief 雨水传感器初始化
* @param void 无
* @return void
* @example SoilHum_Init();
* @attention
*/
void SoilHum_Init(void)
{
// 1. 开启时钟 PA
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
// 2. DO-PA0 浮空输入 mode-00 cnf-01
GPIOA->CRL &= ~GPIO_CRL_MODE0;
GPIOA->CRL |= GPIO_CRL_CNF0_0;
GPIOA->CRL &= ~GPIO_CRL_CNF0_1;
}
/**
* @brief 检测雨水量,获取状态
* @param void 无
* @return uint8_t
* @example uint8_t soilHumState = SoilHum_Detect();
* @attention
*/
uint8_t SoilHum_Detect(void)
{
uint8_t soilHumState = 0;
if (GPIOA->IDR & GPIO_IDR_IDR0)
{
soilHumState = 1;
}
return soilHumState;
}
2.5.3 adc.h
2.5.4 adc.c
这部分同样可以参考前面使用的ADC代码如下
2.5.5 main.c
土壤湿度超过设定阈值,PC13连接的LED点亮,同时屏幕显示特定字符,反之LED熄灭,同样显示指定字符。
/*
* @Descripttion: 土壤湿度传感器测试程序
* @Author: JaRyon
* @version:
* @Date: 2025-11-03 8:22:12
*/
#include "stm32f10x.h"
#include
#include "Systick.h"
#include "oled.h"
#include "soilhum.h"
#include "LED.h"
#include "adc.h"
int main(void)
{
uint32_t waitTimes = 0;
char *str = "Normal";
double SoilHum = 0, SoilHumRes = 0.0;
uint8_t count = 0;
// 初始化
Systick_Init();
LED_Init();
OLED_Init();
OLED_ClearAll();
ADC1_Init();
SoilHum_Init();
ADC1_StartConvert();
waitTimes = Systick_GetTick();
while (1)
{
if (Systick_GetTick() - waitTimes >= 10000)
{
if (SoilHum_Detect() == 0)
{
str = "HumOver";
LED_On(LED1);
}
else
{
str = "Normal";
LED_Off(LED1);
}
// 提高精度 算10次均值
SoilHum += (3.3 - ADC1_GetVol()) * 100 / 3.3;
count++;
if (count >= 10)
{
SoilHumRes = SoilHum / count;
count = 0;
SoilHum = 0;
}
waitTimes = Systick_GetTick();
}
OLED_ShowString(63 - 8 * strlen(str) / 2, 27, str, 8);
OLED_ShowString(25, 45, "SH:", 8);
OLED_ShowFloat(53, 45, SoilHumRes, 3, 1, 8);
OLED_Update();
}
}
三、小结
本文介绍了雨滴传感器和土壤湿度传感器的原理及应用,两种传感器均包含电子模块,提供模拟和数字输出,并可通过电位器调节灵敏度。本文详细说明了传感器参数、硬件构成、引脚定义,并提供了基于STM32的驱动代码测试程序,包括初始化设置、检测函数及主程序逻辑,可用于实际检测以及学习使用。
以上便是本次文章的所有内容,欢迎各位朋友在评论区讨论,本人也是一名初学小白,愿大家共同努力,一起进步吧!
鉴于笔者能力有限,难免出现一些纰漏和不足,望大家在评论区批评指正,谢谢!
浙公网安备 33010602011771号