1. 项目背景与核心功能
现代生活中,温湿度、光照强度和空气质量等环境参数直接影响居住舒适度。传统环境监测设备往往功能单一且成本高昂,而基于STM32的智能终端能同时采集多维度数据,并通过本地显示屏实时反馈。我曾用STM32F103搭配DHT11、GP2Y1010AU等传感器搭建过一套监测系统,实测发现这种方案不仅成本可控(整套硬件成本约200元),还能实现分钟级的数据刷新。
这个项目的核心在于:
- 多传感器协同:同时监测PM2.5、温湿度、光照强度
- 低功耗设计:采用STM32的睡眠模式,待机电流仅2mA
- 实时可视化:通过2.8寸TFT LCD显示数据和曲线图
- 模块化设计:传感器可灵活更换,例如用SHT30替代DHT11提升精度
2. 硬件选型与电路设计
2.1 主控芯片选择
STM32F103C8T6是最佳选择,原因有三:
- 性价比突出:零售价约15元,具备72MHz主频和64KB Flash
- 外设丰富:内置12位ADC(可用于光敏电阻和PM2.5模拟信号采集)
- 开发便利:标准库和HAL库支持完善,我在调试时发现其GPIO驱动能力可直接驱动LCD背光
注意:若需要WiFi上传数据,可换用ESP8266作协处理器,通过UART与STM32通信
2.2 传感器选型对比
| 传感器类型 | 型号 | 接口 | 测量范围 | 精度 | 单价 |
|---|---|---|---|---|---|
| 温湿度 | DHT11 | 单总线 | 0-50℃, 20-90%RH | ±2℃, ±5%RH | 8元 |
| PM2.5 | GP2Y1010AU | 模拟量 | 0-500μg/m³ | ±10% | 35元 |
| 光照 | GL5528 | 模拟量 | 10-1000 Lux | ±15% | 2元 |
实际使用中发现DHT11响应较慢(约2秒),但对家居环境已足够。若需要更高精度,可换用I2C接口的SHT30(精度±1.5%RH,但价格约40元)
2.3 关键电路设计要点
- PM2.5传感器供电:
- 需增加100μF电容稳压,避免电机工作时电压波动
- 输出端接1kΩ上拉电阻到3.3V
- 光敏电阻分压电路:
// 计算公式:Lux = 10^( (log10(Rldr) - 3) / -0.7 ) float Rldr = (3.3f * 10.0f) / (adc_value * 3.3f / 4096) - 10.0f; - LCD背光控制: 通过PWM调节亮度,夜间可自动降低亮度节能
3. 软件实现与优化技巧
3.1 传感器数据采集
DHT11的驱动要注意时序问题,这里分享一个稳定读取的代码片段:
void DHT11_Start(void) { GPIO_InitTypeDef gpio = {0}; gpio.Pin = DHT11_PIN; gpio.Mode = GPIO_MODE_OUTPUT_PP; HAL_GPIO_Init(DHT11_PORT, &gpio); HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_RESET); HAL_Delay(18); // 保持至少18ms低电平 HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_SET); delay_us(30); // 主机拉高20-40us }3.2 数据滤波算法
PM2.5传感器容易受干扰,采用移动平均滤波:
#define FILTER_LEN 10 uint16_t pm25_filter_buf[FILTER_LEN]; uint16_t filter_pm25(uint16_t new_val) { static uint8_t idx = 0; pm25_filter_buf[idx++] = new_val; if(idx >= FILTER_LEN) idx = 0; uint32_t sum = 0; for(uint8_t i=0; i<FILTER_LEN; i++) { sum += pm25_filter_buf[i]; } return sum / FILTER_LEN; }3.3 低功耗优化
通过RTC唤醒实现间歇工作:
- 正常模式:72MHz全速运行,电流约50mA
- 睡眠模式:仅RTC工作,电流约2mA
void enter_stop_mode(void) { HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // 唤醒后需要重新配置时钟 SystemClock_Config(); }4. 数据可视化实现
4.1 LCD界面设计
使用u8g2图形库构建交互界面:
- 主页面:实时数值+柱状图
- 历史页面:最近12小时曲线
- 设置页面:报警阈值调整
4.2 动态刷新优化
采用局部刷新策略避免闪烁:
void refresh_pm25_value(uint16_t val) { char buf[10]; sprintf(buf, "%4d", val); // 只更新数值区域(x=60,y=30,w=40,h=20) LCD_DrawRect(60, 30, 40, 20, WHITE); LCD_ShowString(60, 30, buf, BLACK, WHITE); }5. 常见问题解决方案
DHT11无响应:
- 检查上拉电阻(建议4.7kΩ)
- 时序误差需控制在us级
- 多次读取失败后应重置总线
PM2.5数值跳变:
- 增加硬件滤波(在输出端并联104电容)
- 避免安装在空调出风口附近
- 定期清洁传感器光学窗口
LCD显示异常:
- 检查FSMC时序配置(尤其地址建立时间)
- 背光电压需稳定在3.3V±5%
- 尝试降低SPI时钟频率(如从18MHz降至8MHz)
这套系统在连续运行测试中表现稳定,后续可扩展SD卡存储或蓝牙数据传输功能。实际部署时建议将PM2.5传感器与主控板分离安装,避免电路发热影响测量精度。