1. 项目概述
这个基于STM32的温度报警系统是我最近完成的一个嵌入式小项目,核心功能是通过DS18B20数字温度传感器采集环境温度,当温度超过预设阈值时触发声光报警。整个系统硬件成本不到50元,但实现了完整的温度监控功能,非常适合作为嵌入式开发的练手项目。
系统主要包含四个核心模块:
- 温度采集:采用DS18B20数字温度传感器,精度±0.5°C
- 人机交互:通过4个独立按键调整报警阈值,0.96寸OLED显示实时数据
- 报警输出:蜂鸣器+LED组合实现声光报警
- 主控芯片:STM32F103C8T6最小系统板(蓝色pill开发板)
这个项目的亮点在于:
- 完全开源(代码和仿真文件都已分享)
- 使用Proteus进行完整仿真验证
- 包含详细视频教程(B站可搜)
- 硬件接线简单,适合初学者复现
2. 硬件设计详解
2.1 核心器件选型
主控芯片选择:
我选用STM32F103C8T6主要基于三点考虑:
- 性价比高(约10元/片)
- 丰富的外设资源(足够本项目使用)
- 广泛的社区支持(遇到问题容易找到解决方案)
温度传感器对比:
对比了DS18B20、DHT11和LM35后,最终选择DS18B20是因为:
- 数字输出,无需ADC转换(简化电路)
- 单总线协议,节省IO口
- 精度较高(±0.5°C)
- 防水型号可选(适合特殊环境)
实际使用中发现:DS18B20的响应速度较慢(约750ms转换时间),不适合需要快速温度采集的场景
2.2 电路设计要点
电源部分:
- 采用AMS1117-3.3稳压芯片
- 输入5V(USB供电)
- 输出3.3V(为STM32和外围器件供电)
传感器接口:
code复制DS18B20接线:
VDD → 3.3V
DQ → PA1(需接4.7K上拉电阻)
GND → GND
按键电路:
采用独立按键设计,硬件消抖方案:
- 每个按键串联100nF电容
- GPIO配置为上拉输入模式
- 软件中额外添加20ms延时消抖
报警输出电路:
- 蜂鸣器:有源蜂鸣器(驱动简单)+NPN三极管驱动
- LED:共阳极接法,限流电阻220Ω
3. 软件实现解析
3.1 开发环境搭建
工具链选择:
- IDE:Keil MDK-ARM(社区版免费)
- 仿真:Proteus 8.9
- 调试:ST-Link V2
工程配置关键点:
- 时钟配置:使用外部8MHz晶振,PLL倍频到72MHz
- GPIO初始化:特别注意复用功能配置
- 延时函数:使用SysTick实现精确延时
3.2 核心代码剖析
温度读取流程:
c复制// DS18B20读取示例代码
float DS18B20_ReadTemp(void)
{
uint8_t tempL, tempH;
int16_t temp;
DS18B20_Start(); // 启动温度转换
Delay_ms(750); // 等待转换完成
DS18B20_Read(&tempL, &tempH); // 读取温度值
temp = (tempH << 8) | tempL;
return temp * 0.0625; // 转换为实际温度值
}
按键处理优化:
原始代码的按键检测存在抖动问题,我改进后的方案:
c复制#define KEY_DEBOUNCE_TIME 20 // 消抖时间20ms
uint8_t Key_Scan(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
if(HAL_GPIO_ReadPin(GPIOx, GPIO_Pin) == GPIO_PIN_RESET)
{
HAL_Delay(KEY_DEBOUNCE_TIME);
if(HAL_GPIO_ReadPin(GPIOx, GPIO_Pin) == GPIO_PIN_RESET)
{
while(HAL_GPIO_ReadPin(GPIOx, GPIO_Pin) == GPIO_PIN_RESET);
return 1;
}
}
return 0;
}
3.3 OLED显示优化
原始代码直接显示原始数据,我增加了以下改进:
- 添加温度单位符号(°C)
- 低于0度时显示负号
- 报警阈值用不同颜色标识(通过反色显示实现)
显示效果示例:
code复制当前温度:25.6°C
高温报警:30.0°C
低温报警:10.0°C
4. 常见问题与解决方案
4.1 DS18B20读取失败
现象:温度值始终为85°C或-127°C
可能原因:
- 上拉电阻未接或阻值过大(应使用4.7KΩ)
- 时序不符合要求(检查延时函数精度)
- 传感器供电不足(建议改用寄生供电时降低总线速度)
解决方案:
- 用示波器检查单总线波形
- 参考官方时序图调整代码
- 尝试更换传感器
4.2 OLED显示异常
现象:显示乱码或部分内容缺失
排查步骤:
- 检查I2C/SPI接口接线(SCL/SDA是否接反)
- 确认初始化序列正确
- 测试电源电压是否稳定(3.3V±5%)
实测发现:某些廉价OLED模块需要降低通信速度(将I2C时钟从400kHz降到100kHz)
4.3 按键响应不灵敏
优化方案:
- 硬件层面:
- 增加电容滤波(100nF)
- 改用优质按键开关
- 软件层面:
- 实现状态机检测(避免阻塞延时)
- 添加连按功能(长按加速调整)
5. 项目进阶方向
这个基础版本完成后,可以考虑以下扩展:
功能增强:
- 增加温度历史记录(使用STM32内部Flash)
- 添加RTC模块,实现温度变化趋势分析
- 通过蓝牙模块(HC-05)连接手机APP
性能优化:
- 改用中断方式检测按键
- 实现温度采集与显示的双缓冲机制
- 加入滑动平均滤波算法处理温度数据
产品化改进:
- 设计PCB替代杜邦线连接
- 选用工业级元器件(-40°C~85°C工作范围)
- 通过EMC测试认证
这个项目我从最初的Proteus仿真到实际硬件调试花了约两周时间,最大的收获是对STM32的外设驱动开发有了更深入的理解。特别是单总线协议的实现,让我意识到精确时序控制在嵌入式系统中的重要性。下一步我准备尝试加入Wi-Fi模块,实现远程温度监控功能。