用 Grove 继电器实现自动浇水的土壤湿度联动控制:IoT-For-Beginners Raspberry Pi 实操指南
用 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),仅供参考