1. 项目概述
作为一名深耕嵌入式领域多年的工程师,我最近完成了一个基于STM32+ESP32双核心架构的物联网农业大棚监测控制系统。这个项目完美融合了嵌入式硬件开发、传感器技术、物联网通信和自动控制算法,是智慧农业领域的典型应用场景。
1.1 项目背景与意义
在现代农业生产中,大棚种植已经成为提高作物产量和质量的重要手段。然而传统的大棚管理方式存在诸多痛点:
- 环境监测不及时:依赖人工定时巡检,无法实时掌握环境参数变化
- 控制精度低:凭经验手动调节,难以维持最佳生长环境
- 人力成本高:需要专人值守,增加运营成本
- 异常响应慢:发现问题时往往已经造成损失
本项目通过物联网技术实现:
- 24小时不间断环境监测
- 智能闭环自动调控
- 远程可视化管理
- 多级异常报警
1.2 系统架构设计
系统采用双核心分离架构,充分发挥STM32和ESP32各自的优势:
-
STM32F103C8T6:作为主控芯片,负责:
- 传感器数据采集
- 本地闭环控制
- 人机交互
- 数据存储
-
ESP32-WROOM-32:作为通信协处理器,负责:
- WiFi连接
- MQTT协议通信
- 阿里云平台对接
- 远程指令转发
这种架构的优势在于:
- 控制与通信解耦,提高系统稳定性
- 即使网络中断,本地控制仍可正常运行
- 开发调试更方便,可独立优化
2. 硬件设计与实现
2.1 核心硬件选型
2.1.1 主控制器选型
经过对比多种方案,最终选择STM32F103C8T6作为主控芯片,主要考虑:
-
资源匹配:
- 72MHz主频,64KB Flash,20KB RAM
- 3个ADC,2个SPI,2个I2C,3个USART
- 完全满足多传感器采集需求
-
开发便利:
- 丰富的开发资料和社区支持
- 完善的HAL库和标准外设库
- 与现有开发工具链兼容
-
成本优势:
- 价格约15元
- 外围电路简单
2.1.2 通信模块选型
ESP32-WROOM-32相比其他方案的优势:
| 对比项 | ESP32-WROOM-32 | ESP8266 | GSM模组 |
|---|---|---|---|
| 成本 | 22元 | 15元 | 80元+ |
| 功耗 | 低 | 低 | 高 |
| 速率 | 快 | 一般 | 慢 |
| 开发 | 简单 | 简单 | 复杂 |
| 扩展性 | 强 | 一般 | 弱 |
2.2 传感器选型清单
根据大棚环境监测需求,选择了以下传感器:
| 传感器类型 | 型号 | 接口 | 测量范围 | 精度 |
|---|---|---|---|---|
| 温湿度 | SHT30 | I2C | 温度:-40~125℃ 湿度:0~100%RH |
±0.3℃ ±2%RH |
| 光照 | BH1750 | I2C | 0-65535 lux | ±20% |
| CO2 | MH-Z19C | UART | 0-5000ppm | ±50ppm |
| 土壤湿度 | 电容式 | ADC | 0-100% | ±5% |
| 土壤PH | PH电极 | ADC | 0-14PH | ±0.5PH |
实际使用中发现,土壤传感器需要特别注意防水和防腐蚀处理,否则容易损坏。
2.3 硬件接线指南
2.3.1 接线原则
-
电源分离:
- 数字电路:3.3V供电
- 模拟电路:5V供电
- 强电部分:完全隔离
-
地线处理:
- 数字地和模拟地单点连接
- 强电地单独处理
-
信号隔离:
- SPI、I2C总线加适当上拉
- 模拟信号线使用屏蔽线
2.3.2 典型接线示例
以SHT30温湿度传感器为例:
code复制STM32F103C8T6 SHT30
3.3V -> VCC
GND -> GND
PB6 -> SCL
PB7 -> SDA
注意:I2C总线需要接4.7K上拉电阻,虽然有些模块已经内置,但建议外部再加一组。
3. 软件设计与实现
3.1 系统软件架构
采用模块化设计,主要分为以下几个模块:
- 传感器驱动层:封装各传感器的读写接口
- 控制算法层:实现闭环控制逻辑
- 通信协议层:处理STM32与ESP32的通信
- 人机交互层:管理显示屏和按键
- 数据存储层:实现SD卡数据记录
3.2 关键代码实现
3.2.1 传感器数据采集
以SHT30为例的驱动代码:
c复制#define SHT30_ADDR 0x44
uint8_t SHT30_Read_Data(float *temp, float *humi)
{
uint8_t buf[6];
uint8_t cmd[2] = {0x2C, 0x06}; // 高精度测量命令
// 发送测量命令
if(HAL_I2C_Master_Transmit(&hi2c1, SHT30_ADDR, cmd, 2, 100) != HAL_OK)
return 0;
HAL_Delay(20); // 等待测量完成
// 读取数据
if(HAL_I2C_Master_Receive(&hi2c1, SHT30_ADDR, buf, 6, 100) != HAL_OK)
return 0;
// 数据转换
uint16_t temp_raw = (buf[0] << 8) | buf[1];
uint16_t humi_raw = (buf[3] << 8) | buf[4];
*temp = -45 + 175 * (float)temp_raw / 65535;
*humi = 100 * (float)humi_raw / 65535;
return 1;
}
3.2.2 闭环控制算法
采用简单的阈值控制:
c复制void Control_Logic(void)
{
// 温度控制
if(env_data.temperature > temp_setpoint + temp_hysteresis)
Relay_Control(HEATER_RELAY, OFF);
else if(env_data.temperature < temp_setpoint - temp_hysteresis)
Relay_Control(HEATER_RELAY, ON);
// 湿度控制
if(env_data.humidity > humi_setpoint + humi_hysteresis)
Relay_Control(FAN_RELAY, ON);
else if(env_data.humidity < humi_setpoint - humi_hysteresis)
Relay_Control(FAN_RELAY, OFF);
// 其他参数控制类似
}
实际项目中可以根据需要实现更复杂的PID控制算法。
4. 物联网通信实现
4.1 通信协议设计
STM32与ESP32之间采用自定义串口协议:
code复制帧格式:
[0xAA][0x55][CMD][LEN][DATA...][CHECKSUM][0x0D][0x0A]
协议特点:
- 固定帧头和帧尾
- 包含长度和校验字段
- 支持多种命令类型
4.2 阿里云平台对接
ESP32端实现MQTT通信的关键步骤:
-
设备认证:
- 使用三元组(ProductKey、DeviceName、DeviceSecret)
- 生成MQTT连接参数
-
主题订阅:
- 上行主题:/sys/{pk}/{dn}/thing/event/property/post
- 下行主题:/sys/{pk}/{dn}/thing/service/property/set
-
数据格式:
- 采用JSON格式
- 包含时间戳和设备ID
示例代码:
cpp复制void MQTT_Upload_Data(float temp, float humi)
{
DynamicJsonDocument doc(256);
doc["id"] = millis();
doc["version"] = "1.0";
doc["method"] = "thing.event.property.post";
JsonObject params = doc.createNestedObject("params");
params["temperature"] = temp;
params["humidity"] = humi;
char json_buf[256];
serializeJson(doc, json_buf);
client.publish(TOPIC_POST, json_buf);
}
5. 系统调试与优化
5.1 常见问题排查
在项目开发过程中遇到的典型问题及解决方案:
-
传感器数据异常:
- 现象:温湿度数据偶尔跳变
- 原因:I2C总线受干扰
- 解决:缩短总线长度,增加上拉电阻
-
WiFi频繁断开:
- 现象:ESP32经常掉线
- 原因:电源不稳定
- 解决:增加1000μF电容滤波
-
继电器误动作:
- 现象:继电器偶尔自动开关
- 原因:控制线受干扰
- 解决:增加光耦隔离
5.2 性能优化建议
-
低功耗优化:
- 采用间歇工作模式
- 合理设置采样间隔
- 使用睡眠模式
-
通信可靠性:
- 增加重传机制
- 实现离线缓存
- 优化心跳间隔
-
控制算法改进:
- 引入PID控制
- 增加预测控制
- 实现模糊控制
6. 项目扩展方向
这个基础框架可以进一步扩展:
-
增加更多传感器:
- 土壤EC值
- 光照光谱
- 二氧化碳浓度
-
支持更多通信方式:
- 4G/NB-IoT
- LoRa远距离传输
- 蓝牙近场控制
-
增强智能功能:
- 作物生长模型
- 病虫害预警
- 产量预测
这个项目从硬件选型到软件开发,从本地控制到云端对接,完整实现了一个物联网农业应用的全流程。在实际部署中,还需要考虑防水防尘、电源管理、远程升级等工程化问题。