跳转到内容

项目架构概览

项目架构概览

本节介绍自动投料/定时灌溉系统的整体架构设计。本项目通过 ESP32 深度睡眠定时唤醒、超声波液位传感器、继电器控制水泵,结合 Node-RED 的时间调度和 MariaDB 数据持久化,实现全自动定时投料控制。学习完成后,您将能够:

  • 理解自动投料系统的整体架构和数据流
  • 掌握 ESP32 状态机与 Node-RED 逻辑的分工
  • 为客户设计可扩展的多路投料方案
┌─────────────────────────────────────────────────────────────┐
│ 自动投料系统架构图 │
├─────────────────────────────────────────────────────────────┤
│ │
│ [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 (投料计划) │
│ │
└─────────────────────────────────────────────────────────────┘
时序流程:
[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 告警: "液位过低,请补充原料"
└── 否 → 正常记录
组件型号/选型功能通信方式
ESP32XIAO ESP32C3 / WROOM-32主控制器Wi-Fi + MQTT
液位传感器HC-SR04 超声波测量液位高度GPIO (Trig/Echo)
继电器模块SRD-05VDC-SL-C控制水泵电源GPIO (高电平触发)
水泵DC 12V 隔膜泵投料执行器继电器控制
MQTT BrokerMosquitto消息中转MQTT
Node-RED最新版逻辑编排MQTT + SQL
MariaDB最新版数据持久化SQL
┌──────────────┐
│ 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 小时唤醒
└──────────────┘
决策方案理由
控制逻辑位置Node-REDESP32 代码简单固定,修改调度无需重新烧录
时间判断MariaDB + Node-RED持久化存储投料历史,掉电不丢失
唤醒方式定时器 (1 小时)电池供电场景最佳功耗平衡
通信模式请求-响应 (MQTT)ESP32 发布数据后等待 Node-RED 返回指令
状态机Enum + Switch代码可读性强,易于扩展多路投料

方案概述: 本方案采用 ESP32 作为终端控制器,每小时从深度睡眠中唤醒一次。唤醒后读取容器液位,通过 MQTT 发送到 Node-RED 服务端。Node-RED 查询数据库中的上次投料时间,计算时间差后决定是否启动投料泵。投料完成后数据自动存入 MariaDB,并通过 Dashboard 实时展示液位趋势。液位过低时自动触发 Telegram 告警通知。