feat:新增MQTT控制组件和自动告警系统

- 实现MQTT控制功能,处理水泵和灯光控制指令
- 新增土壤湿度和光照强度自动告警系统,阈值可配置
- 新建MQTT控制、自动告警和阈值管理相关文件
- 更新主应用,集成MQTT和自动控制功能
- 新增传感器数据与控制状态遥测上报
- 引入NVS和应用存储分区配置
This commit is contained in:
Wang Beihong
2026-03-07 02:43:30 +08:00
parent cf3634bebb
commit 5980e171c4
13 changed files with 1279 additions and 77 deletions

217
README.md
View File

@@ -1,92 +1,163 @@
# BotanicalBuddy
需求:
智能盆栽管理系统
1. 环境全维度监测:实时、同步监测土壤湿度、环境温湿度、光照强度。
2. 智能预警通知当任何监测数据超出用户设定的阈值时系统自动向手机App推送报警信息。
3. 双向远程控制:
· 手动控制用户通过手机App远程手动控制水泵浇水、补光灯开关。
· 自动控制:系统根据预设阈值(如土壤过干)自动执行浇水或补光。
4. 双模式人机交互:
· 远程交互通过手机App查看实时数据、历史曲线和进行控制。
· 本地交互通过LCD屏幕现场查看系统状态与关键数据。
基于 ESP-IDF 的智能盆栽系统固件项目ESP32-C3
基于 ESP-IDF 的植物助手项目,当前已集成:
当前结论:单片机端核心功能已完成,可直接联调 App/小程序侧。
- **Wi-Fi 配网组件wifi-connect**:手机连接设备热点后通过网页完成路由器配置
- **LCD 显示组件lvgl_st7735s_use**:基于 LVGL 驱动 ST77xx SPI 屏并显示界面
- **I2C 传感器组件i2c_master_messager**:统一读取 BH1750 / AHT30 数据
- **IO 外设控制组件io_device_control**:控制水泵与光照开关(高电平有效)
## 固件完成度
## 功能特性
- 环境采集:土壤湿度、空气温湿度、光照强度
- 本地显示LCD + LVGL 多页面轮播
- 设备控制:水泵、补光灯(高电平有效)
- 自动控制:阈值 + 回差控制
- 手动控制MQTT 远程开关泵/灯
- 模式切换:`auto` / `manual`
- 告警推送:超阈值边沿事件上报
- 状态上报:周期性遥测(含模式与执行器状态)
- Wi-Fi 配网SoftAP + Captive Portal
- 长按按键进入配网模式
- 支持两种配网策略:按键触发 / 常驻配网
- 设备开启 SoftAP`ESP32-xxxxxx`+ Captive Portal
- 手机访问 `http://192.168.4.1` 完成 Wi-Fi 配置
- 支持清除已保存 Wi-Fi 参数并重新配网
- 串口中文状态日志,便于调试和现场维护
- 支持 ST77xx SPI LCD 显示LVGL
- 支持方向/偏移参数化配置,便于后续适配不同屏幕
- 支持水泵GPIO1与光照GPIO10控制接口
## 系统架构
## 目录结构
- `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.*`:告警判定与回调分发
- `main/`:应用入口(`app_main`
- `components/wifi-connect/`:配网组件实现与文档
- `README.md`:组件说明
- `USER_GUIDE.md`:用户操作手册
- `QUICK_POSTER.md`:张贴版快速指引
- `BLOG.md`:博客草稿
- `components/lvgl_st7735s_use/`LCD 显示组件LVGL + ST77xx
- `README.md`:组件说明与调参指南
- `components/i2c_master_messager/`I2C 传感器管理组件
- `README.md`:传感器采集与配置说明
- `components/io_device_control/`IO 外设控制组件
- `README.md`:水泵/光照控制接口说明
## 运行逻辑
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`(建议)
- Python 与 ESP-IDF 工具链按官方方式安装
- ESP-IDF `v5.5.2`
- 目标芯片:`esp32c3`
## 快速开始
## 编译与烧录
1. 配置并编译
- `idf.py set-target esp32`
- `idf.py build`
2. 烧录并查看日志
- `idf.py -p /dev/ttyUSB0 flash monitor`
3. 显示初始化
-`app_main` 中调用:`ESP_ERROR_CHECK(start_lvgl_demo());`
- 可选:`ESP_ERROR_CHECK(lvgl_st7735s_set_center_text("BotanicalBuddy"));`
4. 配网
- 按键触发模式:长按设备按键进入配网模式
- 常驻配网模式:上电自动进入配网模式
- 手机连接 `ESP32-xxxxxx`
- 打开 `http://192.168.4.1`
- 选择路由器并输入密码提交
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
```
- 若出现“按键未按下却进入配网”,通常是按键引脚与 LCD/外设复用导致电平抖动。
- 可在 `WiFi Connect` 配置中调大:
- `WIFI_CONNECT_BUTTON_STARTUP_GUARD_MS`(建议 8000~10000
- `WIFI_CONNECT_BUTTON_RELEASE_ARM_MS`(建议 300~500
- 若硬件允许,优先给配网按键使用独立 GPIO避免与屏幕复位脚复用。
- 若使用常驻配网模式,可不依赖按键触发(适合按键与 LCD 复位脚复用场景)。
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/小程序页面与云端业务可按本协议直接对接。
并完成 LCD 显示链路:
- SPI 屏初始化
- LVGL 显示注册
- 方向/偏移可配置