一篇文章教会你雨滴感应(水位显示)模块测量水位,附STM32代码示例

目录

一、雨滴感应模块介绍:

(1)产品特点:

(2)功能介绍:

(3)接线方式:

二、AO与DO介绍:

(1)AO(模拟信号输出):

(2)DO(数字信号输出):

(3)总结:

三、ADC:

(1)STM32 ADC介绍:

(2)ADC主要特征:

四、代码编写:

(1)初始化ADC:

(2)ADC值获取:

(3)转换到0-100范围:

五、效果演示:

(1)主函数:

(2)效果:

六、代码下载:


一、雨滴感应模块介绍:

(1)产品特点:

  • 材料与尺寸:采用高品质FR-04双面材料,尺寸为5.0*4.0CM,表面镀镍处理,抗氧化、导电性好,寿命长。

  • 输出信号:提供干净的比较器输出信号,波形良好,驱动能力强(超过15mA)。

  • 灵敏度调节:通过电位器调节灵敏度。

  • 工作电压:支持3.3V至5V的工作电压。

  • 输出形式:支持数字开关量输出(0和1)和模拟量AO电压输出。

  • 安装便利:设有固定螺栓孔,方便安装。

  • PCB尺寸:小板PCB尺寸为3.2cm x 1.4cm。

  • 比较器:使用宽电压LM393比较器。

(2)功能介绍:

  • 电源指示:接上3-5V电源后,电源指示灯亮。

  • 数字输出(DO):在感应板上没有水滴时,DO输出为高电平,开关指示灯灭;滴上一滴水后,DO输出为低电平,开关指示灯亮;刷掉水滴后,输出恢复为高电平状态。

  • 模拟输出(AO):AO模拟输出可以连接单片机的AD口,用于检测滴在上面的雨量大小。

  • 数字输出应用:DO TTL数字输出也可以连接单片机,用于检测是否有雨。

(3)接线方式:

  • VCC:接电源正极(3-5V)。

  • GND:接电源负极。

  • DO:TTL开关信号输出。

  • AO:模拟信号输出。

二、AO与DO介绍:

AO(模拟信号输出)和DO(数字信号输出)是传感器或电子设备中常见的两种输出类型。

(1)AO(模拟信号输出):

  • 性质:模拟信号是连续变化的信号,其值可以在一定范围内取任意值。例如,电压可以在0V到5V之间连续变化。

  • 应用:模拟信号常用于需要精确测量物理量变化的应用,如温度、压力、光强等。它能够提供更细腻的测量结果,适合于需要连续变化数据的场景。

  • 处理:模拟信号通常需要通过模数转换器(ADC)转换为数字信号,才能被数字系统(如微控制器、计算机等)处理。

  • 优点:能够提供较高的测量精度和分辨率。

  • 缺点:容易受到噪声干扰,传输距离有限,抗干扰能力相对较弱。

(2)DO(数字信号输出):

  • 性质:数字信号是不连续的信号,其值只有两种状态,通常表示为高电平和低电平。例如,高电平可能表示为5V,低电平表示为0V。

  • 应用:数字信号常用于需要进行开关控制或状态检测的应用,如检测水滴、按钮按下等。它适用于需要明确状态指示或控制信号的场景。

  • 处理:数字信号可以直接被数字系统处理,无需转换。

  • 优点:抗干扰能力强,传输距离远,信号稳定可靠。

  • 缺点:相比模拟信号,可能无法提供连续的测量数据,精度和分辨率可能较低。

(3)总结:

AO(模拟信号输出)提供连续变化的信号,适用于需要精细测量和连续数据的场景,但容易受到噪声干扰;DO(数字信号输出)则提供离散的高或低电平信号,适用于开关控制和状态检测,具有更强的抗干扰能力。选择AO或DO取决于应用需求:模拟信号适合精确测量,数字信号适合状态指示和控制。

三、ADC:

(1)STM32 ADC介绍:

  • STM32的ADC为12位ADC,是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。
  • 模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。
  • ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生。

