土壤湿度传感器

原理简介

土壤湿度传感器用来判断土里"干不干",最常用的是电阻式探头(YL-69 / FC-28 / HL-69 一类)。

  • 工作原理:两根探针插进土里,土壤越湿电阻越小;模块内部用这个电阻和固定电阻组成分压,从 AO 口输出一个随湿度变化的电压
  • 关键器件:探针(电阻式)+ 比较器模块(带 AO 模拟输出和 DO 数字输出)
  • 接口:AO 接 Pico 的 ADC(模拟输入)
  • 供电:模块 3.3V 就能正常工作(不要用 5V,见下方注意事项)

典型应用

  • 自动浇花 / 智能灌溉
  • 花盆干湿提醒
  • 温室湿度监测
  • 阳台蔬菜养护
  • 土壤对比实验

接线图

[接线图占位,后续添加]

文字说明(具体接法见下方代码注释):

  • 模块 VCC → Pico 3V3(必须用 3.3V,不能接 5V)
  • 模块 GND → Pico GND
  • 模块 AO → Pico GP26(ADC0,模拟输出直连,无需分压)
  • 模块 DO → 悬空(本页只用模拟量 AO;DO 是 3.3V 数字信号,若要使用可接任意 GPIO)
  • 进阶示例里 VCC 改由 GP15 供给,实现"间歇供电"延长探针寿命

示例代码

基础示例:读取土壤湿度

# ============ 接线 ============
# 模块 VCC → Pico 3V3        (重要:必须 3.3V!接 5V 会让 AO 接近 5V,烧坏 ADC)
# 模块 GND → Pico GND
# 模块 AO  → Pico GP26(ADC0) (模拟输出直连 ADC,3.3V 供电时 AO≤3.3V,无需分压)
# 模块 DO  → 悬空(本示例不用数字输出)
# =============================
from machine import ADC, Pin
import time

adc = ADC(Pin(26))   # GP26 = ADC0

print('开始读取土壤湿度...')
while True:
    value = adc.read_u16()              # 0 ~ 65535
    # 越湿电压越低 → value 越小;这里粗略换算成 0~100%(真实值需校准,见应用示例)
    humidity = 100 - value / 65535 * 100
    print(f'ADC 值: {value:5d}, 土壤湿度(粗略): {humidity:.1f}%')
    time.sleep(1)

进阶示例:间歇供电(延长探针寿命)

电阻式探针长期泡在土里一直通电会电解腐蚀、发黑变脆。只在读数瞬间通电,可大幅延长寿命。

# ============ 接线 ============
# 模块 VCC → Pico GP15        (用 GPIO 给传感器供电,电流很小,GPIO 带得动;读数才通电)
# 模块 GND → Pico GND
# 模块 AO  → Pico GP26(ADC0)
# 模块 DO  → 悬空
# 说明:YL-69/HL-69 这类电阻探头长期通电会被电解腐蚀,间歇供电能延长寿命
# =============================
from machine import ADC, Pin
import time

power = Pin(15, Pin.OUT)   # GPIO 给传感器供电
adc = ADC(Pin(26))

print('间歇供电读取(延长探针寿命)')
while True:
    power.on()                 # 通电
    time.sleep_ms(50)          # 等电压稳定
    value = adc.read_u16()
    power.off()                # 读完立刻断电
    humidity = 100 - value / 65535 * 100
    print(f'ADC 值: {value:5d}, 湿度: {humidity:.1f}%')
    time.sleep(2)              # 大部分时间处于断电状态

应用示例:自动灌溉(带阈值)

注意:GPIO 不能直接驱动水泵!务必通过继电器 / 三极管模块控制,水泵另接电源。

# ============ 接线 ============
# 土壤模块 VCC → Pico GP15(间歇供电)
# 土壤模块 GND → Pico GND
# 土壤模块 AO  → Pico GP26(ADC0)
# 继电器模块 VCC → Pico 3V3,GND → Pico GND,IN → Pico GP14(控制水泵通断)
# 水泵本身接继电器另一端,并接外部电源(绝不从 Pico GPIO 取大电流!)
# =============================
from machine import ADC, Pin
import time

power = Pin(15, Pin.OUT)
pump = Pin(14, Pin.OUT)
adc = ADC(Pin(26))

DRY = 35   # 低于此湿度开始浇水
WET = 70   # 高于此湿度停止浇水

print('自动灌溉(间歇供电版)')
while True:
    power.on()
    time.sleep_ms(50)
    value = adc.read_u16()
    power.off()
    humidity = 100 - value / 65535 * 100
    print(f'湿度: {humidity:.1f}%')
    if humidity < DRY:
        pump.on()
    elif humidity > WET:
        pump.off()
    time.sleep(2)

注意事项

  • 供电电压:模块 VCC 接 Pico 3V3。该模块 3.3V 可正常工作,读数比 5V 供电略低但线性度没问题;切忌接 5V,否则 AO 可能接近 5V 超出 ADC 量程,损坏 Pico
  • 分压:3.3V 供电时 AO ≤ 3.3V,可直连 ADC,无需分压电阻
  • 腐蚀/寿命:电阻式探头长期通电会电解腐蚀,建议用 GPIO 间歇供电(见进阶示例),只在测量时通电
  • 校准:每套传感器、每种土壤不同,建议实测"完全干燥"和"完全浸水"两档的 ADC 值,再用这两个值做映射,比固定公式准
  • DO 数字输出:模块 DO 是经比较器输出的 3.3V 数字信号(VCC=3.3V 时),可直接接 GPIO;若误用 5V 供电,DO 也会变成 5V,不能直连
  • 精度:受土壤盐分、探针插入深度影响,只能作相对干湿判断,不宜当精确测量

常见问题

Q: 读数一直是 65535(满值)? A: 多半接到了 5V 或 AO 悬空/接触不良。确认 VCC 接 3V3、AO 接 GP26,且 GND 共地。

Q: 插进湿土读数变化很小? A: 做两点校准:记下完全干燥和完全浸水时的 ADC 值,用这两个端点重新映射到 0~100%。

Q: 探针用一阵就发黑、变脆? A: 电解腐蚀。改用进阶示例的间歇供电,只在测量瞬间通电,能明显延长寿命。