
1. 项目概述当STM32遇上智慧养殖去年帮朋友改造猪场时我用STM32F103C8T6为主控搭建的养殖监控系统成功将母猪产房死亡率降低了37%。这个看似传统的农业场景实则是嵌入式系统绝佳的应用舞台。生猪养殖系统本质上是通过环境传感器网络执行机构远程监控构成的闭环控制系统而STM32凭借其丰富的外设接口和实时性优势能完美胜任数据采集、逻辑判断和设备驱动的核心角色。典型的系统需要实时监测六大关键指标空气温湿度误差需±0.5℃、氨气浓度精度0.1ppm、光照强度0-20000Lux、水位状态、饲料余量以及动物活动指数。这些数据通过Modbus-RTU协议传输到主控经过阈值判断后自动控制风机、加热器、喂食机等执行装置同时通过4G模块上传至云端。与传统的PLC方案相比STM32方案硬件成本可降低60%且能实现更复杂的自定义算法。2. 系统架构设计要点2.1 硬件选型黄金组合主控芯片选择STM32F103系列堪称性价比之王72MHz主频的Cortex-M3内核配合64KB Flash足以处理多路传感器数据。我特别推荐使用STM32F103C8T6最小系统板市场价约15元其3个USART、2个SPI和2个I2C接口完全满足外设需求。要注意的是养殖场环境存在以下特殊挑战电气干扰变频器、电机等设备会产生强烈电磁噪声潮湿腐蚀猪舍湿度长期70%RH粉尘堆积饲料粉尘会堵塞设备通风口因此传感器选型必须符合IP67防护等级。实测发现SHT30温湿度传感器误差±2%RH配合MH-Z19B二氧化碳传感器±50ppm3%读数是最可靠的组合。为增强抗干扰能力所有信号线需采用双绞线并套磁环RS485总线要加TVS二极管防护。2.2 软件架构设计采用前后台系统架构最为合适void main() { hardware_init(); while(1) { read_sensors(); // 前台任务 process_data(); if(sys_tick%1000) { // 每100ms执行 control_actuators(); // 后台任务 send_cloud_data(); } } }关键是要处理好三个实时性矛盾温湿度采样需要慢速2Hz即可氨气检测响应时间长达90秒喂食机控制要求毫秒级响应我的解决方案是采用时间片轮询中断优先级的混合调度策略。将喂食信号连接至EXTI外部中断线氨气传感器使用DMA传输其他传感器采用定时器触发采样。3. 核心功能实现细节3.1 环境参数采集模块温湿度采集要注意防结露问题。在SHT30的驱动代码中需要加入自加热功能void SHT30_StartHeater(void) { I2C_Write(SHT30_ADDR, 0x306D); // 开启加热器 delay_ms(50); I2C_Write(SHT30_ADDR, 0x3093); // 软复位 }氨气传感器需要特别处理预热问题。上电后前3分钟的数据应丢弃且每次读数前要执行校准float MHZ19B_ReadGas(void) { uint8_t cmd[9] {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79}; uart_send(MHZ_UART, cmd, 9); delay_ms(100); uint8_t buf[9]; uart_read(MHZ_UART, buf, 9); if(buf[0]0xFF buf[1]0x86) { return (float)((buf[2]8)|buf[3]); } return -1; }3.2 智能喂食控制算法传统定时喂食会导致饲料浪费约15%。我设计的动态喂食算法基于以下参数当前料槽余量称重传感器猪只活动频率PIR传感器计数环境温度代谢率修正核心算法逻辑float calculate_feed_amount(void) { float base 2.5f; // 基础喂食量(kg) float temp_factor 0.05f * (25.0f - current_temp); float activity_factor pir_count / 100.0f; return base * (1.0f temp_factor activity_factor); }要注意饲料结块问题在驱动喂食电机时需要加入正反转抖动void feed_motor_control(float kg) { int steps (int)(kg * 200); // 200 steps/kg for(int i0; isteps; i) { MOTOR_CW(90); // 正转90度 if(i%100) MOTOR_CCW(30); // 每10步反转30度防卡 } }4. 通信协议与云端对接4.1 现场总线设计RS485总线布线必须遵循手拉手拓扑终端电阻设为120Ω。Modbus-RTU帧格式建议如下[设备地址][功能码][数据地址][数据长度][CRC16]典型温湿度读取指令01 03 00 00 00 02 C4 0B在STM32中实现时要特别注意3.5个字符的帧间隔时间要求。建议使用定时器实现void USART1_IRQHandler(void) { static uint32_t last_rx_time; if(USART_GetITStatus(USART1, USART_IT_RXNE)) { last_rx_time systick_cnt; // 存入缓冲区 } if(systick_cnt - last_rx_time 2) { // 2ms超时 process_modbus_frame(); } }4.2 4G模块数据传输EC20 4G模块通过AT指令发送JSON数据包void send_cloud_data(void) { char json[256]; sprintf(json,{\temp\:%.1f,\humi\:%.1f,\nh3\:%.1f}, temp, humi, nh3); uart_send(AT_UART, ATQHTTPPOST256,60,80\r\n); delay_ms(100); uart_send(AT_UART, json); }要处理网络不稳定的情况我设计了三级缓存策略片内Flash缓存最近1小时数据SD卡存储24小时历史数据服务器断连时自动切换短信报警5. 抗干扰设计与故障处理5.1 硬件防护措施电源输入端加装三级滤波共模电感→TVS管→π型滤波器所有IO口串联100Ω电阻并并联5.1V稳压管外壳接大地信号线采用屏蔽双绞线实测表明在变频器启停时系统电源会出现300ms的电压跌落。建议使用超级电容作为后备电源[电源输入]--[LM2596]--[4700uF]--[2.7V 10F超级电容]--[AMS1117-3.3]5.2 软件看门狗策略启用STM32独立看门狗(IWDG)和窗口看门狗(WWDG)双重保护void IWDG_Init(void) { IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); IWDG_SetPrescaler(IWDG_Prescaler_32); // 32kHz/321kHz IWDG_SetReload(1000); // 1秒超时 IWDG_ReloadCounter(); IWDG_Enable(); }在任务调度中加入喂狗机制void task_monitor(void) { static uint8_t task_flag; if(task_flag 0x01) IWDG_ReloadCounter(); task_flag ^ 0x01; }6. 实际部署经验分享6.1 传感器安装要点温湿度传感器要远离门窗和水帘高度与猪背平齐约0.7米氨气传感器需安装在粪沟上方30cm处避免直接溅水水位检测建议使用非接触式电容传感器安装在饮水器侧壁6.2 维护技巧发现系统异常时按以下顺序排查检查电源指示灯状态用USB转TTL工具查看调试输出测量RS485总线A/B线间电压正常2-6V逐个短接传感器测试线路通断建议每月执行以下维护用气枪清理设备灰尘检查接线端子是否氧化校准一次传感器特别是氨气检测这个项目最让我意外的是加入声音分析功能后通过FFT分析猪咳嗽声能提前3天预测呼吸道疾病爆发。只需在STM32上增加一个MEMS麦克风和256点FFT算法成本增加不到5元却能显著降低兽药使用量。