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 当前 IPmqtt_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:状态快照时间与更新统计
运行逻辑
- 上电初始化 Wi-Fi、LCD、传感器、IO。
- Wi-Fi 连通后启动 MQTT 与 Console。
- 主循环每 1s 执行:
- 采集传感器并刷新 UI 数据。
- 若
mode=auto,按阈值进行泵灯自动控制。 - 进行告警边沿判定并发布告警消息。
- 每 5s 发布一次状态遥测消息。
- 收到 MQTT 控制消息时:
- 可切模式(
auto/manual)。 - 可更新阈值(四个阈值需同条下发)。
- 可手动控制泵灯开关。
- 可切模式(
开发环境
- Linux
- ESP-IDF
v5.5.2 - 目标芯片:
esp32c3
编译与烧录
- 配置环境变量
export IDF_PATH=/home/beihong/esp/v5.5.2/esp-idf
source $IDF_PATH/export.sh
- 构建
idf.py set-target esp32c3
idf.py build
- 烧录并监视日志
idf.py -p /dev/ttyACM0 flash monitor
MQTT 协议
ESP32 -> WEX
- 告警消息主题:
topic/alert/esp32_iothome_001
{
"metric": "light",
"state": "alarm"
}
字段:
metric:soil或lightstate:normal或alarm
- 状态消息主题:
topic/sensor/esp32_BotanicalBuddy_001
{
"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/offlight:on/offmode:auto/manualsoil_on:土壤湿度低阈值(低于该值自动开泵)soil_off:土壤湿度高阈值(高于该值自动关泵)light_on:光照低阈值(低于该值自动开灯)light_off:光照高阈值(高于该值自动关灯)
WEX -> ESP32
控制主题:topic/control/esp32_BotanicalBuddy_001
- 切换模式
{ "mode": "manual" }
{ "mode": "auto" }
- 手动控制(建议先切到
manual)
{ "pump": "on", "light": "off" }
- 更新自动阈值(四个字段需同时下发)
{
"soil_on": 35,
"soil_off": 45,
"light_on": 100,
"light_off": 350
}
- 混合下发(同一条消息可同时包含模式、阈值、手动开关)
{
"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/0mode支持auto/manual,也兼容true/false、1/0(true/1=auto)
联调建议
- 先下发
{"mode":"manual"},验证手动泵灯控制。 - 再下发阈值并切
{"mode":"auto"},观察自动控制接管。 - 注意阈值含回差:
- 土壤:
soil_on开泵,soil_off关泵 - 光照:
light_on开灯,light_off关灯
- 土壤:
说明
- 当前 README 聚焦单片机固件能力与联调协议。
- App/小程序页面与云端业务可按本协议直接对接。
Description
Languages
C
99.8%
CMake
0.2%