项目架构概览
项目架构概览
本节介绍自动投料/定时灌溉系统的整体架构设计。本项目通过 ESP32 深度睡眠定时唤醒、超声波液位传感器、继电器控制水泵,结合 Node-RED 的时间调度和 MariaDB 数据持久化,实现全自动定时投料控制。学习完成后,您将能够:
- 理解自动投料系统的整体架构和数据流
- 掌握 ESP32 状态机与 Node-RED 逻辑的分工
- 为客户设计可扩展的多路投料方案
System Architecture
Section titled “System Architecture”┌─────────────────────────────────────────────────────────────┐│ 自动投料系统架构图 │├─────────────────────────────────────────────────────────────┤│ ││ [ESP32] (每小时唤醒) ││ │ ││ ├── 1. 读取超声波传感器 (液位) ││ ├── 2. 通过 MQTT 发送液位数据到 Node-RED ││ ├── 3. 接收 Node-RED 返回的投料命令 (0/1) ││ ├── 4. 控制继电器 (投料泵) ││ └── 5. 进入深度睡眠 (1 小时) ││ ││ ▼ ││ [MQTT Broker - Mosquitto] ││ │ ││ ▼ ││ [Node-RED] ││ │ ││ ├── 1. 接收 ESP32 唤醒信号 ││ ├── 2. 查询 MariaDB 上次投料时间 ││ ├── 3. 计算时间差 → 判断是否需要投料 ││ ├── 4. 发送投料指令 (0/1) 给 ESP32 ││ ├── 5. 将液位数据存入 MariaDB ││ ├── 6. 检查液位 → 触发告警 (Telegram) ││ └── 7. Dashboard 可视化 ││ ││ ▼ ││ [MariaDB] ││ ├── plants_deep_sleep (唤醒记录) ││ ├── plants_level (液位历史) ││ └── dosing_schedule (投料计划) ││ │└─────────────────────────────────────────────────────────────┘Data Flow
Section titled “Data Flow”时序流程:
[ESP32 每小时唤醒] │ │ MQTT: esp32/dosing/info ──→ {distance: 16, state: "get_data"} ▼[Node-RED] │ ├──→ SQL: SELECT timestamp FROM plants_level ORDER BY id DESC LIMIT 1 ├──→ 计算: current_time - last_time > interval ? │ ├── 是 → MQTT: esp32/dosing/control ──→ 1 (启动投料) │ └── 否 → MQTT: esp32/dosing/control ──→ 0 (不投料) │ ├──→ SQL: INSERT INTO plants_level (timestamp, distance1) │ └──→ 检查液位: distance1 > critical_level ? ├── 是 → Telegram 告警: "液位过低,请补充原料" └── 否 → 正常记录Component Overview
Section titled “Component Overview”| 组件 | 型号/选型 | 功能 | 通信方式 |
|---|---|---|---|
| ESP32 | XIAO ESP32C3 / WROOM-32 | 主控制器 | Wi-Fi + MQTT |
| 液位传感器 | HC-SR04 超声波 | 测量液位高度 | GPIO (Trig/Echo) |
| 继电器模块 | SRD-05VDC-SL-C | 控制水泵电源 | GPIO (高电平触发) |
| 水泵 | DC 12V 隔膜泵 | 投料执行器 | 继电器控制 |
| MQTT Broker | Mosquitto | 消息中转 | MQTT |
| Node-RED | 最新版 | 逻辑编排 | MQTT + SQL |
| MariaDB | 最新版 | 数据持久化 | SQL |
ESP32 State Machine
Section titled “ESP32 State Machine” ┌──────────────┐ │ WAIT │ ←── 上电初始状态 │ (等待命令) │ └──────┬───────┘ │ MQTT 收到 "get_data" ▼ ┌──────────────┐ │ GET_DATA │ │ (读取液位) │ ◄── 发送 MQTT + 等待 Node-RED 命令 └──────┬───────┘ │ MQTT 收到 "1" (启动) ▼ ┌──────────────┐ │ PUMPING │ │ (投料中) │ ◄── 继电器打开 3 秒 └──────┬───────┘ │ 投料完成 ▼ ┌──────────────┐ │ TIME_FOR_SLEEP│ │ (准备睡眠) │ ◄── 发送 MQTT 记录 └──────┬───────┘ │ esp_deep_sleep_start() ▼ ┌──────────────┐ │ DEEP SLEEP │ │ (~10μA) │ ◄── 定时 1 小时唤醒 └──────────────┘Key Design Decisions
Section titled “Key Design Decisions”| 决策 | 方案 | 理由 |
|---|---|---|
| 控制逻辑位置 | Node-RED | ESP32 代码简单固定,修改调度无需重新烧录 |
| 时间判断 | MariaDB + Node-RED | 持久化存储投料历史,掉电不丢失 |
| 唤醒方式 | 定时器 (1 小时) | 电池供电场景最佳功耗平衡 |
| 通信模式 | 请求-响应 (MQTT) | ESP32 发布数据后等待 Node-RED 返回指令 |
| 状态机 | Enum + Switch | 代码可读性强,易于扩展多路投料 |
Customer-Facing Architecture Description
Section titled “Customer-Facing Architecture Description”方案概述: 本方案采用 ESP32 作为终端控制器,每小时从深度睡眠中唤醒一次。唤醒后读取容器液位,通过 MQTT 发送到 Node-RED 服务端。Node-RED 查询数据库中的上次投料时间,计算时间差后决定是否启动投料泵。投料完成后数据自动存入 MariaDB,并通过 Dashboard 实时展示液位趋势。液位过低时自动触发 Telegram 告警通知。