1. 项目背景与核心功能
温室大棚种植对温湿度、光照等环境因素极为敏感,传统人工监控方式效率低且难以实时响应。这套基于STM32C8T6与ESP8266的远程监控系统,用不到200元的成本就能实现7×24小时环境监测。我在实际测试中发现,系统响应速度比人工巡检快20倍,异常情况能在3秒内触发报警。
核心功能分为三个层次:环境感知层使用DHT11温湿度传感器、光敏电阻和土壤湿度探头采集数据;控制层通过STM32的PWM接口驱动风扇、水泵等执行机构;网络层借助ESP8266模块将数据推送到OneNET云平台。特别要提的是OLED屏幕的交互设计——不仅显示实时数据,还能通过物理按键设置报警阈值,这对没有智能手机的老年农户特别友好。
2. 硬件设计详解
2.1 主控芯片选型对比
STM32F103C8T6这颗Cortex-M3内核芯片是我反复对比后的选择。实测中发现它的72MHz主频能轻松处理多传感器数据,而STM8系列在同时驱动OLED和ESP8266时会出现卡顿。关键参数对比如下:
| 型号 | 主频 | Flash | RAM | ADC精度 | 价格 |
|---|---|---|---|---|---|
| STM32C8T6 | 72MHz | 64KB | 20KB | 12位 | ¥12 |
| STM8S003F3 | 16MHz | 8KB | 1KB | 10位 | ¥5 |
| ESP32-C3 | 160MHz | 4MB | 400KB | 12位 | ¥25 |
2.2 传感器电路设计要点
DHT11的DATA引脚需要接5.1K上拉电阻,我吃过亏——没加上拉电阻会导致湿度读数漂移。光敏电阻建议用GL5528,其10-20KΩ的阻值范围正好匹配STM32的ADC输入电压范围。土壤湿度传感器有个坑:长期插在土里会导致电极氧化,解决方法是在探头表面镀金,成本增加不到2元但寿命延长3倍。
2.3 ESP8266固件烧录技巧
ESP-01S模块烧录时要注意GPIO0引脚下拉接地。有次我忘记这个步骤,折腾半天才发现模块始终不进入下载模式。推荐使用安信可的烧录工具,比官方工具稳定得多。WiFi连接部分要加入重连机制,我的代码里是这样实现的:
void ESP8266_Reconnect() { while(AT_Test() != 1) { Send_AT("AT+CWJAP=\"SSID\",\"PASSWORD\""); delay_ms(3000); if(AT_Test() == 1) break; printf("Retry connecting...\n"); } }3. 软件架构设计
3.1 多任务调度方案
不用RTOS也能实现伪多任务。通过状态机+定时中断的方式,我把系统功能拆分为这几个任务单元:
- 传感器采集任务(100ms周期)
- OLED刷新任务(500ms周期)
- 云端通信任务(1s周期)
- 控制逻辑任务(事件触发)
关键是要合理设置任务优先级,比如温湿度采集必须保证准时执行,而OLED刷新可以适当延迟。这是我在tim.c中的配置:
TIM_TimeBaseInitTypeDef TIM_InitStructure; TIM_InitStructure.TIM_Period = 999; TIM_InitStructure.TIM_Prescaler = 7199; //10kHz TIM_InitStructure.TIM_ClockDivision = 0; TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_InitStructure); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);3.2 云端通信协议优化
OneNET平台默认的EDP协议太臃肿,我改用轻量化的MQTT协议,数据包体积缩小60%。上传数据时采用差值上传策略——只有当温度变化超过0.5℃或湿度变化超过3%时才触发上传。实测这个优化让模块功耗降低40%,4节AA电池能用3个月。
数据格式设计示例:
{ "devid":"STM32_001", "temp":25.6, "humi":62, "soil":45, "light":780 }4. 常见问题解决方案
4.1 传感器数据跳变处理
初期测试时发现土壤湿度读数会突然归零,后来发现是电源问题。STM32的3.3V输出带载能力有限,当水泵启动时电压会被拉低。解决方法有两个:一是给传感器单独供电,二是在ADC采样时开启软件滤波。我选择了第二种方案,代码实现如下:
uint16_t ADC_Filter(uint8_t ch) { uint32_t sum = 0; for(uint8_t i=0; i<16; i++) { sum += Get_ADC(ch); delay_ms(2); } return (sum >> 4); }4.2 ESP8266断网恢复
大棚环境WiFi信号不稳定,我设计了三级恢复机制:首先尝试自动重连,5次失败后重启模块,仍然失败就切换AP模式等待配置。这个逻辑大幅提升系统可靠性,在金属骨架的大棚里也能稳定工作。
4.3 低功耗优化技巧
夜间不需要频繁监测时,可以关闭OLED背光(省电15mA),把传感器采样间隔从1秒改为10秒(省电80%)。关键代码:
if(light_value < 50) { //夜间模式 OLED_DisplayOff(); sensor_interval = 10000; } else { OLED_DisplayOn(); sensor_interval = 1000; }5. 扩展功能实现
5.1 微信小程序控制端
用uni-app框架开发的跨平台控制端,核心功能包括:
- 实时数据曲线展示
- 历史数据查询(支持导出Excel)
- 远程控制继电器
- 报警消息推送
小程序通过WebSocket与云端通信,控制指令传输延迟控制在300ms以内。有个实用技巧:在STM32端设置指令校验机制,防止误操作:
if(strstr(cmd, "FAN_ON") && checksum == calc_checksum(cmd)) { FAN_CTRL(1); Send_ACK("FAN_ON_OK"); }5.2 语音控制集成
通过LD3320语音识别模块实现本地语音控制,识别率能达到85%。设计时要注意避开大棚常见噪声频段,我在代码里做了带通滤波:
void ASR_Init() { Set_Mic_Gain(15); //降低麦克风增益 Set_Noise_Floor(0x40); //提高噪声门限 Add_Command("kai deng", 1); //添加指令"开灯" Add_Command("guan deng", 2); }6. 系统部署建议
实际部署时要考虑大棚的特殊环境:高湿度会导致电路板结露,建议用704硅胶密封所有接插件;金属骨架会影响WiFi信号,最好将ESP8266天线引出到塑料窗框位置;夏季高温时STM32可能过热,加装小型散热片能有效降低故障率。
电源方案推荐使用太阳能板+18650锂电池组合,我用的20W太阳能板在阴天也能维持系统运转。接线时别忘了防反接二极管,有次我接反极性烧毁了整个电源模块。