智能草本种植箱:Alexa 语音控制的自动化室内园艺系统
硬件清单 (BOM)
| 组件 | 数量 | 用途 |
|---|---|---|
| Amazon Echo Dot (Alexa 语音助手) | 1 | 语音交互入口 |
| Arduino Uno R3 | 1 | 主控制器,读取传感器、驱动继电器 |
| ESP8266 ESP-01 WiFi 模块 | 1 | Arduino 联网桥接,HTTP 请求云端 API |
| Arduino Proto Shield | 1 | 扩展板,焊接传感器、继电器模块 |
| 4 路继电器模块 (低电平触发) | 1 | 隔离控制:水泵×2、植物生长灯、预留 |
| YL-69 土壤湿度传感器 | 4 | 监测 3 盆草本 + 1 个外部扩展 |
| 12V 潜水泵 (微型) | 2 | 分别供水两路灌溉管路 |
| 植物生长灯 (220V AC) | 1 | 补光,继电器控制强弱电隔离 |
| 220V 转 12V 电源适配器 | 1 | 供水泵、继电器板、Arduino (经降压) |
| 12V 转 5V 降压模块 (LM2596) | 1 | 给 Arduino/ESP-01 供电 |
| USB 电源线、杜邦线、气管、水管 | 若干 | 连接与管路 |
| 榉木板 (制作箱体) | 1 套 | 激光切割/手工锯切,含花盆固定圈 |
系统架构概览
本项目构建了一个「边缘-云-语音」三层架构的智能种植箱:
- 边缘层 (Arduino + ESP-01):采集 4 路土壤湿度,控制 2 路水泵 + 1 路生长灯,通过 ESP-01 经 WiFi 与云端 API 交互 (HTTP 短轮询)
- 云端层 (PHP + MySQL + Chart.js):提供 RESTful API,存储配置 (引脚映射、检测间隔、灌溉时长)、时序湿度数据,渲染 Web 仪表盘 (Bootstrap + jQuery + X-editable)
- 语音层 (Alexa Skill + AWS Lambda):用户对 Echo Dot 说话 → Alexa 解析意图 → Lambda 转发 JSON 到云端 API → 云端下发指令 → Arduino 轮询执行 → 结果回传 → Alexa 语音回复
核心功能
| 功能 | 触发方式 | 执行逻辑 |
|---|---|---|
| 定时湿度上报 | Arduino 定时器 (默认 60s) | 读取模拟值 → 发送 HTTP GET 到 /plant?action=humidity&code=LEFT&humidity=xxx |
| 远程配置下发 | Arduino 定时轮询 (60s) | GET /plant?action=get&code=LEFT → 解析 JSON 更新引脚、间隔 |
| 语音查询湿度 | 「Alexa, ask herb box how my plants are」 | Lambda → 云端 API → 返回所有植物状态 → Alexa 朗读 |
| 语音指定灌溉 | 「Alexa, tell herb box to irrigate basil for 5 seconds」 | Lambda → 云端写入 Action 栈 → Arduino 轮询读取 → 触发对应水泵继电器 5 秒 |
| 语音控制补光灯 | 「Alexa, tell herb box to switch the lamp on」 | 同理,控制生长灯继电器 |
| 查询需水植物 | 「Alexa, ask herb box which plants need irrigation」 | 云端判断湿度阈值,返回干旱植物列表 |
| 查询上次灌溉时间 | 「Alexa, ask herb box when was last irrigation of basil」 | 云端记录灌溉日志,计算间隔小时数 |
关键技术实现细节
1. 土壤湿度传感器驱动 (防电解腐蚀)
byte vccPin = 6; // 控制传感器供电的 GPIO
byte dataPin = A1; // 模拟输入
int readHumidity() {
digitalWrite(vccPin, HIGH); // 仅测量瞬间供电
delay(500); // 稳定等待
int value = analogRead(dataPin);
digitalWrite(vccPin, LOW); // 立即断电,防止电解腐蚀
return 1023 - value; // 值越大 = 越湿 (根据模块特性取反)
}
关键点:间歇供电 大幅延长探针寿命;1023 - value 将「干=大」转为「湿=大」符合直觉。
2. 低电平触发继电器的正确控制逻辑
// 继电器模块:IN 接低电平 (0V) → 线圈导通 → 常开触点闭合
// Arduino 引脚默认 INPUT/LOW (高阻态 ≈ 3.3V 上拉) → 继电器断开 (安全)
void activatePump(byte pin) {
pinMode(pin, OUTPUT); // 切为输出模式
digitalWrite(pin, LOW); // 输出低电平 → 继电器吸合
}
void deactivatePump(byte pin) {
digitalWrite(pin, HIGH); // 先输出高电平
pinMode(pin, INPUT); // 再切为输入 (高阻) → 继电器释放
}
这种「OUTPUT+LOW=ON, INPUT=OFF」模式利用了 Arduino 引脚上电默认高阻态,避免上电瞬间误触发高压负载。
3. ESP-01 AT 指令 HTTP 客户端 (轻量级)
为节省 Arduino RAM (Uno 仅 2KB),未使用重量级 WiFiEsp 库,直接用 SoftwareSerial 发 AT 指令实现 HTTP/1.0 短连接:
bool httpRequest(String site) { // site 如 "/plant?action=get&code=LEFT"
// 1. 建立 TCP 连接
espSerial.print("AT+CIPSTART=\"TCP\",\"", API_SERVER, "\",80");
if (!espSerial.find("OK")) return false;
// 2. 准备发送数据长度
String cmd = "GET " + site + " HTTP/1.0\r\nHost: " + API_SERVER + "\r\nConnection: close\r\n\r\n";
int cmdLength = cmd.length();
espSerial.print("AT+CIPSEND="); espSerial.println(cmdLength);
if (!espSerial.find(">")) return false;
// 3. 发送 HTTP 请求
espSerial.print(cmd);
if (!espSerial.find(":")) return false; // 等待发送提示
// 4. 读取响应头,跳过至 Body
char status[32];
espSerial.readBytesUntil('\r', status, sizeof(status));
if (strcmp(status, "HTTP/1.1 200 OK") != 0) return false;
if (!espSerial.find("\r\n\r\n")) return false;
// 5. 响应体留在缓冲区,由调用者用 ArduinoJson 解析
return true;
}
波特率从 115200 降至 9600 提高稳定性;HTTP/1.0 避免 Chunked 编码解析麻烦。
4. 云端 API 设计 (PHP + MySQL)
核心端点:
GET /plant?action=get&code=LEFT→ 返回{"dataPin":A1,"interval":60000}GET /plant?action=humidity&code=LEFT&humidity=823→ 存储时序点GET /action→ 返回最新待执行动作{"entryNo":12,"actionEnum":2,"pin":11,"value":"5000"}GET /action?action=processed&entryNo=12→ 标记动作已执行
前端仪表盘用 Chart.js 绘制湿度趋势图,X-editable 实现表格内联编辑配置。
5. Alexa Skill 交互模型 (意图 Schema)
// 核心意图示例
{
"intents": [
{"name": "ReadHumidityIntent", "slots": [{"name": "plantName", "type": "PLANT_NAME"}]},
{"name": "IrrigatePlantIntent", "slots": [
{"name": "plantName", "type": "PLANT_NAME"},
{"name": "durationSeconds", "type": "AMAZON.NUMBER"}
]},
{"name": "SwitchIntent", "slots": [{"name": "switchState", "type": "ON_OFF"}]},
{"name": "ReadIrrigateIntent"},
{"name": "ReadLastIrrigationIntent", "slots": [{"name": "plantName", "type": "PLANT_NAME"}]}
],
"types": [
{"name": "PLANT_NAME", "values": [{"name":{"value":"basil"}},{"name":{"value":"mint"}},{"name":{"value":"parsley"}}]},
{"name": "ON_OFF", "values": [{"name":{"value":"on"}},{"name":{"value":"off"}}]}
]
}
支持中英文双语言模型 (locale: en-US, de-DE)。Lambda 函数仅做透传:https.post(myApiUrl, eventJson)。
6. Arduino 端任务调度 (StensTimer 非阻塞定时器)
// 主循环极简
void loop() {
stensTimer->run(); // 处理所有注册的定时任务
}
// 任务注册示例 (setup 中)
stensTimer->setInterval(&apiTimer, ACTION_PLANT_UPDATE, 60000); // 60s 同步配置/心跳
stensTimer->setInterval(&actionBuffer, ACTION_ECOACTION_READ, 1000); // 1s 轮询云端指令
stensTimer->setTimer(&leftPlant, ACTION_PLANT_CHECKHUMIDITY, 60000); // 单株定时上报
所有耗时操作 (网络、传感器读取) 均在定时器回调中异步触发,loop() 仅跑调度器,保证实时性。
箱体制作要点
- 材质:18mm 榉木板,D3 防水胶粘接,底板可拆卸 (螺丝固定) 便于维护
- 激光切割开孔:3 个花盆圆孔 (直径匹配超市盆栽)、传感器/出水管孔、线槽
- 内部布线:继电器模块、Arduino、Proto Shield 固定在底板;水泵、电源适配器侧置
- 防水设计:每个花盆下方加托盘,防止漏水浸湿电子元件
- 外观:透光亚克力面板可选,便于观察植物生长
项目成果演示
最终实现的语音交互示例 (支持中/英/德):
- 「Alexa, 问问草本盒我的植物怎么样」 → 「植物1良好,植物2缺水,植物3良好」
- 「Alexa, 告诉草本盒给罗勒浇水5秒」 → 「正在给罗勒灌溉5秒」
- 「Alexa, 问问草本盒哪些植物需要浇水」 → 「植物2和植物3需要灌溉」
- 「Alexa, 问问草本盒上次给罗勒浇水是什么时候」 → 「罗勒上次灌溉是36小时前」
- 「Alexa, 告诉草本盒打开补光灯」 → 「已打开植物生长灯」
配套 Web 仪表盘可实时查看湿度曲线、修改灌溉策略、手动触发动作。
待实现功能 (Roadmap)
- Arduino 低功耗模式 (睡眠+看门狗定时唤醒)
- 外挂无线节点:ESP-NOW / nRF24L01 连接电池供电的远程湿度节点,箱体作为网关聚合上传
- 多用户/多设备支持:云端 API 增加设备 ID 隔离
- 物理按键面板:本地紧急灌溉/开灯,不依赖网络/语音
- Alexa 技能卡片图片:返回植物照片、湿度图表
代码仓库结构
WhiteWalnut.ino // 主程序入口,任务注册
Plant.h / Plant.cpp // 植物对象:湿度读取、定时上报、配置同步
EcoActionBuffer.h/cpp // 动作缓冲:轮询云端指令、执行继电器动作、定时关闭
WhiteWalnutApi.h/cpp // 网络层:WiFi连接、HTTP请求、JSON解析(ArduinoJson)
StensTimer.h // 非阻塞定时器库 (需单独安装)
ArduinoJson.h // JSON 解析 (v5 语法)
完整代码、PHP 后端、Alexa Skill 模型、激光切割图纸请访问项目 GitHub 仓库 (链接见原文)。这是一个融合嵌入式、云端、语音 AI 的完整物联网实战项目,极适合进阶学习全栈 IoT 开发。
制造工艺
- 基于 Web 控制的 DMX 灯光系统 – Arduino 主控制器
- DIY 蓝牙控制 Arduino 间谍小车
- SERENA:基于 Arduino Mega 2560 与 TFT 触摸屏的多级密码报警系统
- 紧凑型气象站:Arduino Nano + ESP8266 双核方案 (BMP280 + OLED/Nokia 双屏)
- 智能地下室通风系统:Arduino 驱动的湿度自动控制
- 基于 Arduino 与 Google Sheets 的实时 RFID 考勤系统
- 无线Arduino编程盾:HC-05蓝牙模块实现免USB线烧录
- Arduino智能防碰撞预警系统:超声波测距+声光分级报警
- Arduino Nano 专用 2.8 英寸 TFT 扩展板 – 320×240 SPI 显示屏
- 适用于 Arduino UNO/MEGA 的 Nixie 管时钟扩展板 NCS314 – 兼容 IN-14/IN-12 型号
- Arduino Mega 2560 驱动的开源植物生长箱控制器:固件与硬件全指南
- Arduino 智能安防系统:超声波测距 + 舵机扫描 + 声光报警