公告
  
欢迎回来!目前功能升级完毕,
本站限时免费查看资料,请尽快注册账号,后续将限制游客访问~

朕已阅

首页 动态 版块 商城 我的
 退出
游客  
等级:
金币:
经验值:

土壤湿度检测自动灌溉系统 Python编程 用树莓派pico开发

  21390 
 4
 9
lamp   single 

一:土壤传感器介绍

Image

在土壤湿度传感器中,AO(Analog Output)模拟量信号输出引脚是核心信号输出端,其输出的模拟电压信号会随土壤湿度变化而连续波动,这也是我们能通过树莓派 Pico 等设备实现 “湿度百分比量化” 的核心依据。下面从信号本质、变化逻辑、影响因素三方面详细解析:

1. AO 模拟量的信号本质

AO 模拟量是连续变化的电压信号,而非数字量(高低电平)的 “非 0 即 1” 的状态。对于常见的土壤湿度传感器(如基于电阻式或电容式原理的模块),其 AO 端输出电压通常在0V~ 输入电压之间波动(例如 3.3V 供电时,输出范围 0~3.3V;5V 供电时,输出范围 0~5V)。​

这种 “连续变化” 的特性,使得 AO 信号能精准反映土壤湿度的 “渐变过程”—— 比如从 “微干” 到 “湿润” 的过渡状态,而非仅能判断 “干 / 湿” 两个极端,这也是模拟量传感器比单纯数字量传感器(仅 DO 引脚)测量更精细的关键。简单理解:DO开关量读取的是湿润或干燥两种状态。而DO模拟量信号读取的则是湿度不同输出的电压不同。这样我们就能对电压进行分析编程转换成更精细的湿度值百分比数据。

2. AO 模拟量随土壤湿度的变化规律

AO 模拟量的变化核心遵循 “湿度与输出电压负相关” 的逻辑(针对绝大多数土壤湿度传感器,需注意部分特殊型号可能相反,需以实际测试为准),具体变化曲线可分为三个阶段:

