Files
Smart-granary-code/README.md
2026-03-11 20:14:14 +08:00

6.2 KiB
Raw Blame History

BotanicalBuddy

基于 ESP-IDF 的智能盆栽系统固件项目ESP32-C3

当前结论:单片机端核心功能已完成,可直接联调 App/小程序侧。

固件完成度

  • 环境采集:空气温湿度、光照强度
  • 本地显示LCD + LVGL 多页面轮播
  • 设备控制:风扇、补光灯、加热、制冷(高电平有效)
  • 自动控制:阈值 + 回差控制
  • 手动控制MQTT 远程开关风扇/灯/加热/制冷
  • 模式切换:auto / manual
  • 告警推送:超阈值边沿事件上报
  • 状态上报:周期性遥测(含模式与执行器状态)
  • Wi-Fi 配网SoftAP + Captive Portal
  • 状态网页:独立 HTTP 状态看板与 JSON API端口 8080

系统架构

  • main/业务编排、控制循环、MQTT 回调对接
  • components/wifi-connect/:配网与路由连接
  • components/lvgl_st7735s_use/LCD 与 LVGL 端口
  • components/ui/:界面对象与变量绑定
  • components/i2c_master_messager/AHT30、BH1750 采集
  • components/io_device_control/:风扇/补光灯/加热/制冷 GPIO 控制
  • components/mqtt_control/MQTT 连接、发布、控制指令解析
  • main/auto_ctrl_thresholds.*:阈值存取与校验
  • main/auto_alerts.*:告警判定与回调分发
  • main/status_web.*独立状态网页服务HTTP 8080

状态网页(独立于配网页)

  • 配网页面:http://192.168.4.1(仅 SoftAP 配网阶段)
  • 状态页面:http://<设备STA_IP>:8080/
  • 状态 APIhttp://<设备STA_IP>:8080/api/status

说明:

  • 两个网页服务独立运行,端口不同、职责不同。
  • 状态页用于运行态观测,不承载 Wi-Fi 配网流程。

/api/status 当前主要字段:

  • temphumlux:传感器字符串值
  • fanlighthotcool:执行器状态(on/off
  • mode:控制模式(auto/manual
  • light_onlight_off:光照阈值
  • hot_on_temphot_off_temp:加热温度阈值(摄氏度)
  • cool_on_tempcool_off_temp:制冷温度阈值(摄氏度)
  • fan_on_humfan_off_hum:风扇湿度阈值(%RH
  • wifi_statusWi-Fi 状态(idle/provisioning/connecting/connected/failed/timeout
  • sta_ipSTA 当前 IP
  • mqtt_connectedMQTT 连接状态(布尔)
  • i2c_ready:关键外设初始化状态(布尔)
  • loop_counter:主循环计数
  • uptime_ms:设备运行时长(毫秒)
  • free_heapmin_free_heaplargest_block:堆内存指标
  • app_version:固件版本字符串
  • snapshot_update_mssnapshot_update_countsnapshot_age_ms:状态快照时间与更新统计

运行逻辑

  1. 上电初始化 Wi-Fi、LCD、传感器、IO。
  2. Wi-Fi 连通后启动 MQTT 与 Console。
  3. 主循环每 1s 执行:
    • 采集传感器并刷新 UI 数据。
  • mode=auto,按阈值进行风扇/灯/加热/制冷自动控制。
  • 进行告警边沿判定并发布告警消息。
  • 每 5s 发布一次状态遥测消息。
  1. 收到 MQTT 控制消息时:
    • 可切模式(auto/manual)。
    • 可更新阈值8 个阈值需同条下发)。
    • 可手动控制风扇/补光灯/加热/制冷开关。

开发环境

  • Linux
  • ESP-IDF v5.5.2
  • 目标芯片:esp32c3

编译与烧录

  1. 配置环境变量
export IDF_PATH=/home/beihong/esp/v5.5.2/esp-idf
source $IDF_PATH/export.sh
  1. 构建
idf.py set-target esp32c3
idf.py build
  1. 烧录并监视日志
idf.py -p /dev/ttyACM0 flash monitor

MQTT 协议

ESP32 -> WEX

  1. 告警消息主题:topic/alert/esp32_iothome_001
{
  "metric": "light",
  "state": "alarm"
}

字段:

  • metriclight
  • statenormalalarm
  1. 状态消息主题:topic/sensor/esp32_BotanicalBuddy_001
{
  "temp": "34.3",
  "hum": "30.5",
  "lux": "40",
  "fan": "on",
  "light": "off",
  "hot": "off",
  "cool": "off",
  "mode": "auto",
  "light_on": 100.0,
  "light_off": 350.0,
  "hot_on_temp": 18.0,
  "hot_off_temp": 20.0,
  "cool_on_temp": 30.0,
  "cool_off_temp": 28.0,
  "fan_on_hum": 80.0,
  "fan_off_hum": 70.0
}

字段:

  • fanon/off
  • lighton/off
  • hoton/off
  • coolon/off
  • modeauto/manual
  • light_on:光照低阈值(低于该值自动开灯)
  • light_off:光照高阈值(高于该值自动关灯)
  • hot_on_temp / hot_off_temp:加热开关阈值(含回差)
  • cool_on_temp / cool_off_temp:制冷开关阈值(含回差)
  • fan_on_hum / fan_off_hum:风扇开关阈值(含回差)

WEX -> ESP32

控制主题:topic/control/esp32_BotanicalBuddy_001

  1. 切换模式
{ "mode": "manual" }
{ "mode": "auto" }
  1. 手动控制(建议先切到 manual
{ "fan": "on", "light": "off", "hot": "off", "cool": "off" }
  1. 更新自动阈值8 个字段需同时下发)
{
  "light_on": 100,
  "light_off": 350,
  "hot_on_temp": 18,
  "hot_off_temp": 20,
  "cool_on_temp": 30,
  "cool_off_temp": 28,
  "fan_on_hum": 80,
  "fan_off_hum": 70
}
  1. 混合下发(同一条消息可同时包含模式、阈值、手动开关)
{
  "mode": "auto",
  "light_on": 100,
  "light_off": 350,
  "hot_on_temp": 18,
  "hot_off_temp": 20,
  "cool_on_temp": 30,
  "cool_off_temp": 28,
  "fan_on_hum": 80,
  "fan_off_hum": 70,
  "fan": "off",
  "light": "on",
  "hot": "off",
  "cool": "off"
}

兼容输入:

  • fan/light/hot/cool 支持 on/offtrue/false1/0
  • mode 支持 auto/manual,也兼容 true/false1/0true/1=auto

联调建议

  1. 先下发 {"mode":"manual"},验证手动风扇/灯/加热/制冷控制。
  2. 再下发阈值并切 {"mode":"auto"},观察自动控制接管。
  3. 注意阈值含回差:
  • 光照:light_on 开灯,light_off 关灯
  • 温度:hot_on_temp/hot_off_tempcool_on_temp/cool_off_temp
  • 湿度:fan_on_hum 开风扇,fan_off_hum 关风扇

说明

  • 当前 README 聚焦单片机固件能力与联调协议。
  • App/小程序页面与云端业务可按本协议直接对接。