1. 项目概述
这个基于STM32的多路温室大棚监测系统,是我去年为一个农业科技创业团队设计的低成本解决方案。当时他们需要一套能够同时监测四个不同区域温湿度的设备,预算有限但要求数据必须实时可见。经过两周的开发和调试,最终做出了这个稳定可靠的原型。
系统核心由STM32F103C8T6最小系统板驱动,搭配DHT22温湿度传感器和0.96寸OLED显示屏。实测下来,四路传感器数据采集间隔可控制在2秒以内,OLED刷新率30Hz,完全满足温室环境监测的基本需求。最让我满意的是整套硬件成本不到80元,却实现了商业级监测设备90%的基础功能。
2. 硬件选型与电路设计
2.1 主控芯片选择
选用STM32F103C8T6主要基于三点考虑:
- 充足的GPIO资源(37个IO口)可轻松扩展多路传感器
- 内置12位ADC满足模拟信号采集需求
- 72MHz主频确保实时数据处理能力
注意:市面上有些低价开发板可能使用翻新芯片,建议通过正规渠道购买,我曾在某宝买到过不良品导致ADC读数异常。
2.2 传感器选型对比
测试了三种常见温湿度传感器:
| 型号 | 精度范围 | 响应时间 | 接口方式 | 单价 |
|---|---|---|---|---|
| DHT11 | ±2℃/±5%RH | 2s | 单总线 | 5元 |
| DHT22 | ±0.5℃/±2%RH | 1s | 单总线 | 15元 |
| SHT30 | ±0.2℃/±2%RH | 0.5s | I2C | 35元 |
最终选择DHT22是因为其性价比最高。虽然SHT30精度更好,但四路传感器成本会翻倍。实际测试在温室环境下,DHT22的精度完全够用。
2.3 显示模块设计
使用SSD1306驱动的0.96寸OLED(128x64分辨率),相比LCD有以下优势:
- 自发光无需背光,功耗更低(仅0.08W)
- 高对比度,在强光下仍清晰可见
- 支持自定义字符和图形显示
接线方式采用I2C接口,只需4根线(VCC,GND,SCL,SDA),比SPI接口节省3个IO口。实际布线时要注意:
- SCL/SDA线长不宜超过50cm
- 需加上拉电阻(通常4.7KΩ)
- 多设备共用I2C时要确保地址不冲突
3. 软件架构实现
3.1 传感器驱动开发
DHT22的单总线协议时序要求严格,我的实现方案是:
c复制#define DHT_TIMEOUT 10000
uint8_t DHT_Read(uint8_t *temp, uint8_t *humi) {
// 主机拉低18ms
GPIO_ResetBits(DHT_PORT, DHT_PIN);
Delay_ms(18);
// 释放总线等待20-40us
GPIO_SetBits(DHT_PORT, DHT_PIN);
Delay_us(30);
// 检测从机响应
if(!GPIO_ReadInputDataBit(DHT_PORT, DHT_PIN)) {
uint32_t timeout = 0;
while(!GPIO_ReadInputDataBit(DHT_PORT,DHT_PIN)
&& timeout++ < DHT_TIMEOUT);
// ...后续数据接收处理
}
return 0;
}
常见问题处理:
- 读取超时:检查电源电压(需稳定5V)和上拉电阻
- 数据校验错误:缩短传感器到MCU的距离(建议<20cm)
- 采样间隔:DHT22两次采样至少间隔2秒
3.2 多路数据采集策略
采用分时复用方式轮询四路传感器:
- 初始化时建立传感器对象数组
c复制typedef struct {
GPIO_TypeDef* port;
uint16_t pin;
float temperature;
float humidity;
} DHT_Sensor;
DHT_Sensor sensors[4] = {
{GPIOA, GPIO_Pin_0, 0, 0},
{GPIOA, GPIO_Pin_1, 0, 0},
// ...其余传感器
};
- 在主循环中建立状态机:
c复制void main() {
static uint8_t current_sensor = 0;
while(1) {
if(DHT_Read(&sensors[current_sensor])) {
current_sensor = (current_sensor + 1) % 4;
UpdateDisplay();
}
Delay_ms(2000);
}
}
实测技巧:给每个传感器电源并联100uF电容,可避免同时上电时的电流冲击导致读数异常。
3.3 OLED显示优化
显示布局采用四象限设计:
code复制+---------------------+
| 区域1: 25.3℃ 65% |
| 区域2: 24.8℃ 68% |
| 区域3: 26.1℃ 62% |
| 区域4: 25.7℃ 70% |
+---------------------+
使用u8g2图形库实现动态刷新:
c复制void UpdateDisplay() {
u8g2_ClearBuffer(&u8g2);
u8g2_SetFont(&u8g2, u8g2_font_6x10_tf);
for(int i=0; i<4; i++) {
char buf[30];
sprintf(buf, "区域%d: %.1f℃ %d%%",
i+1, sensors[i].temperature,
(int)sensors[i].humidity);
u8g2_DrawStr(&u8g2, 0, 15*(i+1), buf);
}
u8g2_SendBuffer(&u8g2);
}
显示优化技巧:
- 使用局部刷新代替全屏刷新
- 重要数据用反色显示
- 添加简单的动画效果(如数据更新时的闪烁提示)
4. 系统集成与调试
4.1 电源方案设计
采用12V直流输入,通过LM2596降压到5V:
- 主控板:5V→3.3V LDO
- 传感器:直接5V供电
- OLED:3.3V供电
实测整机工作电流:
- 静态:约25mA
- 传感器工作时:峰值80mA
- 建议电源容量:≥1A
4.2 抗干扰措施
在温室环境中遇到的主要问题:
- 长线传输干扰:传感器线超过1米时数据异常
- 解决方案:使用双绞线,每米加100Ω终端电阻
- 电源波动:水泵启动时导致MCU复位
- 解决方案:主电源并联2200uF电容
- 冷凝水导致短路:清晨高湿环境下出现
- 解决方案:电路板喷涂三防漆
4.3 现场安装建议
根据三个月的实际运行经验,给出以下安装规范:
- 传感器位置:
- 离地面1.2-1.5米(作物生长高度)
- 避免阳光直射
- 距离喷头>50cm
- 主机安装:
- 置于防水盒内
- 保持通风防结露
- 远离大功率设备
5. 功能扩展方向
5.1 数据存储与上传
添加SD卡模块实现本地存储:
c复制void SaveToSD() {
FIL file;
f_open(&file, "data.csv", FA_WRITE | FA_OPEN_APPEND);
char buffer[128];
time_t now = Get_RTC();
sprintf(buffer, "%d,%02d:%02d,%.1f,%.1f,%.1f,%.1f\n",
now.date, now.hour, now.minute,
sensors[0].temperature, sensors[1].temperature,
sensors[2].temperature, sensors[3].temperature);
f_write(&file, buffer, strlen(buffer), &bytes_written);
f_close(&file);
}
5.2 报警功能实现
当温度超过阈值时触发蜂鸣器:
c复制#define TEMP_MAX 30.0
void CheckAlarm() {
for(int i=0; i<4; i++) {
if(sensors[i].temperature > TEMP_MAX) {
BEEP_On();
DisplayAlert(i);
break;
}
}
}
5.3 手机APP监控
通过蓝牙模块HC-05传输数据:
- 配置蓝牙为从机模式
- 定义简单通信协议:
code复制[T1:25.3,H1:65][T2:24.8,H2:68]... - Android端使用MIT App Inventor快速开发接收程序
这个项目最让我意外的是DHT22在高温高湿环境下的长期稳定性。最初担心农业场景的恶劣环境会影响传感器寿命,但实际运行半年后,四路传感器的数据漂移都在规格范围内。如果预算允许,下一步我会尝试加入土壤湿度监测和自动灌溉联动,那将真正形成一个完整的智慧农业闭环系统。
