Files
agri_env/README.md
Wang Beihong d9fba1be5b feat: 集成 MQTT 高频上报与远程控制功能,并标准化协议文档
1. 核心功能增强:
   - 实现 1s/次的传感器数据主动上报,温湿度精度提升至小数点后两位。
   - 新增基于 cJSON 的 MQTT 控制指令解析逻辑,支持对双路继电器的远程开关控制。
   - 引入即时回执 (ACK) 机制:设备在执行控制指令后立即通过 `agri/env/ack` 主题反馈执行状态。

2. 系统架构优化:
   - 引入 `sntp_time` 组件实现自动对时,确保上报数据携带准确的 `YYYY-MM-DD HH:MM:SS` 时间戳。
   - 增加基于 eFuse 的芯片 UID 获取逻辑,结合 MAC 地址实现设备唯一标识。
   - 为传感器采集任务引入 Mutex 互斥锁,确保多任务环境下 `env_sample_data_t` 的线程安全。
   - 将所有传感器任务堆栈提升至 3072 字节,解决 cJSON 操作导致的 Stack Overflow 风险。

3. 文档与规范:
   - 新增 `README_MQTT.md` (V1.2),定义了环境报文、控制指令及 ACK 回执的完整 JSON Schema。
   - 同步更新主工程 `README.md`,明确硬件接线说明及系统功能列表。
2026-04-19 20:34:26 +08:00

