Files
agri_env/README.md

212 lines
5.1 KiB
Markdown
Raw 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
本项目基于 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 + 用户名密码)
7. MQTT 订阅主题与发布主题
8. 定时任务采样、打印和上报
9. cJSON 数据包构建用于上报
## 目录说明
新增组件位于:
- `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 拟合)。