199 lines
5.3 KiB
Markdown
199 lines
5.3 KiB
Markdown
# 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_st7789_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/status_web.*`:独立状态网页服务(HTTP 8080)
|
||
|
||
## 状态网页(独立于配网页)
|
||
|
||
- 配网页面:`http://192.168.4.1`(仅 SoftAP 配网阶段)
|
||
- 状态页面:`http://<设备STA_IP>:8080/`
|
||
- 状态 API:`http://<设备STA_IP>:8080/api/status`
|
||
|
||
说明:
|
||
- 两个网页服务独立运行,端口不同、职责不同。
|
||
- 状态页用于运行态观测,不承载 Wi-Fi 配网流程。
|
||
|
||
`/api/status` 当前主要字段:
|
||
- `temp`、`hum`、`soil`、`lux`:传感器字符串值
|
||
- `pump`、`light`:执行器状态(`on/off`)
|
||
- `mode`:控制模式(`auto/manual`)
|
||
- `soil_on`、`soil_off`、`light_on`、`light_off`:自动控制阈值
|
||
- `wifi_status`:Wi-Fi 状态(`idle/provisioning/connecting/connected/failed/timeout`)
|
||
- `sta_ip`:STA 当前 IP
|
||
- `mqtt_connected`:MQTT 连接状态(布尔)
|
||
- `i2c_ready`、`soil_sensor_ready`:关键外设初始化状态(布尔)
|
||
- `loop_counter`:主循环计数
|
||
- `uptime_ms`:设备运行时长(毫秒)
|
||
- `free_heap`、`min_free_heap`、`largest_block`:堆内存指标
|
||
- `app_version`:固件版本字符串
|
||
- `snapshot_update_ms`、`snapshot_update_count`、`snapshot_age_ms`:状态快照时间与更新统计
|
||
|
||
## 运行逻辑
|
||
|
||
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",
|
||
"soil_on": 35.0,
|
||
"soil_off": 45.0,
|
||
"light_on": 100.0,
|
||
"light_off": 350.0
|
||
}
|
||
```
|
||
|
||
字段:
|
||
- `pump`:`on/off`
|
||
- `light`:`on/off`
|
||
- `mode`:`auto/manual`
|
||
- `soil_on`:土壤湿度低阈值(低于该值自动开泵)
|
||
- `soil_off`:土壤湿度高阈值(高于该值自动关泵)
|
||
- `light_on`:光照低阈值(低于该值自动开灯)
|
||
- `light_off`:光照高阈值(高于该值自动关灯)
|
||
|
||
### 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/小程序页面与云端业务可按本协议直接对接。
|
||
|