(2)ADC主要特征:

  • STM32的ADC模块是一个12位分辨率的模数转换器,具备多种功能,包括在转换结束或发生模拟看门狗事件时产生中断、支持单次和连续转换模式、自动扫描模式、自校准、数据对齐、可编程采样间隔、外部触发选项、间断模式和双重模式。它还支持DMA请求以提高数据传输效率。STM32不同系列的ADC转换时间有所不同,供电要求为2.4V到3.6V,输入范围由VREF-和VREF+决定(VREF- ≤ VIN ≤ VREF+)。此外,如果存在VREF-引脚,需要将其与VSSA相连。

  • ADC3的规则转换和注入转换触发与ADC1和ADC2的不同。
  • TIM8_CH4和TIM8_TRGO及它们的重映射位只存在于大容量产品中。

四、代码编写:

(1)初始化ADC:

注意:ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生。

// 初始化ADC,采用ADC单通道转换
void ADCSingle_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);  		// 使能ADC1和GPIOA的时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  		// ADC通常位于APB2总线上

    RCC_ADCCLKConfig(RCC_PCLK2_Div6);                    	// 配置ADC时钟,选择PCLK2的6分频,即ADCCLK = 72MHz / 6 = 12MHz

    GPIO_InitTypeDef GPIO_InitStructure;                  	// 定义GPIO初始化结构体
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;        	// 设置GPIO模式为模拟输入
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;            	// 设置引脚为PA0
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    	// 设置引脚速度为50MHz
    GPIO_Init(GPIOA, &GPIO_InitStructure);               	// 初始化GPIOA的PA0引脚

    ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); // 配置ADC的规则通道,选择通道0,采样时间为55.5周期

    // ADC初始化
    ADC_InitTypeDef ADC_InitStructure;                  					// 定义ADC初始化结构体
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; 						// 设置ADC工作模式为独立模式
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;				 	// 设置数据对齐方式为右对齐
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; 	// 设置外部触发转换为无触发
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; 					// 设置为不连续转换模式
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;      						// 设置为不扫描模式
    ADC_InitStructure.ADC_NbrOfChannel = 1;             					// 设置通道数目为1
    ADC_Init(ADC1, &ADC_InitStructure);                						// 初始化ADC1

    // ADC使能
    ADC_Cmd(ADC1, ENABLE);                              		// 使能ADC1

    // ADC校准,内部电路自动执行校准
    ADC_ResetCalibration(ADC1);                         		// 重置ADC校准寄存器
    while (ADC_GetResetCalibrationStatus(ADC1) == SET); 		// 等待校准重置完成
    ADC_StartCalibration(ADC1);                         		// 开始校准
    while (ADC_GetCalibrationStatus(ADC1) == SET);      		// 等待校准完成
}
  • 时钟配置:

    • 使能ADC1和GPIOA接口的时钟。

    • 配置ADC时钟为PCLK2的6分频,得到12MHz的ADCCLK。

  • GPIO配置:

    • 设置GPIOA的PA0引脚为模拟输入模式(GPIO_Mode_AIN)。

    • 设置GPIO引脚速度为50MHz(GPIO_Speed_50MHz)。

  • ADC通道配置:

    • 配置ADC1的规则通道,选择通道0(对应PA0引脚)。

    • 设置采样时间为55.5个周期(ADC_SampleTime_55Cycles5)。

  • ADC初始化配置:

    • 设置ADC工作模式为独立模式(ADC_Mode_Independent)。

    • 设置数据对齐方式为右对齐(ADC_DataAlign_Right)。

    • 设置外部触发转换为无触发(ADC_ExternalTrigConv_None)。

    • 设置为不连续转换模式(ADC_ContinuousConvMode = DISABLE)。

    • 设置为不扫描模式(ADC_ScanConvMode = DISABLE)。

    • 设置通道数目为1(ADC_NbrOfChannel = 1)。

  • ADC使能:

    • 使能ADC1模块。

  • ADC校准:

    • 重置ADC校准寄存器。

    • 等待校准重置完成。

    • 开始ADC校准。

    • 等待校准完成。

(2)ADC值获取:

启动STM32的ADC1模块进行一次软件触发的模拟到数字转换,并等待转换结束,最后返回转换得到的数值结果。这个数值是一个16位的数字,代表了对应模拟输入信号的数字量。

