STM32+ESP8266搭建粮仓环境监测系统:从传感器选型到APP报警全流程

张开发
2026/4/6 3:29:43 15 分钟阅读

分享文章

STM32+ESP8266搭建粮仓环境监测系统:从传感器选型到APP报警全流程
STM32ESP8266搭建粮仓环境监测系统从传感器选型到APP报警全流程粮仓环境监测一直是农业科技领域的痛点问题。传统人工巡检方式不仅效率低下还难以实现24小时不间断监控。去年夏天我在帮朋友改造老家粮仓时就遇到过因温湿度失控导致粮食发霉的情况。那次经历让我下定决心开发一套低成本、高可靠的自动化监测方案。经过三个月的反复调试最终采用STM32F103C8T6作为主控搭配ESP8266无线模块的方案成功实现了温湿度、烟雾、红外监测的全套系统。整套设备成本控制在200元以内报警响应时间小于3秒特别适合中小型粮仓使用。下面就把这套经过实战检验的方案完整分享给大家。1. 硬件选型与电路设计1.1 核心控制器选择主控芯片的选择需要考虑I/O数量、通信接口和成本三个关键因素STM32F103C8T6蓝色pill开发板72MHz主频20KB SRAM64KB Flash3个USART接口ESP8266通信调试备用16路12位ADC满足多传感器接入市场价格15-25元提示避免使用STM32F030系列其ADC精度和USART数量可能不足1.2 传感器选型对比我们测试了市面上6款常见传感器最终筛选结果如下表传感器类型型号测量范围精度接口方式单价温湿度DHT22-40~80℃,0~100%±0.5℃单总线25元烟雾MQ-2300-10000ppm±10%模拟电压8元红外HC-SR5013-7米-数字信号6元火焰火焰传感器模块0.8-1.0μm-数字信号5元实际部署中发现DHT22在高温高湿环境下容易出现数据漂移。解决方案是在代码中加入中值滤波算法// 温湿度数据滤波处理 float filter_DHT22(float new_val) { static float buffer[5] {0}; static uint8_t index 0; buffer[index] new_val; if(index 5) index 0; // 冒泡排序 for(int i0; i4; i) { for(int ji1; j5; j) { if(buffer[i] buffer[j]) { float temp buffer[i]; buffer[i] buffer[j]; buffer[j] temp; } } } return buffer[2]; // 返回中值 }1.3 电源方案设计粮仓通常分布在偏远地区电网稳定性较差。我们采用双电源供电方案主电源220V转5V开关电源模块带过压保护备用电源18650锂电池组2节并联配备TP4056充电管理模块低电压自动切换电路实测表明这套系统在断电情况下可持续工作48小时以上。关键电路连接如下[220V AC] → [开关电源] → [二极管1] → [系统] ↘ [充电模块] → [锂电池] → [二极管2] → [系统]2. STM32与ESP8266通信实现2.1 硬件连接配置ESP8266-01模块与STM32的连接需要特别注意电平转换ESP8266 STM32 VCC → 3.3V GND → GND TX → PA3(USART2_RX) RX → PA2(USART2_TX) via 1K电阻 CH_PD → 3.3V GPIO0 → 3.3V(工作模式)注意ESP8266的RX引脚必须串联1K电阻否则可能因电平不匹配导致通信失败2.2 通信协议设计为提高通信可靠性我们自定义了轻量级协议数据帧格式[HEAD][LEN][CMD][DATA][CRC][TAIL] 0xAA 1字节 1字节 N字节 2字节 0x55关键命令字定义0x01传感器数据上传0x02报警触发0x03设备状态查询STM32端数据打包示例代码void send_sensor_data(float temp, float humi, uint16_t smoke) { uint8_t buf[20]; buf[0] 0xAA; // HEAD buf[1] 11; // LEN buf[2] 0x01; // CMD // 温度(2字节) int16_t temp_int (int16_t)(temp*10); buf[3] temp_int 8; buf[4] temp_int 0xFF; // 湿度(2字节) int16_t humi_int (int16_t)(humi*10); buf[5] humi_int 8; buf[6] humi_int 0xFF; // 烟雾(2字节) buf[7] smoke 8; buf[8] smoke 0xFF; // CRC计算 uint16_t crc calc_crc(buf, 9); buf[9] crc 8; buf[10] crc 0xFF; buf[11] 0x55; // TAIL HAL_UART_Transmit(huart2, buf, 12, 100); }2.3 异常处理机制在实际部署中我们发现三个常见问题及解决方案数据丢包增加重传机制3次尝试设置500ms应答超时模块死机硬件看门狗定时器软件心跳包检测每30秒一次WiFi断连// ESP8266自动重连代码 void wifi_reconnect(void) { uint8_t retry 0; while(retry 3) { send_at_command(ATCWJAP\SSID\,\PASSWORD\, 1000); if(check_wifi_connected()) break; HAL_Delay(5000); } if(retry 3) hardware_reset(); }3. Android报警APP开发要点3.1 数据接收与解析采用MQTT协议实现实时数据推送关键实现步骤添加依赖implementation org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5 implementation org.eclipse.paho:org.eclipse.paho.android.service:1.1.1数据解析示例private void handleMessage(String topic, MqttMessage message) { byte[] payload message.getPayload(); if(payload[0] (byte)0xAA payload[payload.length-1] (byte)0x55) { // 校验CRC if(checkCRC(payload)) { int cmd payload[2] 0xFF; switch(cmd) { case 0x01: // 传感器数据 float temp ((payload[3]8)|(payload[4]0xFF))/10.0f; float humi ((payload[5]8)|(payload[6]0xFF))/10.0f; int smoke (payload[7]8)|(payload[8]0xFF); updateUI(temp, humi, smoke); break; case 0x02: // 报警 triggerAlarm(payload[3]); break; } } } }3.2 多级报警策略设计根据粮仓实际需求我们设计了三级报警机制初级预警黄色提示温度超过30℃湿度超过70%烟雾值500中级报警橙色弹窗声音温度持续2分钟35℃烟雾值800紧急报警红色全屏短信通知检测到明火烟雾值1500红外检测到移动物体报警逻辑流程图[数据接收] → [阈值判断] → [级别判定] → [本地存储] → [UI反馈] → [通知发送] ↘ [云端记录]3.3 历史数据可视化使用MPAndroidChart库实现趋势图展示// 温度曲线初始化 LineChart tempChart findViewById(R.id.temp_chart); tempChart.getDescription().setEnabled(false); tempChart.setTouchEnabled(true); tempChart.setDragEnabled(true); tempChart.setScaleEnabled(true); // 数据填充 ArrayListEntry values new ArrayList(); for(int i0; ihistoryList.size(); i) { values.add(new Entry(i, historyList.get(i).temperature)); } LineDataSet set new LineDataSet(values, 温度变化); set.setColor(Color.RED); set.setLineWidth(2f); set.setDrawCircles(false); LineData data new LineData(set); tempChart.setData(data); tempChart.invalidate();4. 系统部署与优化建议4.1 现场安装注意事项经过5个粮仓的实际部署总结出以下经验传感器布局每100平方米布置1个监测点距地面1.5-2米高度避开通风口和阳光直射位置防干扰措施为STM32加装金属屏蔽罩信号线使用双绞线电源输入端增加磁环环境适应性改造电路板喷涂三防漆传感器加装防尘罩使用防水接线盒4.2 功耗优化技巧通过以下措施可将待机功耗从85mA降至12mA传感器轮询策略void sensor_polling(void) { static uint8_t counter 0; switch(counter % 4) { case 0: read_dht22(); break; case 1: read_mq2(); break; case 2: read_ir(); break; case 3: read_flame(); break; } if(counter 4) counter 0; }低功耗模式配置STM32进入Stop模式RTC唤醒ESP8266深度睡眠外围电路电源MOS管控制自适应采样间隔正常情况30秒/次数据异常5秒/次夜间模式5分钟/次4.3 常见故障排查以下是我们在维护过程中总结的故障排查表故障现象可能原因解决方法数据上传不稳定WiFi信号弱调整天线位置或增加中继温湿度读数异常传感器结露加装透气防尘罩系统频繁重启电源干扰增加大容量滤波电容APP收不到报警MQTT主题配置错误检查topic订阅和发布是否匹配电池续航时间短深度睡眠未生效检查GPIO唤醒配置5. 扩展功能与升级方向5.1 云端数据备份基于阿里云物联网平台的实现方案设备端配置// 物模型数据上报 void upload_to_aliyun(void) { char payload[256]; sprintf(payload, {\params\:{\temp\:%.1f,\humi\:%.1f,\smoke\:%d}}, current_temp, current_humi, current_smoke); char topic[64]; sprintf(topic, /sys/%s/%s/thing/event/property/post, PRODUCT_KEY, DEVICE_NAME); mqtt_publish(topic, payload); }云端规则引擎配置数据流转到TSDB时序数据库异常数据触发函数计算重要报警存入表格存储5.2 多粮仓集中监控开发管理后台的关键技术栈前端Vue.js Element UI后端Spring Boot MyBatis数据库MySQL Redis实时通信WebSocket系统架构图[边缘设备] → [MQTT Broker] → [业务服务器] → [Web前端] ↘ [手机APP]5.3 AI异常预测基于TensorFlow Lite的端侧推理实现模型训练使用历史数据训练LSTM网络输出未来1小时温湿度变化趋势模型量化压缩至50KB以内端侧部署// 在STM32上运行推理 void predict_with_tflite(float* input, float* output) { static uint8_t model_buffer[MODEL_SIZE]; static TfLiteTensor* input_tensor; static TfLiteTensor* output_tensor; // 初始化模型 static bool initialized false; if(!initialized) { load_model_from_flash(model_buffer); setup_interpreter(model_buffer); initialized true; } // 填充输入数据 for(int i0; iINPUT_SIZE; i) { input_tensor-data.f[i] input[i]; } // 执行推理 invoke_interpreter(); // 获取结果 for(int i0; iOUTPUT_SIZE; i) { output[i] output_tensor-data.f[i]; } }这套系统在山西某粮库运行8个月以来成功预警3次潜在火灾风险将粮食损耗率降低了67%。最让我意外的是红外传感器还捕捉到了多次老鼠活动帮助仓库改进了防鼠措施。

更多文章