土壤湿度检测模块利用ADC测量具体湿度(一)

  网上关于土壤湿度检测模块的使用大多都是通过其DO数字信号输出引脚来判断检测到的湿度是否超过阈值(超过输出低电平,否则输出高电平),而对于其AO模拟信号输出引脚的使用却鲜有人提及。

  本文就此从AO引脚的角度来简单谈谈本模块的使用,分享一些个人见解和疑惑。

  我用的是这种最简单的不带继电器的模块,如果采用DO引脚对模块进行使用的话,可通过模块中的蓝色电位器对阈值进行调节——不过,本文则是采用AO引脚对模块进行使用。(当然,你也可以结合起来一起使用)
土壤湿度检测模块利用ADC测量具体湿度(一)_第1张图片
关于该模块的引脚说明我直接引用某宝产品图片了:
土壤湿度检测模块利用ADC测量具体湿度(一)_第2张图片
  AO引脚我们接单片机的某个具有ADC功能的引脚(用于检测模拟电压信号),DO引脚我们接单片机的某个具有外部中断功能的引脚(用于检测电平信号的边沿变化,以判断湿度是否超过阈值),其它引脚我觉得传媒学生都晓得怎么接了。

  该模块的AO引脚能够输出模拟电压信号,而基于我们对ADC的简单认知,我们知道单片机能够通过ADC测得模拟电压。那么接下来就简单了:

  我们通过ADC先测得在湿度为0%时(干燥环境下)AO引脚的值(假设为M0),然后再测出在湿度为100%时(插入纯水中)AO引脚的值(假设为M1),以这两个数据作为参考基准。那么下一次实际测量时,即可通过以下公式求得实际湿度:

在这里插入图片描述
即通过对整个范围的占比来大致计算其湿度。

  接下来通过STM32举例,抛开ADC配置不讲,简单po一些相关代码和伪代码,展示一下大致流程:

系统初始化();
exti_init();				//外部中断初始化,用来检测DO引脚的边沿变化(这里是上升沿检测,使用PE1引脚)
Adc_Init();					//初始化ADC,这里将PA5设为模拟输入并使能、配置ADC
adc_org=ADC采样函数();		//对AO引脚进行采样,得到采样原始值
moisture = (float)(M_max-adc_org)/(M_max-M_min)*100;
//这里M_max是湿度为0%时测得值,M_min是100%时测得值
//由于湿度为0%时数值大,湿度为100%时数值小,即湿度越大,数值越小
//所以公式就转变为:(M_max-adcx)/(M_max-M_min)*100

一部分具体的代码段如下图所示,仅供参考:
土壤湿度检测模块利用ADC测量具体湿度(一)_第3张图片
土壤湿度检测模块利用ADC测量具体湿度(一)_第4张图片
土壤湿度检测模块利用ADC测量具体湿度(一)_第5张图片
  以上就是关于该模块AO引脚的大致使用,但是在写本篇博文的时候,和朋友讨论,发现好像还是有bug的:

  我们知道说AO引脚能够输出模拟电压,那它输出的是谁的电压,它和待测的土壤湿度的转换关系是什么?
  再者,从"所谓的"湿度0%到100%,测得的数值它们之间是均匀线性分布的吗?
  测得值位于M_max和M_min的正中间,它就真的对应的是50%的湿度吗?

所以本文观点和思路还有待进一步的研究确认,仅作为参考。

CSDN中调整图片大小的方式:在原先#pic_center的基础上,在后面加上
=500x500,就能得到相应的500x500大小的图片了,租一次等于号前面需要有空格,乘号用小写字母x。

你可能感兴趣的:(ADC,STM32,土壤湿度,单片机,传感器)