首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

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

  • 25-04-24 13:04
  • 3891
  • 12769
blog.csdn.net

目录

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

(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经分频产生。

  1. // 初始化ADC,采用ADC单通道转换
  2. void ADCSingle_Init(void)
  3. {
  4. RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); // 使能ADC1和GPIOA的时钟
  5. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // ADC通常位于APB2总线上
  6. RCC_ADCCLKConfig(RCC_PCLK2_Div6); // 配置ADC时钟,选择PCLK2的6分频,即ADCCLK = 72MHz / 6 = 12MHz
  7. GPIO_InitTypeDef GPIO_InitStructure; // 定义GPIO初始化结构体
  8. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; // 设置GPIO模式为模拟输入
  9. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 设置引脚为PA0
  10. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 设置引脚速度为50MHz
  11. GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA的PA0引脚
  12. ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); // 配置ADC的规则通道,选择通道0,采样时间为55.5周期
  13. // ADC初始化
  14. ADC_InitTypeDef ADC_InitStructure; // 定义ADC初始化结构体
  15. ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // 设置ADC工作模式为独立模式
  16. ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // 设置数据对齐方式为右对齐
  17. ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 设置外部触发转换为无触发
  18. ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; // 设置为不连续转换模式
  19. ADC_InitStructure.ADC_ScanConvMode = DISABLE; // 设置为不扫描模式
  20. ADC_InitStructure.ADC_NbrOfChannel = 1; // 设置通道数目为1
  21. ADC_Init(ADC1, &ADC_InitStructure); // 初始化ADC1
  22. // ADC使能
  23. ADC_Cmd(ADC1, ENABLE); // 使能ADC1
  24. // ADC校准,内部电路自动执行校准
  25. ADC_ResetCalibration(ADC1); // 重置ADC校准寄存器
  26. while (ADC_GetResetCalibrationStatus(ADC1) == SET); // 等待校准重置完成
  27. ADC_StartCalibration(ADC1); // 开始校准
  28. while (ADC_GetCalibrationStatus(ADC1) == SET); // 等待校准完成
  29. }
  • 时钟配置:

    • 使能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位的数字,代表了对应模拟输入信号的数字量。

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

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

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

  1. //将ADC获取的值转换到0-100。
  2. float Scope_convert(void)
  3. {
  4. uint16_t ADC;
  5. float Scope;
  6. ADC = ADCSingle_GetValue(); // 调用前面定义的函数,获取ADC转换的原始值,该值是12位的,范围0-4095
  7. Scope = 100-((float)ADC/4095)*100; // 将ADC值转换为0-100的范围
  8. return Scope; // 返回转换后的Scope值
  9. }

五、效果演示:

(1)主函数:

  1. #include "stm32f10x.h" // Device header
  2. #include "Delay.h"
  3. #include "OLED.h"
  4. #include "soil.h"
  5. uint16_t value1=0;
  6. float value2;
  7. int main(void)
  8. {
  9. //OLED初始化
  10. OLED_Init();
  11. //初始化ADC单通道转换
  12. ADCSingle_Init();
  13. while (1)
  14. {
  15. value1=ADCSingle_GetValue();
  16. value2=Scope_convert();
  17. OLED_ShowString(0, 0, "water level:", OLED_8X16);
  18. OLED_ShowFloatNum(0, 16, value2, 3, 1, OLED_8X16); // 显示百分比,保留两位小数
  19. OLED_ShowString(48, 16, "%", OLED_8X16);
  20. OLED_ShowString(0, 32, "ADC:", OLED_8X16);
  21. OLED_ShowNum(0, 48, value1, 4, OLED_8X16);
  22. OLED_Update();
  23. }
  24. }

(2)效果:

六、代码下载:

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

注:本文转载自blog.csdn.net的The_xzs的文章"https://blog.csdn.net/The_xz/article/details/145210827"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

124
嵌入式
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top