一篇文章教会你土壤湿度检测模块检测土壤湿度,附STM32代码示例

目录

一、土壤湿度检测模块模块介绍:

(1)产品特点:

(2)模块使用说明:

(3)接线说明(4线制):

(4) 原理图:

二、AO与DO介绍:

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

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

(3)总结:

三、ADC:

(1)STM32 ADC介绍:

(2)ADC主要特征:

四、代码编写:

(1)初始化ADC:

(2)ADC值获取:

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

五、效果演示:

(1)主函数:

(2)效果:

六、代码下载:


一、土壤湿度检测模块模块介绍:

(1)产品特点:

  • 优质材料:采用镀镍处理的优质土壤传感器,感应面积加宽,提高导电性能,防止生锈,延长使用寿命。

  • 宽范围控制:可调节土壤湿度的阈值,通过电位器控制。湿度低于设定值时,DO输出高电平;高于设定值时,DO输出低电平。

  • 稳定工作:使用LM393比较器芯片,工作稳定。

  • 宽电压范围:工作电压为3.3V-5V。

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

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

(2)模块使用说明:

  • 适用场景:适用于土壤湿度检测。

  • 阈值调节:模块中的蓝色电位器用于调节土壤湿度的阈值。顺时针调节阈值增大,逆时针调节阈值减小。

  • 数字量输出:DO引脚可与单片机直接相连,通过检测高低电平来检测土壤湿度。

  • 模拟量输出:AO引脚可与AD模块相连,通过AD转换获得更精确的土壤湿度数值。

(3)接线说明(4线制):

  • VCC:外接3.3V-5V电源。

  • GND:外接地。

  • DO:数字量输出接口,输出0或1。

  • AO:模拟量输出接口,输出电压信号。

(4) 原理图:

二、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 "soil.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)效果:

六、代码下载:

通过网盘分享的文件:35-土壤湿度检测模块检测土壤湿度
链接: https://pan.baidu.com/s/1YvB2jBY37qPBQCNTZdT2iw?pwd=9duq 提取码: 9duq

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

The_xzs

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

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

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

打赏作者

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

抵扣说明:

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

余额充值