使用 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)
按以下步骤完成接线:
- 取一根 Grove 连接线,将一端插入继电器上的插座——该插头只有一个方向能插进去。
- 先将 Wio Terminal 与电脑或其他电源断开连接,再把 Grove 线的另一端接到 Wio Terminal 上屏幕正对视角的左侧 Grove 插座;右侧插座继续保留土壤湿度传感器。
- 若上一课尚未把土壤湿度传感器插入土壤,现在将其插入土壤中。
编写继电器控制固件
将复用端口配置为输出引脚
继电器没有独立的 Arduino 库——它就是一个靠高/低电平控制的数字执行器:向引脚输出高电平(3.3V)即打开继电器,输出低电平(0V)即关闭。可以使用 Arduino 内置的digitalWrite函数完成控制。
- 如果 VS Code 中还没有打开上一课的
soil-moisture-sensor项目,请先打开它,本课将在该项目基础上继续修改。 - 在
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(半秒),再写入低电平将其关闭。
- 编译并上传代码到 Wio Terminal。
- 上传完成后,继电器会每 10 秒开关一次,并在开与关之间保持半秒间隔。你将听到继电器吸合与释放时清脆的"咔哒"声;Grove 继电器板上的 LED 在继电器打开时点亮、关闭时熄灭。
完整的测试代码骨架
在code-relay工程中,继电器测试阶段的完整代码结构与最终版保持一致,仅在loop中的处理逻辑不同。完整的最终实现位于 code-relay/wio-terminal/soil-moisture-sensor/src/main.cpp,工程配置见 platformio.ini(platform = atmelsam、board = seeed_wio_terminal、framework = arduino)。
根据土壤湿度控制继电器
用阈值逻辑替代测试代码
继电器验证通过后,就可以让它根据土壤湿度读数自动通断:
- 删除上一节用于测试继电器的 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"意味着土壤偏干、需要浇水。
- 编译并上传代码到 Wio Terminal。
- 打开串口监视器观察输出。可以看到继电器根据土壤湿度变化自动打开/关闭。先在干燥的土壤中测试,再浇水观察切换。
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),仅供参考