ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

IoT-For-Beginners 实战:用 Raspberry Pi 与 Grove 继电器实现基于土壤湿度的自动浇水

IoT-For-Beginners 实战:用 Raspberry Pi 与 Grove 继电器实现基于土壤湿度的自动浇水 IoT-For-Beginners 实战用 Raspberry Pi 与 Grove 继电器实现基于土壤湿度的自动浇水【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners本篇技术指南聚焦于 Microsoft IoT-For-Beginners 课程的「自动化植物浇水」一课中 Raspberry Pi 硬件分支原文档如何为树莓派接入 Grove 继电器relay通过 Grove Python 库编程控制它并让继电器根据电容式土壤湿度传感器的读数自动开合——为后续接入水泵构建真实灌溉系统打下基础。读完本文你将掌握继电器这类数字执行器digital actuator的接线方式、GroveRelayAPI 的调用方法以及基于阈值判断的自动化控制逻辑。硬件准备Grove 继电器本实验使用的继电器是 Grove Relay它属于常开型normally-open继电器——当继电器未收到任何控制信号时输出回路处于断开状态只有当控制电路通电时内部的开关才会闭合接通输出回路。Grove 继电器是典型的数字执行器因此需要连接到 Grove Base Hat 上的数字引脚。它的输出回路最高可承载250V / 10A的负载足以驱动多数市电供电设备例如小型水泵。关于继电器内部结构仓库在课程 README.md 中有专门说明继电器的核心是一个电磁铁electromagnet控制电路为电磁铁供电通电时电磁铁拉动杠杆、闭合触点从而接通输出回路断电时杠杆复位、触点断开。由于继电器只需要 3.3V 或 5V 就能驱动电磁铁因此低功耗的 IoT 开发板得以控制高功率的外部设备。✅ 思考普通 IoT 开发板通常只能提供 3.3V 或 5V、低于 1A 的电流而市电往往高达 230V 且能驱动数十安培的设备。继电器正是解决「低压控制高压」的关键执行器。接线步骤操作前请先参考 Grove 继电器实物图 确认接口方向然后按以下步骤接线将 Grove 连接线的一端插入继电器上的插座该插座只有单向才能插入方向不对是插不进去的。在树莓派断电状态下将 Grove 连接线的另一端插入 Grove Base Hat 上标注为D5的数字插座。该插座位于靠近 GPIO 引脚那一排插座中、从左数第二个。此前课程中已接入A0插座的土壤湿度传感器保持不动。完成后的连接示意可参考 继电器接入 D5 插座、土壤湿度传感器接入 A0 插座。如果上一课结束后传感器还没插回土壤请把土壤湿度传感器插入土壤中。编程控制继电器完成接线后即可为树莓派编写程序让它驱动继电器。第一步导入 GroveRelay 类打开上一课创建的soil-moisture-sensor项目在 VS Code 中在app.py现有 import 语句下方追加一行from grove.grove_relay import GroveRelay这行语句从 Grove Python 库中导入GroveRelay类用于与 Grove 继电器交互。第二步创建继电器实例在ADC类的声明代码下方创建GroveRelay实例relay GroveRelay(5)5表示继电器连接在D5引脚上也就是你刚才实际接线的数字引脚。仓库中的参考实现 code-relay/pi/soil-moisture-sensor/app.py 中的写法与此完全一致。第三步测试继电器开合在while True:循环中加入以下代码验证继电器是否正常工作relay.on() time.sleep(.5) relay.off()这段代码依次执行打开继电器 → 等待 0.5 秒 → 关闭继电器。由于主循环末尾有time.sleep(10)实际运行效果是每 10 秒开关一次开关之间间隔 0.5 秒。运行 Python 程序后你会听到继电器闭合/断开时的清脆「咔哒」声Grove 板上的一颗 LED 也会随继电器状态同步点亮/熄灭许多继电器板都带有此类状态指示灯。整个过程可参考 继电器反复开合演示。根据土壤湿度自动控制继电器继电器验证通过后把测试用的那 3 行代码删掉替换为基于土壤湿度读数的判断逻辑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时说明湿度足够关闭继电器。 注意本课使用的是电容式土壤湿度传感器其读数与湿度是反向的——读数越低代表土壤中水分越多读数越高代表土壤越干。运行与预期输出再次运行程序你将看到继电器随湿度变化自动开合。在干土中测试然后浇水观察变化。预期输出如下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.完整可运行代码位于 code-relay/pi/soil-moisture-sensor/app.py核心逻辑如下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)延伸一没有硬件也能跑——虚拟设备版本如果你没有真实硬件仓库为同一逻辑提供了虚拟设备实现 code-relay/virtual-device/soil-moisture-sensor/app.py。它用 CounterFit 模拟器替代真实外设代码结构几乎一致from counterfit_connection import CounterFitConnection CounterFitConnection.init(127.0.0.1, 5000) import time from counterfit_shims_grove.adc import ADC from counterfit_shims_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)两者唯一的差异是导入来源真实硬件用grove.adc/grove.grove_relay虚拟设备用counterfit_shims_grove同名模块API 完全兼容。这也意味着「先模拟、后上板」的迁移成本极低。延伸二从本地控制升级到 MQTT 云端控制本地阈值判断适合单机演示但商业灌溉系统通常采用集中式控制由一台服务器综合多个传感器数据做决策再通过 MQTT 下发命令。仓库在 code-mqtt/pi/soil-moisture-sensor/app.py 中给出了升级版本核心变化包括通过paho.mqtt.client连接 MQTT Broker默认test.mosquitto.org每 10 秒将soil_moisture作为 telemetry 发布到ID/telemetry主题订阅ID/commands主题在handle_command回调中根据消息里的relay_on字段控制继电器def handle_command(client, userdata, message): payload json.loads(message.payload.decode()) print(Message received:, payload) if payload[relay_on]: relay.on() else: relay.off()服务器端负责判断soil_moisture 450并下发命令。关于 MQTT 连接、telemetry 发送与命令下发的完整教程可回溯 1-getting-started/lessons/4-connect-internet/README.md。延伸三为什么不能「一看低于阈值就浇水」——传感器与执行器的时序课程 README.md 强调了一个实战关键问题传感器读到变化是有延迟的。上一步实验里你可能已经注意到浇水后土壤湿度读数并不会立刻下降——因为水需要时间在土壤中渗透、到达传感器位置。水渗透期间如果继电器仍保持打开就会过度浇水造成水资源浪费甚至烂根。因此推荐「分段短时浇水」策略例如打开水泵继电器5 秒关闭水泵等待20 秒让水分充分渗透再次读取土壤湿度若读数仍高于阈值重复以上步骤。因为「水可以再加、但难以抽出」宁少勿多。仓库在 code-timing 目录提供了带时序控制的服务器端参考实现并使用threading.Thread让浇水周期在后台线程执行同时通过unsubscribe/subscribe在浇水期间暂停处理 telemetry避免重复触发新的浇水周期。课后挑战校准你的浇水效率课程配套的 assignment.md 提供了一个数据驱动的校准方法对同一块土壤水泵固定转速下每秒供水量恒定因此可通过实验测出「每秒钟浇水量对应的湿度读数下降幅度」进而按需精确计算水泵运行时长从干土开始记录初始土壤湿度读数固定加水如运行水泵 1 秒等待读数稳定后记录重复多次并制表。示例数据如下| 累计水泵运行时间 | 土壤湿度读数 | 下降幅度 | | --- | --: | -: | | 干燥 | 643 | 0 | | 1s | 621 | 22 | | 2s | 601 | 20 | | 3s | 579 | 22 | | 4s | 560 | 19 | | 5s | 539 | 21 | | 6s | 521 | 18 |计算平均每秒下降值上例约 20.3用该数据改进服务器代码让水泵恰好运行「能把湿度降到目标区间」的时长。如果你使用虚拟硬件也可以通过手动模拟的方式继电器每开启 1 秒就把湿度读数提高固定量完成同样的校准流程。小结至此你已经完成了从「传感器读数」到「继电器执行」的完整闭环硬件层面掌握了 Grove 继电器在 Raspberry Pi 上的接线D5 数字引脚软件层面掌握了GroveRelay的导入、实例化GroveRelay(5)与on()/off()控制并实现了基于 450 阈值的自动浇水逻辑。下一步可沿着本课的 MQTT 与时序扩展方向把单机自动化升级为服务器集中控制、带浇水周期时序的真实灌溉系统。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表