# BotanicalBuddy 基于 ESP-IDF 的智能盆栽系统固件项目(ESP32-C3)。 当前结论:单片机端核心功能已完成,可直接联调 App/小程序侧。 ## 固件完成度 - 环境采集:土壤湿度、空气温湿度、光照强度 - 本地显示:LCD + LVGL 多页面轮播 - 设备控制:水泵、补光灯(高电平有效) - 自动控制:阈值 + 回差控制 - 手动控制:MQTT 远程开关泵/灯 - 模式切换:`auto` / `manual` - 告警推送:超阈值边沿事件上报 - 状态上报:周期性遥测(含模式与执行器状态) - Wi-Fi 配网:SoftAP + Captive Portal ## 系统架构 - `main/`:业务编排、控制循环、MQTT 回调对接 - `components/wifi-connect/`:配网与路由连接 - `components/lvgl_st7735s_use/`:LCD 与 LVGL 端口 - `components/ui/`:界面对象与变量绑定 - `components/i2c_master_messager/`:AHT30、BH1750 采集 - `components/capactive_soil_moisture_sensor_V2.0/`:土壤湿度采集 - `components/io_device_control/`:水泵/补光灯 GPIO 控制 - `components/mqtt_control/`:MQTT 连接、发布、控制指令解析 - `main/auto_ctrl_thresholds.*`:阈值存取与校验 - `main/auto_alerts.*`:告警判定与回调分发 ## 运行逻辑 1. 上电初始化 Wi-Fi、LCD、传感器、IO。 2. Wi-Fi 连通后启动 MQTT 与 Console。 3. 主循环每 1s 执行: - 采集传感器并刷新 UI 数据。 - 若 `mode=auto`,按阈值进行泵灯自动控制。 - 进行告警边沿判定并发布告警消息。 - 每 5s 发布一次状态遥测消息。 4. 收到 MQTT 控制消息时: - 可切模式(`auto/manual`)。 - 可更新阈值(四个阈值需同条下发)。 - 可手动控制泵灯开关。 ## 开发环境 - Linux - ESP-IDF `v5.5.2` - 目标芯片:`esp32c3` ## 编译与烧录 1. 配置环境变量 ```bash export IDF_PATH=/home/beihong/esp/v5.5.2/esp-idf source $IDF_PATH/export.sh ``` 2. 构建 ```bash idf.py set-target esp32c3 idf.py build ``` 3. 烧录并监视日志 ```bash idf.py -p /dev/ttyACM0 flash monitor ``` ## MQTT 协议 ### ESP32 -> WEX 1. 告警消息主题:`topic/alert/esp32_iothome_001` ```json { "metric": "light", "state": "alarm" } ``` 字段: - `metric`:`soil` 或 `light` - `state`:`normal` 或 `alarm` 2. 状态消息主题:`topic/sensor/esp32_BotanicalBuddy_001` ```json { "temp": "34.3", "hum": "30.5", "soil": "0", "lux": "40", "pump": "on", "light": "off", "mode": "auto" } ``` 字段: - `pump`:`on/off` - `light`:`on/off` - `mode`:`auto/manual` ### WEX -> ESP32 控制主题:`topic/control/esp32_BotanicalBuddy_001` 1. 切换模式 ```json { "mode": "manual" } ``` ```json { "mode": "auto" } ``` 2. 手动控制(建议先切到 `manual`) ```json { "pump": "on", "light": "off" } ``` 3. 更新自动阈值(四个字段需同时下发) ```json { "soil_on": 35, "soil_off": 45, "light_on": 100, "light_off": 350 } ``` 4. 混合下发(同一条消息可同时包含模式、阈值、手动开关) ```json { "mode": "auto", "soil_on": 35, "soil_off": 45, "light_on": 100, "light_off": 350, "pump": "off", "light": "on" } ``` 兼容输入: - `pump/light` 支持 `on/off`、`true/false`、`1/0` - `mode` 支持 `auto/manual`,也兼容 `true/false`、`1/0`(`true/1=auto`) ## 联调建议 1. 先下发 `{"mode":"manual"}`,验证手动泵灯控制。 2. 再下发阈值并切 `{"mode":"auto"}`,观察自动控制接管。 3. 注意阈值含回差: - 土壤:`soil_on` 开泵,`soil_off` 关泵 - 光照:`light_on` 开灯,`light_off` 关灯 ## 说明 - 当前 README 聚焦单片机固件能力与联调协议。 - App/小程序页面与云端业务可按本协议直接对接。