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`,明确硬件接线说明及系统功能列表。
AgriEnv_Monitor
MQTT 协议文档
MQTT 上报与双继电器控制格式请参考:README_MQTT.md
本项目基于 ESP-IDF,新增了一个统一环境采集与控制组件 agri_env,实现以下功能:
- DHT11 温湿度采集(DATA -> GPIO10)
- BH1750 光照采集(I2C 地址 0x23,SDA -> GPIO4,SCL -> GPIO5)
- MQ135 数据采集(AO -> GPIO1)
- 双路继电器控制
- 统一数据结构与获取接口
- MQTT 连接(MQTT 3.1.1,自动获取 UID/MAC/时间)
- MQTT 集成控制指令及即时回执(ACK)
- 高频环境上报(1 秒一次,2 位精度)
- cJSON 数据包序列化与上报
协议文档
详细的 MQTT 报文格式及指令说明请参考:README_MQTT.md
目录说明
新增组件位于:
components/agri_env/include/agri_env.hcomponents/agri_env/agri_env.ccomponents/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
- 地址:0x23(ADDR 引脚悬空或接地)
3. MQ135
- DO(数字输出)-> GPIO10
注意:当前工程使用 MQ135 的 DO 数字输出,不做 ADC 采样。
- 组件直接读取
mq135_digital_level(0/1)
如需模拟量采集,需要单独引入 AO 接线和 ADC 逻辑(当前版本未启用)。
4. 两路继电器
- 风扇继电器 IN -> GPIO6(高电平有效)
- 灯光继电器 IN -> GPIO7(高电平有效)
软件实现概览
1. 统一数据结构
定义在 agri_env.h:
temperature_chumidity_percentilluminance_luxmq135_digital_leveltimestamp_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_TOPICAGRI_ENV_MQTT_PUBLISH_TOPIC
订阅到的 JSON 命令支持如下字段:
fan_relay:true/falselight_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:客户端 IDAGRI_ENV_MQTT_PUBLISH_TOPIC:发布主题AGRI_ENV_MQTT_SUBSCRIBE_TOPIC:订阅主题
示例:
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 已包含如下流程:
- 初始化 Wi-Fi 配网:
wifi_connect_init() - 初始化农业环境组件:
agri_env_init() - 组件内部周期任务自动读取传感器数据并打印
- 若 MQTT 参数已填写,则自动连接并按主题上报
你也可以继续在业务层调用 agri_env_read_sensors() 和 agri_env_mqtt_publish_latest() 做自定义上报。
构建与烧录步骤(详细)
1. 进入工程
cd /home/beihong/esp_projects/AgriEnv_Monitor
2. 配置目标芯片(如果尚未设置)
idf.py set-target esp32c3
3. menuconfig(可选)
idf.py menuconfig
按需配置串口、日志等级、Wi-Fi 配网组件参数。
4. 编译
idf.py build
5. 烧录
idf.py -p /dev/ttyUSB0 flash
6. 查看日志
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
后续建议
- 增加 FreeRTOS 周期任务,定时调用
agri_env_read_sensors()与agri_env_mqtt_publish_latest()。 - 将 MQTT 参数改为 Kconfig 配置,避免每次改源码。
- 对 MQ135 增加校准模型(洁净空气基线和 ppm 拟合)。
Description
Languages
C
98.3%
CMake
1.4%
Dockerfile
0.3%