news 2026/9/15 20:55:20

使用 Wio Terminal 和 Grove 继电器实现基于土壤湿度的自动浇灌控制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用 Wio Terminal 和 Grove 继电器实现基于土壤湿度的自动浇灌控制

使用 Wio Terminal 和 Grove 继电器实现基于土壤湿度的自动浇灌控制

【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners

本指南基于 IoT-For-Beginners 课程「2-farm / 3-automated-plant-watering」中的 Wio Terminal 实操章节,讲解如何在上一课已有的土壤湿度传感器基础上,为 Wio Terminal 接入一个 Grove 继电器,并编写固件让继电器依据土壤湿度读数自动控制水泵等大功率设备。读完本文后,你将掌握继电器的接线方法、用 ArduinodigitalWrite驱动数字执行器的方式,以及如何用阈值逻辑构建一个最简的自动浇灌控制系统。

硬件需求与继电器原理

使用 Grove 继电器

本课使用的执行器是 Grove relay 继电器,它是一个常开型(normally-open)继电器:当继电器没有收到任何信号时,输出回路保持断开(开路)状态;只有收到信号后,输出回路才会被接通。该继电器的输出回路最高可以承载250V / 10A的负载,足以驱动水泵、灯等市电供电设备。

继电器本质上是数字执行器(digital actuator)——向控制引脚发送高电平(HIGH)即吸合、低电平(LOW)即释放。因此它连接在 Wio Terminal 的数字引脚上。需要注意:

  • Wio Terminal 的模拟/数字复用端口已被土壤湿度传感器占用(通过analogRead(A0)读取);
  • 继电器需要插到另一个端口上,即I²C 与数字复用端口

背景知识:普通 IoT 开发板只能输出 3.3V 或 5V、电流不到 1A 的控制信号,而水泵(即使家用小型水泵)的启动电流足以烧毁开发板。继电器的控制回路用低电压驱动内部电磁铁,输出回路却可以通断 250V/10A 的独立供电线路,从而让低功耗 IoT 设备控制大功率灌溉设备。详细原理可参见本课总览文档 2-farm/lessons/3-automated-plant-watering/README.md。

连接继电器(Task)

按以下步骤完成接线:

  1. 取一根 Grove 连接线,将一端插入继电器上的插座——该插头只有一个方向能插进去。
  2. 先将 Wio Terminal 与电脑或其他电源断开连接,再把 Grove 线的另一端接到 Wio Terminal 上屏幕正对视角的左侧 Grove 插座;右侧插座继续保留土壤湿度传感器。
  3. 若上一课尚未把土壤湿度传感器插入土壤,现在将其插入土壤中。

编写继电器控制固件

将复用端口配置为输出引脚

继电器没有独立的 Arduino 库——它就是一个靠高/低电平控制的数字执行器:向引脚输出高电平(3.3V)即打开继电器,输出低电平(0V)即关闭。可以使用 Arduino 内置的digitalWrite函数完成控制。

  1. 如果 VS Code 中还没有打开上一课的soil-moisture-sensor项目,请先打开它,本课将在该项目基础上继续修改。
  2. setup函数的末尾追加如下代码,把 I²C/数字复用端口配置为输出引脚:
pinMode(PIN_WIRE_SCL, OUTPUT);

PIN_WIRE_SCL就是 Wio Terminal 上 I²C/数字复用端口的端口号。

测试继电器是否工作

为了验证继电器接线正确,先在loop函数最后一个delay之后追加以下测试代码:

digitalWrite(PIN_WIRE_SCL, HIGH); delay(500); digitalWrite(PIN_WIRE_SCL, LOW);

这段代码先向继电器所在引脚写入高电平将其打开,等待 500ms(半秒),再写入低电平将其关闭。

  1. 编译并上传代码到 Wio Terminal。
  2. 上传完成后,继电器会每 10 秒开关一次,并在开与关之间保持半秒间隔。你将听到继电器吸合与释放时清脆的"咔哒"声;Grove 继电器板上的 LED 在继电器打开时点亮、关闭时熄灭。

完整的测试代码骨架

code-relay工程中,继电器测试阶段的完整代码结构与最终版保持一致,仅在loop中的处理逻辑不同。完整的最终实现位于 code-relay/wio-terminal/soil-moisture-sensor/src/main.cpp,工程配置见 platformio.ini(platform = atmelsamboard = seeed_wio_terminalframework = arduino)。

根据土壤湿度控制继电器

用阈值逻辑替代测试代码

继电器验证通过后,就可以让它根据土壤湿度读数自动通断:

  1. 删除上一节用于测试继电器的 3 行代码,替换为下面的阈值控制逻辑:
