1. 项目背景与核心功能
在现代化农业生产中,环境参数的精准监测与控制直接影响作物生长品质和产量。传统大棚管理依赖人工巡检,存在响应滞后、劳动强度大等问题。这个基于STM32F103C8T6的智能监控系统,通过实时采集温湿度、土壤墒情等关键参数,结合阈值自动控制执行设备,实现了农业大棚的智能化管理。
核心功能模块包括:
- 环境参数采集:DHT11数字温湿度传感器+模拟量土壤湿度传感器
- 人机交互界面:0.96寸OLED显示屏实时显示数据
- 执行机构控制:继电器驱动排风扇/加湿器/水泵
- 智能决策逻辑:阈值判断与自动控制
硬件选型考量:STM32F103C8T6作为经典Cortex-M3内核MCU,具有72MHz主频、64KB Flash和20KB RAM,完全满足传感器数据处理和逻辑控制需求,且性价比极高。相比Arduino方案,STM32提供更精确的定时器控制和ADC采样精度。
2. 硬件系统设计详解
2.1 关键器件选型与电路设计
传感器模块
- DHT11:单总线数字输出,测量范围20-90%RH/0-50℃,精度±5%RH/±2℃
- 土壤湿度传感器:模拟量输出(0-3V),通过电压分压电路接入STM32 ADC
- 继电器模块:采用光耦隔离的5V四路继电器,控制端与MCU完全电气隔离
电源设计
- 主控供电:USB或5V直流电源输入,经AMS1117-3.3稳压芯片供给MCU
- 传感器供电:DHT11和土壤传感器使用5V,OLED屏使用3.3V(防止烧毁)
- 执行机构供电:继电器模块5V驱动,被控设备(水泵等)使用独立12V电源
2.2 PCB布局与接线规范
实际搭建时建议注意:
- 模拟与数字电路分区布局,ADC输入线远离高频信号线
- DHT11数据线需加10K上拉电阻,线长不超过20cm
- 继电器控制线与被控设备强电线路保持3cm以上间距
- 土壤传感器探头需做防水处理,避免长期浸泡导致氧化
常见坑点:曾有用户在面包板搭建时,将继电器控制线与传感器信号线并行走线,导致ADC采样值异常波动。后改用双绞线分开布线后问题解决。
3. 软件开发关键实现
3.1 STM32CubeMX配置要点
时钟树配置:
c复制HSE = 8MHz → PLLMUL x9 → SYSCLK 72MHz
AHB Prescaler = 1 → HCLK 72MHz
APB1 Prescaler = 2 → PCLK1 36MHz
APB2 Prescaler = 1 → PCLK2 72MHz
ADC参数优化:
- 采样时间:239.5周期(对应17.1μs@14MHz ADC时钟)
- 连续转换模式+软件触发
- 右对齐数据格式(直接读取16位DR寄存器)
3.2 传感器驱动开发
DHT11通信协议实现
单总线时序要求严格,需精确控制微秒级延时:
c复制// 主机启动信号
拉低18ms → 拉高20-40μs → 切换输入模式
// 从机响应
等待80μs低电平 → 等待80μs高电平
// 数据位判定
50μs低电平后,检测26-28μs高电平为"0",70μs为"1"
实测发现,使用SysTick实现的延时函数在72MHz主频下误差约±3μs,需加入校准补偿:
c复制void DHT11_Delay_us(uint32_t us)
{
uint32_t ticks = us * (SystemCoreClock / 1000000) / 8;
while(ticks--) __NOP();
}
土壤湿度ADC采样
采用中值滤波算法提升稳定性:
c复制#define FILTER_SIZE 5
uint16_t ADC_MedianFilter(uint32_t channel)
{
uint16_t raw[FILTER_SIZE];
for(uint8_t i=0; i<FILTER_SIZE; i++){
raw[i] = ADC1_Read_Channel(channel);
HAL_Delay(2);
}
// 排序取中值
qsort(raw, FILTER_SIZE, sizeof(uint16_t), compare);
return raw[FILTER_SIZE/2];
}
3.3 控制逻辑优化
引入迟滞比较防止继电器频繁动作:
c复制// 温度控制逻辑优化
if(temp > TEMP_THRESHOLD + 2) Relay1_Control(1); // 开启
else if(temp < TEMP_THRESHOLD - 2) Relay1_Control(0); // 关闭
// 土壤湿度分级控制
if(soil_humi < 10) Relay3_Control(1); // 严重缺水
else if(soil_humi < SOIL_THRESHOLD) Relay3_Control(1); // 一般缺水
else Relay3_Control(0);
4. 系统调试与性能优化
4.1 功耗测试数据
| 运行状态 | 电流消耗 | 优化措施 |
|---|---|---|
| 全速运行(所有外设工作) | 45mA | 无 |
| 关闭OLED背光 | 32mA | 调整屏显刷新率 |
| ADC间歇采样(500ms周期) | 28mA | 采用单次转换模式 |
| 睡眠模式(仅定时唤醒) | 5mA | 启用STOP模式 |
4.2 传感器校准方法
DHT11校准步骤:
- 将传感器与标准温湿度计置于同一密闭环境
- 记录10组数据,计算偏移量
- 在代码中添加补偿系数:
c复制temp = buf[2] * 0.8 + 1.2; // 实测补偿公式
humi = buf[0] * 0.9 + 3.5;
土壤传感器标定:
- 完全干燥状态:记录ADC值(如4095)
- 完全浸水状态:记录ADC值(如1200)
- 线性映射公式:
c复制humidity = (4095 - adc_val) / (4095 - 1200) * 100;
5. 扩展功能实现方案
5.1 无线数据传输(ESP8266)
硬件连接:
- ESP8266 TX → STM32 PA3 (USART2_RX)
- ESP8266 RX → STM32 PA2 (USART2_TX)
- 共地连接
AT指令交互示例:
c复制void WIFI_SendData(float temp, float humi)
{
char cmd[128];
sprintf(cmd,"AT+CIPSTART=\"TCP\",\"api.thingspeak.com\",80\r\n");
HAL_UART_Transmit(&huart2, (uint8_t*)cmd, strlen(cmd), 1000);
sprintf(cmd,"GET /update?api_key=XXX&field1=%.1f&field2=%.1f\r\n",temp,humi);
HAL_UART_Transmit(&huart2, (uint8_t*)cmd, strlen(cmd), 1000);
}
5.2 本地数据存储(SPI Flash)
使用W25Q128芯片存储历史数据:
c复制// 初始化SPI接口
void SPI_Flash_Init(void)
{
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hsp1.Init.CLKPolarity = SPI_POLARITY_LOW;
hsp1.Init.CLKPhase = SPI_PHASE_1EDGE;
hsp1.Init.NSS = SPI_NSS_SOFT;
HAL_SPI_Init(&hsp1);
}
// 写入环境数据
void Save_EnvData(uint8_t temp, uint8_t humi)
{
uint8_t buf[2] = {temp, humi};
SPI_Flash_Write(0x001000, buf, 2); // 写入1MB地址位置
}
6. 工程实践建议
-
抗干扰设计:
- 所有数字信号线串联100Ω电阻抑制振铃
- ADC输入引脚添加0.1μF去耦电容
- 继电器线圈并联续流二极管
-
代码健壮性提升:
c复制// 增加传感器状态检测
uint8_t DHT11_Read_Data(uint8_t *temp, uint8_t *humi)
{
uint32_t timeout = 1000; // 超时计数器
while(检测响应信号 && timeout--) {
if(timeout == 0) return 3; // 超时错误
}
...
}
// 看门狗配置
IWDG_HandleTypeDef hiwdg;
void IWDG_Init(void)
{
hiwdg.Instance = IWDG;
hiwdg.Init.Prescaler = IWDG_PRESCALER_32; // 32分频
hiwdg.Init.Reload = 0xFFF; // 约1.6s超时
HAL_IWDG_Init(&hiwdg);
}
- 生产测试方案:
- 开发PC端测试工具(Python+PyQT)
- 通过USB转串口发送模拟传感器数据
- 自动验证继电器动作响应
- 生成测试报告(HTML格式)
实际部署中发现,在高温高湿环境下DHT11容易出现数据漂移。后来改用防水型号的SHT30传感器,虽然成本增加但稳定性显著提升。这也提醒我们,在农业应用中器件选型要特别关注环境适应性。