220 lines
5.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AgriEnv_Monitor
## MQTT 协议文档
MQTT 上报与双继电器控制格式请参考:`README_MQTT.md`
本项目基于 ESP-IDF新增了一个统一环境采集与控制组件 `agri_env`,实现以下功能:
1. DHT11 温湿度采集DATA -> GPIO10
2. BH1750 光照采集I2C 地址 0x23SDA -> GPIO4SCL -> GPIO5
3. MQ135 数据采集AO -> GPIO1
4. 双路继电器控制
5. 统一数据结构与获取接口
6. MQTT 连接MQTT 3.1.1,自动获取 UID/MAC/时间)
7. MQTT 集成控制指令及即时回执ACK
8. 高频环境上报1 秒一次2 位精度)
9. cJSON 数据包序列化与上报
## 协议文档
详细的 MQTT 报文格式及指令说明请参考:[README_MQTT.md](README_MQTT.md)
## 目录说明
新增组件位于:
- `components/agri_env/include/agri_env.h`
- `components/agri_env/agri_env.c`
- `components/agri_env/CMakeLists.txt`
`main/main.c` 已接入初始化与示例读取逻辑。
## 硬件接线
### 1. DHT11
- VCC -> 3.3V
- GND -> GND
- DATA -> GPIO10
- 推荐 DATA 加 4.7k~10k 上拉电阻到 3.3V
### 2. BH1750
- VCC -> 3.3V
- GND -> GND
- SDA -> GPIO4
- SCL -> GPIO5
- 地址0x23ADDR 引脚悬空或接地)
### 3. MQ135
- DO数字输出-> GPIO10
注意:当前工程使用 MQ135 的 DO 数字输出,不做 ADC 采样。
- 组件直接读取 `mq135_digital_level`0/1
如需模拟量采集,需要单独引入 AO 接线和 ADC 逻辑(当前版本未启用)。
### 4. 两路继电器
- 风扇继电器 IN -> GPIO6高电平有效
- 灯光继电器 IN -> GPIO7高电平有效
## 软件实现概览
### 1. 统一数据结构
定义在 `agri_env.h`
- `temperature_c`
- `humidity_percent`
- `illuminance_lux`
- `mq135_digital_level`
- `timestamp_ms`
### 2. 传感器读取接口
- `agri_env_init()`:初始化 I2C、BH1750、MQ135、继电器
- `agri_env_read_sensors(agri_env_data_t *out_data)`:一次读取并刷新缓存
- `agri_env_get_latest_data(agri_env_data_t *out_data)`:读取最近缓存
### 3. 继电器控制接口
- `agri_env_set_fan_relay(bool on)`
- `agri_env_set_light_relay(bool on)`
### 4. MQTT 接口MQTT 3.1 + 用户名密码)
- `agri_env_mqtt_start()`
- `agri_env_mqtt_stop()`
- `agri_env_mqtt_is_connected()`
- `agri_env_mqtt_publish_latest(const char *topic, int qos, int retain)`
组件会在 MQTT 连接成功后自动订阅 `CONFIG_AGRI_ENV_MQTT_SUBSCRIBE_TOPIC`
默认订阅主题与发布主题来自 menuconfig
- `AGRI_ENV_MQTT_SUBSCRIBE_TOPIC`
- `AGRI_ENV_MQTT_PUBLISH_TOPIC`
订阅到的 JSON 命令支持如下字段:
- `fan_relay`: `true` / `false`
- `light_relay`: `true` / `false`
### 5. cJSON 数据打包
- `char *agri_env_build_data_json(const agri_env_data_t *data)`
说明:返回值是动态分配字符串,使用完后需要 `free()`
## menuconfig 配置方法
`idf.py menuconfig` 中打开 `AgriEnv Monitor` 菜单,配置以下项:
- `AGRI_ENV_SAMPLE_PERIOD_MS`:采样周期
- `AGRI_ENV_MQTT_BROKER_URI`MQTT 服务器地址
- `AGRI_ENV_MQTT_USERNAME`MQTT 用户名
- `AGRI_ENV_MQTT_PASSWORD`MQTT 密码
- `AGRI_ENV_MQTT_CLIENT_ID`:客户端 ID
- `AGRI_ENV_MQTT_PUBLISH_TOPIC`:发布主题
- `AGRI_ENV_MQTT_SUBSCRIBE_TOPIC`:订阅主题
示例:
```text
AGRI_ENV_SAMPLE_PERIOD_MS=5000
AGRI_ENV_MQTT_BROKER_URI=mqtt://192.168.1.100:1883
AGRI_ENV_MQTT_USERNAME=your_user
AGRI_ENV_MQTT_PASSWORD=your_pass
AGRI_ENV_MQTT_CLIENT_ID=agri-env-monitor
AGRI_ENV_MQTT_PUBLISH_TOPIC=agri/env/data
AGRI_ENV_MQTT_SUBSCRIBE_TOPIC=agri/env/cmd
```
协议版本固定为 `MQTT_PROTOCOL_V_3_1`
## 在 main 中的使用示例
当前 `main/main.c` 已包含如下流程:
1. 初始化 Wi-Fi 配网:`wifi_connect_init()`
2. 初始化农业环境组件:`agri_env_init()`
3. 组件内部周期任务自动读取传感器数据并打印
4. 若 MQTT 参数已填写,则自动连接并按主题上报
你也可以继续在业务层调用 `agri_env_read_sensors()``agri_env_mqtt_publish_latest()` 做自定义上报。
## 构建与烧录步骤(详细)
### 1. 进入工程
```bash
cd /home/beihong/esp_projects/AgriEnv_Monitor
```
### 2. 配置目标芯片(如果尚未设置)
```bash
idf.py set-target esp32c3
```
### 3. menuconfig可选
```bash
idf.py menuconfig
```
按需配置串口、日志等级、Wi-Fi 配网组件参数。
### 4. 编译
```bash
idf.py build
```
### 5. 烧录
```bash
idf.py -p /dev/ttyUSB0 flash
```
### 6. 查看日志
```bash
idf.py -p /dev/ttyUSB0 monitor
```
## 常见问题
### 1. DHT11 读取失败
- 检查 DATA 是否正确接 GPIO10
- 确保上拉电阻存在
- 线长过长时需降低干扰
### 2. BH1750 无数据
- 确认地址是 0x23
- 检查 SDA/SCL 是否与 GPIO4/GPIO5 对应
- 检查模块供电是否 3.3V
### 3. MQ135 只有数字量
- 当前版本设计即为数字量模式,只输出 `mq135_digital_level`
- 若 DO 一直不变,检查 MQ135 模块阈值电位器和 DO 接线
### 4. MQTT 无法连接
- 确认 `MQTT_BROKER_URI`/用户名/密码已填写
- 确认设备已联网
- 检查 broker 是否允许 MQTT 3.1
## 后续建议
1. 增加 FreeRTOS 周期任务,定时调用 `agri_env_read_sensors()``agri_env_mqtt_publish_latest()`
2. 将 MQTT 参数改为 Kconfig 配置,避免每次改源码。
3. 对 MQ135 增加校准模型(洁净空气基线和 ppm 拟合)。