这个项目是我去年为某农业大棚环境监控系统设计的核心模块。当时农户们最头疼的就是半夜突然降温或湿度异常导致作物受损,传统的人工巡检方式根本来不及反应。于是我设计了一套能同时监测8个区域温湿度、并通过WiFi实时报警的系统,成本控制在200元以内,实测响应速度比市面同类产品快3秒以上。
系统核心由STM32F103C8T6单片机驱动,搭配DHT22传感器和ESP8266模块,实现了每10秒采集一次数据、异常值即时推送微信的功能。特别值得一提的是,我在报警逻辑中加入了"持续时间阈值"判断,有效避免了短暂环境波动造成的误报,这个设计后来被当地三家农场直接采用。
选择STM32F103C8T6作为主控是经过实际对比测试的:
传感器选用DHT22而非DHT11的原因:
多路传感器供电方案:
c复制// 使用ULN2003达林顿阵列控制传感器电源
void Sensor_Power_Control(uint8_t ch){
HAL_GPIO_WritePin(GPIOC, 1<<ch, ch ? GPIO_PIN_RESET : GPIO_PIN_SET);
HAL_Delay(50); // 电源稳定延时
}
这个设计让系统待机功耗从35mA降到8mA,特别适合电池供电场景。
信号抗干扰处理:
采用分时复用采集方案:
关键代码片段:
c复制// 定时器中断处理函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim){
static uint32_t last_fall = 0;
uint32_t curr = HAL_GetTick();
if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1){
pulse_width = curr - last_fall;
last_fall = curr;
}
}
三级报警机制:
阈值计算算法:
python复制# 动态阈值示例(基于历史数据)
def dynamic_threshold(current, history):
avg = sum(history[-24:])/24 # 取最近24次平均值
std_dev = np.std(history[-24:])
return avg ± 3*std_dev # 3σ原则
使用AT固件需要特别注意:
我修改的MQTT连接流程:
采用二进制协议代替JSON:
c复制#pragma pack(1)
typedef struct {
uint8_t header; // 0xAA
uint16_t temp; // 实际值×100
uint16_t humidity; // 实际值×100
uint8_t channel; // 通道号
uint8_t checksum; // 累加和校验
} SensorData;
这样使每个数据包从原来的32字节缩减到7字节,特别适合移动网络环境。
传感器布置的黄金法则:
我们在大棚实测发现:
数据漂移问题:
WiFi频繁断开:
误报处理:
c复制#define FILTER_COEF 0.2f
float filtered_value = FILTER_COEF*new_value + (1-FILTER_COEF)*old_value;
当前系统在持续运行三个月后,我总结了这些改进点:
电源管理升级:
数据分析增强:
这个项目最让我自豪的是,部署半年后帮助农户避免了三次霜冻灾害,单次挽回损失就超过系统成本的20倍。现在回想起来,当时在信号抗干扰和低功耗上的坚持非常值得。