// 获取ADC转换的值
uint16_t ADCSingle_GetValue(void)
{
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);             		// 启动ADC1的软件转换
    while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); 	// 等待转换结束
    return ADC_GetConversionValue(ADC1);               			// 返回转换结果
}

(3)转换到0-100范围:

通过ADC获取的12位原始值(范围0-4095)转换为0-100的百分比形式,以便于表示和使用。

//将ADC获取的值转换到0-100。
float Scope_convert(void)
{
    uint16_t ADC;
	float Scope;
    ADC = ADCSingle_GetValue(); 	// 调用前面定义的函数,获取ADC转换的原始值,该值是12位的,范围0-4095

    Scope = 100-((float)ADC/4095)*100; 		// 将ADC值转换为0-100的范围
    return Scope; 					        // 返回转换后的Scope值
}

五、效果演示:

(1)主函数:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "drop.h"

uint16_t    value1=0;
float 		value2;
int main(void)
{
	//OLED初始化
	OLED_Init();
	//初始化ADC单通道转换
	ADCSingle_Init();
	
	
	while (1)
	{
		value1=ADCSingle_GetValue();
		value2=Scope_convert();
		
		OLED_ShowString(0, 0, "water level:", OLED_8X16);
		OLED_ShowFloatNum(0, 16, value2, 3, 1, OLED_8X16);  // 显示百分比,保留两位小数
		OLED_ShowString(48, 16, "%", OLED_8X16);
		OLED_ShowString(0, 32, "ADC:", OLED_8X16);
		OLED_ShowNum(0, 48, value1, 4, OLED_8X16);
		OLED_Update();
		
		
	}
}

(2)效果:

雨滴感应(水位显示)模块测量水位

六、代码下载:

通过网盘分享的文件:34-雨滴感应(水位显示)模块测量水位
链接: https://pan.baidu.com/s/1pjY1QKGxQP91w8Vpb_ih3A?pwd=dm2u 提取码: dm2u

### 关于水位传感器模块的产品说明和技术参数 水位传感器是一种用于检测液体高度的设备,通常由一组暴露的平行导线构成,这些导线能够感知周围环境中的水分变化并将其转化为电信号输出[^3]。这种类型的传感器广泛应用于农业灌溉、家庭自动化以及工业控制等领域。 #### 技术参数概述 以下是常见的水位传感器模块的技术参数: 1. **供电电压**: 大多数水位传感器支持宽范围输入电压 (例如 3.3V 至 5V),具体取决于制造商的设计[^4]。 2. **接口类型**: 数字信号或模拟信号输出。某些高级版本可能还提供 I2C 或 UART 接口以便更灵活的数据传输[^1]。 3. **灵敏度调整**: 部分型号允许用户通过电位器调节探测阈值,使得适应不同应用场景成为可能。 4. **响应时间**: 正常情况下小于等于 10ms ,确保快速反馈当前状态改变情况。 5. **最大测量距离/深度**: 取决于实际设计规格;一般小型家用版可覆盖约几十厘米至一米范围内有效监测区域。 6. **工作温度范围**: -10°C 到 +70°C 是较为普遍的标准设定区间[^2]。 7. **防护等级**: IP65/IP67 级别的防水性能对于户外长期部署至关重要。 #### 使用注意事项 当选购此类产品时需注意以下几点事项: - 确认目标应用场合所需的精确程度及量程是否匹配所选器件的能力; - 考虑连接方式兼容性问题——比如要搭配使用的微控制器板子能否顺利解析来自该款传感单元的信息流数据格式等等因素都需要提前考量清楚后再做决定。 ```python # 示例代码展示如何利用Arduino读取水位传感器数值 void setup() { Serial.begin(9600); } void loop() { int sensorValue = analogRead(A0); // A0端口接入水位传感器输出引脚 float waterLevel = map(sensorValue, 0, 1023, 0, 100); // 将ADC值映射成百分比形式表示相对满载率 Serial.print("Current Water Level: "); Serial.println(waterLevel); delay(1000); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

The_xzs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值