news 2026/9/16 19:16:05

用 Grove 继电器实现自动浇水的土壤湿度联动控制:IoT-For-Beginners Raspberry Pi 实操指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用 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模拟口上。本课只需在此基础上追加继电器,连接步骤如下:

  1. 将一根 Grove 电缆的一端插入继电器上的插座。Grove 接口只能以唯一方向插入,方向反了插不进去。
  2. 在 Raspberry Pi 断电的状态下,将 Grove 电缆另一端插入 Grove Base Hat 上标记为D5的数字口。该口位于 GPIO 引脚旁那一排插座中、从左数第二个。同时保持土壤湿度传感器继续连接在A0口上,不要移动。
  3. 如果土壤湿度传感器还没有插入土壤(例如尚未做过上一课),此时将其插入土壤中。

接线要点总结:

设备Grove 接口类型说明
Grove 继电器D5数字口(GPIO 5)从左数第二个数字插座
土壤湿度传感器A0模拟口上一步已接好,通过 10-bit ADC 读出 1~1023 的数字值

继电器对应的数字引脚号5会直接出现在后面的代码GroveRelay(5)中,接线口位与代码参数必须一致,这是最常见的接线—代码不匹配错误来源。

编程继电器:导入 GroveRelay 并做通断测试

接线完成后,在上一课的soil-moisture-sensor项目上继续扩展,而不是新建项目。

  1. 给 Pi 上电,等待其完成启动。

  2. 在 VS Code 中打开上一课的soil-moisture-sensor项目(若尚未打开)。

  3. app.py的现有 import 下方添加:

    from grove.grove_relay import GroveRelay

    该语句从 Grove Python 库导入GroveRelay,用于与 Grove 继电器交互。

  4. ADC类声明(即adc = ADC())的下方添加:

    relay = GroveRelay(5)

    参数5对应数字口 D5,即继电器所接引脚,由此创建一个GroveRelay实例。

  5. 为验证继电器确实工作,在while True:循环体内添加:

    relay.on() time.sleep(.5) relay.off()

    代码先把继电器接通,等待 0.5 秒,再断开。

  6. 运行 Python 应用。预期现象:继电器每 10 秒完成一次“开—关”循环(循环末尾上一课遗留的time.sleep(10)决定了周期),开与关之间间隔 0.5 秒。你能听到继电器“咔哒”一声接通、再“咔哒”一声断开;Grove 板上的 LED 在接通时点亮、断开时熄灭。

如果看不到 LED 变化、也听不到动作声,优先检查:Pi 是否在接线前已断电、电缆是否真的插入了 D5(而非相邻的 D3/D6)、代码中的引脚号是否为 5。

用土壤湿度控制继电器:阈值 450 的通断逻辑

继电器验证通过后,就把它接入实际的湿度控制逻辑。

  1. 删除刚才用于测试的 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 就断开(停止水泵)。

  2. 运行 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 19:15:21

解决realme手机微信多文件分享限制的3种方法

1. 问题背景与场景还原作为一名长期使用realme手机的老用户&#xff0c;我最近遇到了一个相当恼人的文件分享问题。事情发生在2026年3月18日晚上&#xff0c;当时我需要通过微信给同事发送多个工作文档——包括PDF报告、Excel表格和Word文档。按照常规操作&#xff0c;我打开了…

作者头像 李华
网站建设 2026/9/16 19:14:37

Codex 跑 Git 项目管理 Agent:Key 用 TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/16 19:11:58

SpringBoot医疗器械管理系统开发实践

1. 项目概述&#xff1a;医疗器械管理系统的核心价值医疗器械管理系统是医疗信息化建设中不可或缺的一环。作为一名长期从事医疗信息化开发的工程师&#xff0c;我深刻理解这类系统对医院运营效率提升的重要性。传统的手工记录方式不仅效率低下&#xff0c;而且容易出现数据错误…

作者头像 李华
网站建设 2026/9/16 19:11:04

硬件参数与避坑指南:从选件到排查的系统化装机实操

我自己买过三台整机&#xff0c;也陆陆续续帮朋友装过五六台机器&#xff0c;踩过的坑加起来能写一本小册子。今天不聊跑分软件怎么开&#xff0c;也不讲RGB灯效怎么同步&#xff0c;就说一说那些真正会让机器“用着不舒服”的硬件细节。这篇文章适合两类人看&#xff1a;一是准…

作者头像 李华