if (soil_moisture > 450) { Serial.println("Soil Moisture is too low, turning relay on."); digitalWrite(PIN_WIRE_SCL, HIGH); } else { Serial.println("Soil Moisture is ok, turning relay off."); digitalWrite(PIN_WIRE_SCL, LOW); }

这段代码读取土壤湿度传感器数值:当读数大于 450时打开继电器(驱动水泵浇水),当读数降到450 以下时关闭继电器。

💁 请牢记:电容式土壤湿度传感器读数越低,代表土壤中水分越多;读数越高则土壤越干燥。所以"读数大于 450"意味着土壤偏干、需要浇水。

  1. 编译并上传代码到 Wio Terminal。
  2. 打开串口监视器观察输出。可以看到继电器根据土壤湿度变化自动打开/关闭。先在干燥的土壤中测试,再浇水观察切换。
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工程中最终版的main.cpp完整展示了整个控制流程:

#include <Arduino.h> void setup() { pinMode(A0, INPUT); pinMode(PIN_WIRE_SCL, OUTPUT); } void loop() { int soil_moisture = analogRead(A0); Serial.print("Soil Moisture: "); Serial.println(soil_moisture); if (soil_moisture > 450) { Serial.println("Soil Moisture is too low, turning relay on."); digitalWrite(PIN_WIRE_SCL, HIGH); } else { Serial.println("Soil Moisture is ok, turning relay off."); digitalWrite(PIN_WIRE_SCL, LOW); } delay(10000); }

源码要点(见 main.cpp):

  • setup中将A0配置为输入读取传感器,将PIN_WIRE_SCL配置为输出驱动继电器;
  • loop每次通过analogRead(A0)采样土壤湿度,经 450 阈值判断后通过digitalWrite(PIN_WIRE_SCL, HIGH/LOW)切换继电器;
  • 每次循环末尾delay(10000)(10 秒)控制采样节奏。

阈值为什么取 450?

450 这个阈值来自课程对电容式土壤湿度传感器的经验设定:理想土壤湿度对应的模拟电压读数区间约为 400~450。在自动浇灌系统中:

  • 读数高于 450 → 土壤偏干 → 打开继电器(浇灌);
  • 读数低于 450 → 水分充足 → 关闭继电器(停止浇灌)。

实际部署时,阈值应根据具体土壤类型、种植作物及传感器安装位置重新标定。此外还需注意"执行器—传感器"的响应时延:水泵打开后,水需要一段时间才能渗透土壤到达传感器,因此更稳妥的策略是"短时间开泵 → 等待水分渗透 → 再次测量",而不是让泵一直运行到传感器读数变化。这些时序策略(如开泵 5 秒、等待 20 秒再检测)在课程总览 README.md 的「Sensor and actuator timing」与「Add timing to your plant control server」章节中有详细讨论,并将继电器控制进一步扩展为 MQTT 服务器下发命令的集中式灌溉系统。

工程结构与后续扩展

本课完整代码目录为code-relay,其中:

  • code-relay/wio-terminal:本文使用的 Wio Terminal(Arduino/PlatformIO)工程;
  • code-relay/pi:Raspberry Pi(Python)实现;
  • code-relay/virtual-device:虚拟设备实现。

如果使用 Raspberry Pi 或虚拟设备,可分别参考 pi-relay.md 与 virtual-device-relay.md。

code-mqtt目录中还提供了基于 MQTT 的进阶版本(code-mqtt/wio-terminal),它把阈值判断逻辑上移到本地服务器,由服务器通过 MQTT 命令控制继电器,这也是大型农场集中式灌溉系统的实现思路。至此,你的土壤湿度传感器已经可以成功控制一个继电器,完成了一个最简自动浇灌系统的核心闭环。


说明:本文依据英文原版文档 translations/en/2-farm/lessons/3-automated-plant-watering/wio-terminal-relay.md 编写,并结合仓库内code-relay源码与图片资源补充实现细节。

【免费下载链接】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/15 20:53:09

ENVI多TIF整合:镶嵌与图层堆叠全流程实操指南

做遥感数据处理的人&#xff0c;十有八九都遇到过同样的问题&#xff1a;手里一堆TIF文件&#xff0c;比如2003年到2011年每年一景&#xff0c;想最终整合成一个完整的TIF&#xff0c;在ENVI里却不知道该点哪个工具&#xff0c;甚至有人把"镶嵌"和"堆叠"混…

作者头像 李华
网站建设 2026/9/15 20:53:00

基于滚动时域优化的V2G实时调度MATLAB仿真实现

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

作者头像 李华
网站建设 2026/9/15 20:50:59

Vue3页面布局溢出排查:横向滚动条、flex与组件库的修复指南

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

作者头像 李华