用 Grove 继电器实现自动浇水的土壤湿度联动控制:IoT-For-Beginners Raspberry Pi 实操指南
【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners
本篇指南基于 IoT-For-Beginners 项目第二模块(数字农业)第 3 课《Automated plant watering》中的 Raspberry Pi 分册(pi-relay.md),完整讲解如何在已接好土壤湿度传感器的 Raspberry Pi 上增加一颗 Grove 继电器,并通过 Grove Python 库的GroveRelay类按土壤湿度阈值开关继电器。读完并完成全部步骤后,你将掌握:数字执行器的接线位置(Grove Base Hat 的 D5 数字口)、GroveRelay的实例化与on()/off()调用方法、以及基于土壤湿度读数(阈值 450)驱动继电器通断的完整闭环控制代码。
继电器硬件选型:常开继电器,支持 250V / 10A
物联网开发板通常只能提供 3.3V 或 5V、不到 1A 的低电压输出,足以驱动 LED 这类小功率执行器,但无法直接驱动灌溉水泵等大电流设备。解决思路是让水泵接入外部电源,再用一个“开关”类执行器去接通水泵的回路——这正是继电器的作用。
本课使用的继电器是 Grove 继电器(Grove relay),其关键规格为:
- 常开(normally-open)继电器:当没有信号送入继电器时,输出回路是断开的(open / disconnected);只有控制信号到来时输出回路才闭合。
- 输出回路负载能力:最高250V、10A,足以覆盖大多数市电级设备的通断需求。
- 数字执行器:高电平信号 = 接通,低电平信号 = 断开,因此它接在 Grove Base Hat 的数字引脚上,而不是模拟引脚。
从同一课的总览文档(README.md)可以看到继电器的底层结构:核心是一个电磁铁,控制回路由开发板的 3.3V/5V 供电驱动电磁铁吸合杠杆、闭合触点;输出回路则独立承载大电流负载(水泵)。由于控制回路与输出回路在电气上隔离,一颗低成本开发板就能从单盆植物的小泵一直控制到大型灌溉系统。继电器动作时杠杆与触点碰撞会发出清晰的“咔哒”声,板上 LED 点亮表示继电器处于接通状态——这两点正是后文验证接线是否成功的依据。
硬件连接:继电器接 D5,湿度传感器保留在 A0
在上一课(Measure soil moisture - Raspberry Pi)中,土壤湿度传感器已连接在 Grove Base Hat 的A0模拟口上。本课只需在此基础上追加继电器,连接步骤如下:
- 将一根 Grove 电缆的一端插入继电器上的插座。Grove 接口只能以唯一方向插入,方向反了插不进去。
- 在 Raspberry Pi 断电的状态下,将 Grove 电缆另一端插入 Grove Base Hat 上标记为D5的数字口。该口位于 GPIO 引脚旁那一排插座中、从左数第二个。同时保持土壤湿度传感器继续连接在A0口上,不要移动。
- 如果土壤湿度传感器还没有插入土壤(例如尚未做过上一课),此时将其插入土壤中。
接线要点总结:
| 设备 | Grove 接口 | 类型 | 说明 |
|---|---|---|---|
| Grove 继电器 | D5 | 数字口(GPIO 5) | 从左数第二个数字插座 |
| 土壤湿度传感器 | A0 | 模拟口 | 上一步已接好,通过 10-bit ADC 读出 1~1023 的数字值 |
继电器对应的数字引脚号5会直接出现在后面的代码GroveRelay(5)中,接线口位与代码参数必须一致,这是最常见的接线—代码不匹配错误来源。
编程继电器:导入 GroveRelay 并做通断测试
接线完成后,在上一课的soil-moisture-sensor项目上继续扩展,而不是新建项目。
给 Pi 上电,等待其完成启动。
在 VS Code 中打开上一课的
soil-moisture-sensor项目(若尚未打开)。在
app.py的现有 import 下方添加:from grove.grove_relay import GroveRelay该语句从 Grove Python 库导入
GroveRelay,用于与 Grove 继电器交互。在
ADC类声明(即adc = ADC())的下方添加:relay = GroveRelay(5)参数5对应数字口 D5,即继电器所接引脚,由此创建一个
GroveRelay实例。为验证继电器确实工作,在
while True:循环体内添加:relay.on() time.sleep(.5) relay.off()代码先把继电器接通,等待 0.5 秒,再断开。
运行 Python 应用。预期现象:继电器每 10 秒完成一次“开—关”循环(循环末尾上一课遗留的
time.sleep(10)决定了周期),开与关之间间隔 0.5 秒。你能听到继电器“咔哒”一声接通、再“咔哒”一声断开;Grove 板上的 LED 在接通时点亮、断开时熄灭。
如果看不到 LED 变化、也听不到动作声,优先检查:Pi 是否在接线前已断电、电缆是否真的插入了 D5(而非相邻的 D3/D6)、代码中的引脚号是否为 5。
用土壤湿度控制继电器:阈值 450 的通断逻辑
继电器验证通过后,就把它接入实际的湿度控制逻辑。
删除刚才用于测试的 3 行代码(
relay.on()/time.sleep(.5)/relay.off()),替换为:if soil_moisture > 450: print("Soil Moisture is too low, turning relay on.") relay.on() else: print("Soil Moisture is ok, turning relay off.") relay.off()逻辑说明:读取土壤湿度传感器的值,高于 450 就接通继电器(启动水泵),低于 450 就断开(停止水泵)。
运行 Python 应用,观察继电器随土壤湿度水平自动通断:先在干燥土壤中测试,再往土里加水。典型的控制台输出如下:
Soil Moisture: 638 Soil Moisture is too low, turning relay on. Soil Moisture: 452 Soil Moisture is too low, turning relay on. Soil Moisture: 347 Soil Moisture is ok, turning relay off.注意读数变化方向:638 → 452 → 347 是加水过程中 ADC 读数下降的过程。
关键易错点(原文档明确强调):本课使用的是电容式土壤湿度传感器,其读数方向与直觉相反——读数越低,表示土壤越湿;读数越高,表示土壤越干。因此“读数 > 450”对应的是“土壤太干”,才需要开水泵。如果换成电阻式传感器或把阈值方向写反,会出现“越浇越开、水漫金山”的失控行为。
完整代码与仓库位置
完成本课后app.py的最终形态,可直接对照仓库中的 code-relay/pi 示例代码:
import time from grove.adc import ADC from grove.grove_relay import GroveRelay adc = ADC() relay = GroveRelay(5) while True: soil_moisture = adc.read(0) print("Soil moisture:", soil_moisture) if soil_moisture > 450: print("Soil Moisture is too low, turning relay on.") relay.on() else: print("Soil Moisture is ok, turning relay off.") relay.off() time.sleep(10)从源码结构看,整个控制闭环非常紧凑:adc.read(0)通过 Grove Base Hat 的 ADC 读 A0 通道(对应ADC(0)即 A0 口),得到 1~1023 的 10-bit 数值;每轮循环以 450 为阈值对relay实例调用on()/off()直接驱动 D5 引脚的高低电平;time.sleep(10)使采样与控制周期固定为 10 秒。这一结构是后续课程的基线——在 code-mqtt 目录 中,同样的relay.on()/off()调用被改为响应 MQTT 下发的relay_on命令,把控制逻辑从设备端上移到服务器端集中决策。
延伸:为什么简单的阈值控制还不够
本节的“读到 >450 就开、<450 就关”是闭环控制的第一个可用版本,但同一课的 README.md 专门讨论了它的局限:水从水泵流到传感器所在位置需要时间。传感器读数不会在你浇水的瞬间下降,而是滞后若干秒——实测中草莓盆栽约需 20 秒才稳定。若按当前逻辑持续开泵直到读数回落到 450 以下,水仍会继续渗入土壤,造成过浇甚至烂根。
该课给出的改进思路(并在 code-timing 目录 中给出完整实现)是引入“浇水周期”:接通继电器约 5 秒 → 断开 → 等待约 20 秒让读数稳定 → 重新测量 → 仍高于阈值则再浇一轮,并且宁可少浇不可多浇——水能加,不能从土里抽走。后续的 4-migrate-your-plant-to-the-cloud 课程则把这套设备端代码迁移到 Azure IoT 云端架构。掌握本文的继电器接线、GroveRelay编程与阈值判断这三块基石后,这些进阶环节就只是把relay.on()/off()的触发条件从本地if判断换成云端命令与定时逻辑。
【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考