土壤湿度状态AO 输出电压变化ADC 读数变化(以3.3V供电、16位ADC为例)实际场景参考
完全干燥(如传感器置于空气中接近电源电压(如 3.2V~3.3V)接近最大值 65535(因 16 位 ADC 范围 0~65535)沙漠、干旱土壤,植物缺水萎蔫
中度湿润(如正常灌溉后土壤)中等电压(如 1.5V~2.5V)中间值(约 30000~48000)蔬菜大棚、家庭花盆的适宜湿度
完全湿润(如传感器浸入水中)接近 0V(如 0.1V~0.5V)接近最小值(约 1000~5000)水田、洪涝后的土壤,水分饱和


变化逻辑拆解:以最常见的 “电阻式土壤湿度传感器” 为例 

传感器探头(两个金属电极)插入土壤时,土壤中的水分会形成 “导电介质”:湿度越高,土壤导电性越强,电极间的电阻越小;此时传感器内部的分压电路中,AO 端的输出电压会随电阻减小而降低(类似 “分压原理”:电源电压固定时,串联电阻越小,其两端电压越小)。​

简单来说:土壤越湿 → 电极电阻越小 → AO 输出电压越低 → ADC 读数越小 → 换算的湿度百分比越高(这也和上一轮 Pico 代码中 “反转计算百分比” 的逻辑完全一致)。​


3. 影响 AO 模拟量变化的关键因素

AO 模拟量的变化并非仅由土壤湿度决定,实际使用中需注意以下干扰因素,避免测量偏差:​

供电电压稳定性:AO 输出电压以电源电压为 “基准”,若供电电压波动(如 3.3V 降至 3.0V),即使土壤湿度不变,AO 电压也会同步降低,导致 ADC 读数偏小(误判为 “更湿”)。因此建议使用稳压电源或 Pico 的 3.3V 稳压引脚供电。​


探头接触面积:传感器探头插入土壤的深度、松紧度不同,电极与土壤的接触面积会变化 —— 接触越充分,电阻测量越准确,AO 信号越稳定;若探头仅浅插或接触松散,可能出现 “AO 电压忽高忽低” 的波动。​


土壤盐分与 pH 值:土壤中的盐分(如盐碱地)、pH 值(酸性 / 碱性)会影响土壤导电性 —— 相同湿度下,盐分越高的土壤导电性越强,AO 电压会比普通土壤更低(可能误判为 “更湿”)。因此这类场景需选择 “抗盐分干扰” 的专用传感器,并重新校准干湿值。​


环境温度:温度每变化 10℃,土壤导电性可能变化 5%~10%,间接导致 AO 电压偏移。例如冬季低温时,相同湿度下 AO 电压会略高于夏季,需根据季节微调校准值。


YL-69土壤传感器电路图🛒土壤传感器产品链接
土壤传感器产品资料


Image

二:硬件接线

以下是树莓派Pico开发板为例。读取土壤传感器AO模拟量信号,提醒: 请按下图的引脚标识接线,务必不能接错。如果接错线通电后会导致设备烧毁!



Image

接好线后实图如下:

Image


三:Python例程

1.编写Python代码

Soil moisture data下载这个源代码上传至树莓派pi文件内,直接运行查看数据(如下图)

如果你还没有搭建好树莓派Python编程环境可参考这个帖子→:如何搭建Python编程环境


Image

结果:将传感器插在不同湿度土壤环境中,湿度越大数值会百分比会发生变化。以上具体参数可以在代码通过wet_value 进行调节。


2.代码解析

代码整体遵循「硬件初始化→参数配置→功能封装→循环采集」的嵌入式传感器数据读取逻辑,步骤如下:

1.硬件模块导入与初始化

  • 从machine模块导入Pin(引脚控制)和ADC(模拟 / 数字转换)类,导入time模块用于延时。
  • 配置GP26引脚为 ADC 输入引脚(对应开发板的 ADC0 通道),创建soil_sensor ADC 对象,用于读取土壤传感器的模拟信号。
  • 注意:GP26 是 RP2040 芯片的专用 ADC 引脚,无法作为普通数字引脚使用,这是硬件层面的约束。

2.校准参数配置

定义两个关键校准值(需根据实际传感器、环境手动调整,是百分比计算的基础):

dry_value = 65535:传感器在 ** 完全干燥(空气中)** 时的原始读取值,对应 16 位 ADC 的最大值。

wet_value = 30000:传感器在 ** 完全湿润(纯净水中)** 时的原始读取值,为示例值,实际需将传感器探头浸入水中读取并修改。


3.湿度读取功能封装(read_soil_moisture函数)

  • 第一步:调用soil_sensor.read_u16()读取原始模拟值,返回范围是0-65535(16 位 ADC 的采样范围)。
  • 第二步:将原始值转换为 0-100 的湿度百分比,并用max(0, min(100, ...))约束结果范围,避免出现负数或超过 100 的无效值。
  • 第三步:返回原始值(用于调试校准)和湿度百分比(用于直观展示)。


4.主程序循环采集与异常处理

  • 打印测试提示信息,告知用户程序运行状态和校准注意事项。
  • 用try...while True构建无限循环,持续读取湿度数据。
  • 根据湿度百分比划分「干燥」「湿润」「潮湿」三种状态并打印。
  • 每次采集后延时 0.5 秒,避免数据读取过于频繁,减少资源占用。


5.土壤状态判断

  • 湿度 < 30%:干燥(土壤缺水,需浇水)
  • 30%≤湿度 < 70%:湿润(植物生长适宜的土壤湿度)
  • 湿度≥70%:潮湿(土壤水分过多)

6. 百分比计算公式

  • 代码中的核心计算式:100 - ((raw_value - wet_value) / (dry_value - wet_value) * 100)本质是将「wet_value ~ dry_value」的 ADC 值范围,线性映射为「100% ~ 0%」的湿度范围,步骤如下:

计算原始值相对湿润值的偏移量raw_value - wet_value

当传感器完全湿润(raw_value = wet_value):偏移量 = 0。

当传感器完全干燥(raw_value = dry_value):偏移量 =dry_value - wet_value(最大偏移量)。

该步骤的目的是将 ADC 值的起始点「归零」,统一从湿润值开始计算相对偏移。


7.计算偏移量占总范围的比例

(raw_value - wet_value) / (dry_value - wet_value)

总范围是 ADC 值的干湿差值:dry_value - wet_value(固定值,由校准参数决定)

该步骤将偏移量转换为 0~1 之间的比例值:

完全湿润时,比例 = 0 / 总范围 = 0。

完全干燥时,比例 = 总范围 / 总范围 = 1。

中间状态时,比例在 0~1 之间(例如,原始值处于干湿中间,比例≈0.5)。


8.将比例值转换为对应的「反向原始百分比」

(raw_value - wet_value) / (dry_value - wet_value) * 100

将 0~1 的比例值放大 100 倍,转换为 0~100 的百分比值:

完全湿润时,该值 = 0%。

完全干燥时,该值 = 100%。

此时的百分比是「干燥度百分比」,还不符合我们对「湿度百分比」的直觉。

完全湿润时:100 - 0% = 100%(湿度最高)。

完全干燥时:100 - 100% = 0%(湿度最低)。

中间状态时:例如干燥度比例为 0.5,对应湿度 = 100 - 50% = 50%(符合预期)。


9. 边界约束:max(0, min(100, ...))的作用

由于传感器存在测量误差、环境干扰,或者原始值超出预先校准的wet_value ~ dry_value范围(例如:raw_value < wet_value或raw_value > dry_value),可能导致计算出的湿度百分比超出 0~100 的合理范围。

  • min(100, 计算值):确保湿度百分比不会超过 100%(避免出现 101%、120% 等无效值)。
  • max(0, 上述结果):确保湿度百分比不会低于 0%(避免出现 - 5%、-10% 等无效值)。
  • 最终将湿度百分比约束在 0~100 的合理区间内,保证数据的有效性和可读性。

三:Python例程(进阶程序)

上面的程序只是测试传感器读取信号的功能是否正常,我们要再次升级功能让其脱离电脑也能使用,并且还能通过湿度值来开合继电器控制水泵抽水。从而实现传感器检测湿度+水泵自动灌溉系统。请严格按下图的引脚标识进行连接,务必不能接错,接错会损坏设备!

1.硬件连接


Image


2.Python程序

土壤湿度控制继电器Python源代码

1.下载源代码后,上传至树莓派Pico内,直接运行代码查看结果。 此时可以将传感器探头插入不同湿度的土壤里来观察湿度值的数据变化

2.以下代码设置了湿度值低于20%时锁定此时打开继电器,直到湿度恢复到70%才解锁此时继电器关闭(继电器接水泵就能实现湿度低于20%水泵开始抽水,直到土壤水份湿度被浇灌到70%后才会停止抽水)这就是一个简易的自动浇花系统。

3.参数的校准值 请根据自己实际情况进行调整

Image

说明:土壤湿度越大数值会百分比发生变化。以上具体参数可以在代码通过wet_value 进行调节。湿度阈值对应继电器开启与关闭可在LOW_THRESHOLD和HIGH_THRESHOLD自定义进行设定。

四:总结

该代码实现了基于树莓派 Pico 的土壤湿度监测与自动控制功能,核心逻辑如下:

1.通过 GP26 引脚(ADC0)读取土壤湿度传感器的模拟信号将 ADC 值转换为 0-100% 的湿度百分比(基于干湿状态校准值)

2实现 "锁定式" 电平控制:当湿度低于 20% 时,GP0 引脚输出高电平并保持(锁定状态)仅当湿度达到或超过 70% 时,GP0 引脚才恢复低电平(解锁)

3.代码包含异常处理,确保程序退出时 GP0 引脚复位为低电平


核心知识点:


1. 硬件相关

树莓派 Pico ADC 功能:Pico 的 ADC(模数转换器)支持 16 位精度(0-65535),GP26/GP27/GP28 为专用 ADC 引脚,可读取 0-3.3V 模拟信号

GPIO 输出控制:通过Pin类初始化输出引脚,使用value(1)输出高电平,value(0)输出低电平

传感器特性:土壤湿度传感器的模拟输出与湿度成反比(湿度越高,输出电压越低,ADC 值越小)


2. 软件逻辑

模拟量到百分比转换:通过线性映射公式将 ADC 值转换为直观的百分比,需通过实际测试获取dry_value(干燥)和wet_value(湿润)校准点

状态锁定机制:使用is_high变量跟踪当前状态,避免在 20%-70% 区间内出现电平频繁切换,确保控制稳定性

阈值控制策略:采用滞后阈值(20% 触发,70% 恢复),适合需要保持状态的场景(如灌溉控制)


3. 应用场景

自动灌溉系统:高电平时触发水泵工作,直到土壤达到适宜湿度

植物生长监测:实时跟踪土壤湿度变化,为植物生长提供数据参考

环境控制:可扩展用于温室、花盆等场景的自动湿度调节

使用时需注意:实际部署前必须根据传感器特性校准dry_value和wet_value,否则会导致测量偏差;电源电压需与传感器规格匹配(通常 3.3V 或 5V)。



技术支持(对本页存在疑难问题可联系我们工程师)

联系人:张工
电话:0755-32914578
QQ:2251000002
微信:扫下方二维码添加,请备注来意

提供:人工智能,IOT物联网,工控数显,嵌入式软硬件开发,科创教育,产品定制,生产,方案解决...



标签:
作者签名:    楼主  2025-08-27 20:11:10
回复列表
小面包
5F
  小面包
7天前 0
看看
共0条回复,点击查看回复
【评论】   
AQiu
4F
  面包大侠
10天前 2
很不错,好用,哈哈emotion
共0条回复,点击查看回复
【评论】   
趣
3F

10天前 1
emotion
共0条回复,点击查看回复
【评论】   
Powered by YDXHUO _VERSION
© 2017-2026 跃动芯火版权
您的IP: 216.73.216.47 , 2026-01-27 19:30:10
Powered by YDXHUO _VERSION
© 2017-2026 跃动芯火版权
(9) 分享
分享

请保存二维码或复制链接进行分享

取消
已有3次打赏
面包大侠打赏给楼主5金币,2026-01-17 19:27:44
打赏给楼主42金币,2026-01-17 19:27:19
RASPI打赏给楼主100金币,2026-01-17 19:25:36