1. 项目概述
这个基于单片机的无线温度采集报警系统,是我去年为一个食品仓储客户设计的实用方案。当时客户需要实时监控多个冷库的温度,并在异常时立即报警。传统有线方案布线困难,而市面上的无线方案要么太贵,要么功能单一。于是我用常见的STC89C52单片机搭配DS18B20温度传感器和NRF24L01无线模块,搭建了一套低成本、高可靠性的解决方案。
整套系统由多个无线温度采集节点和一个中央报警主机组成。每个采集节点可以独立工作,通过2.4G无线频段将温度数据传回主机。当温度超过设定的上下限时,主机不仅会触发声光报警,还能通过短信模块向管理员手机发送预警信息。实测在开阔场地传输距离可达50米,室内穿墙也能稳定传输20米左右。
2. 系统设计与核心器件选型
2.1 整体架构设计
系统采用星型网络拓扑,一个主机对应多个从机节点。这种设计有几个关键考虑:
- 布线简单:从机只需要供电,无需数据线
- 扩展灵活:随时增加新的监测点
- 成本可控:从机采用最简设计
主机和从机都使用STC89C52作为主控,主要看中其:
- 价格低廉(约5元/片)
- 内置4KB Flash存储器
- 完全兼容51指令集,开发门槛低
2.2 关键器件选型对比
温度传感器选型
对比了三种常见方案:
| 型号 | 精度 | 接口 | 价格 | 最终选择理由 |
|---|---|---|---|---|
| DS18B20 | ±0.5℃ | 单总线 | 3元 | 抗干扰强,直接数字输出 |
| LM35 | ±1℃ | 模拟量 | 2元 | 需要ADC,电路复杂 |
| DHT11 | ±2℃ | 单总线 | 5元 | 精度不足,含湿度功能冗余 |
DS18B20的独特优势在于:
- 每个器件有唯一64位序列号,支持一线多设备
- 测量范围-55℃~+125℃,完全覆盖冷库需求
- 防水封装版本可直接接触液体测量
无线模块选型
测试了三种2.4G方案:
| 模块 | 传输距离 | 功耗 | 价格 | 选择原因 |
|---|---|---|---|---|
| NRF24L01 | 50m(开阔) | 12mA | 8元 | 性价比最优 |
| CC1101 | 100m | 15mA | 25元 | 成本过高 |
| HC-12 | 1000m | 28mA | 35元 | 功耗大,需求过剩 |
NRF24L01的软件配置要点:
c复制// 初始化配置示例
void NRF24L01_Init(void)
{
CE = 0;
CSN = 1;
SPI_Write_Reg(CONFIG, 0x0E); // 使能CRC校验,16位CRC,上电
SPI_Write_Reg(EN_AA, 0x01); // 使能通道0自动应答
SPI_Write_Reg(RF_CH, 40); // 设置频道40(2.440GHz)
SPI_Write_Reg(RF_SETUP, 0x07);// 0dB增益,2Mbps速率
}
3. 硬件电路设计详解
3.1 从机节点电路设计
从机电路追求极简设计,核心只有四个部分:
- 单片机最小系统(晶振+复位)
- DS18B20接口电路
- NRF24L01模块接口
- 电源管理电路
重要提示:DS18B20的数据线必须加上拉电阻(4.7KΩ),否则无法正常读取数据。我在初期测试时曾因此浪费两天时间排查。
电源部分采用3.3V LDO稳压,因为:
- NRF24L01工作电压范围1.9-3.6V
- DS18B20支持3-5.5V宽电压
- STC89C52在3.3V下仍能稳定工作
3.2 主机报警电路设计
主机增加的功能模块:
- LCD1602显示屏:实时显示各节点温度
- 蜂鸣器+LED:声光报警
- SIM800C短信模块:远程报警
- 按键输入:用于设置报警阈值
一个容易忽视的细节:蜂鸣器驱动不要直接用IO口,建议加一个三极管放大电路。我曾遇到IO口驱动能力不足导致报警音量太小的问题。
4. 软件设计关键点
4.1 从机程序设计
从机软件流程:
- 上电初始化各外设
- 读取DS18B20的ROM编码(用于唯一标识)
- 进入低功耗模式(通过定时器唤醒)
- 定时采集温度并无线发送
温度读取代码示例:
c复制float Read_Temperature(void)
{
unsigned char tempL, tempH;
int temp;
DS18B20_Reset();
DS18B20_WriteByte(0xCC); // 跳过ROM
DS18B20_WriteByte(0x44); // 启动转换
Delay_ms(750); // 等待转换完成
DS18B20_Reset();
DS18B20_WriteByte(0xCC);
DS18B20_WriteByte(0xBE); // 读取暂存器
tempL = DS18B20_ReadByte();
tempH = DS18B20_ReadByte();
temp = (tempH<<8)|tempL;
return temp*0.0625; // 转换实际温度值
}
4.2 主机程序设计
主机需要处理的主要任务:
- 轮询接收各节点数据
- 温度数据滤波处理(我采用滑动平均滤波)
- 报警逻辑判断
- 人机交互处理
数据接收采用中断方式,避免轮询造成的延迟:
c复制void EXTI0_IRQHandler(void)
{
if(IRQ == 0) {
NRF24L01_RxPacket(rx_buf); // 读取接收数据
LCD_Display(rx_buf); // 更新显示
Check_Alarm(rx_buf); // 检查报警
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
5. 系统调试与优化
5.1 无线通信可靠性提升
初期测试发现的三个典型问题及解决方案:
-
数据丢包问题
- 现象:偶尔收不到从机数据
- 排查:用逻辑分析仪抓取SPI时序
- 解决:在NRF24L01初始化后增加200ms延时
-
地址冲突问题
- 现象:多个从机数据混淆
- 解决:为每个从机分配唯一地址
c复制// 从机地址配置 unsigned char TX_ADDRESS[5] = {0x34,0x43,0x10,0x10,0x01}; // 最后字节区分节点 -
电源干扰问题
- 现象:无线通信时单片机复位
- 解决:在NRF24L01的VCC引脚加100uF电解电容
5.2 低功耗优化技巧
从机节点采用3节AA电池供电时,通过以下措施使续航达6个月:
- 平时单片机进入掉电模式(功耗<0.1uA)
- 用定时器唤醒(每10秒采集一次)
- 无线模块仅在发送时上电
- 关闭所有LED指示灯
关键代码实现:
c复制void Power_Save(void)
{
PCON |= 0x02; // 进入掉电模式
_nop_();
_nop_();
// 定时器中断唤醒后会从此处继续执行
}
6. 实际应用案例
在某冷链仓库的部署情况:
- 共部署8个从机节点
- 4个在-18℃冷冻库
- 2个在4℃冷藏库
- 2个在常温装卸区
- 主机放置在值班室
- 报警阈值设置:
- 冷冻库:-20℃~-15℃
- 冷藏库:2℃~6℃
运行三个月后发现的问题及改进:
-
冷冻库节点偶尔数据异常
- 原因:冷凝水导致DS18B20接触不良
- 解决:改用防水型DS18B20并做密封处理
-
装卸区节点电池消耗快
- 原因:高温环境加速电池自放电
- 解决:改用锂亚电池并增加隔热层
7. 扩展功能建议
根据实际使用反馈,后续可以增加:
-
历史数据记录
- 给主机增加SD卡模块
- 按小时存储温度数据
- 生成温度变化曲线图
-
中继功能
- 对于超大型仓库
- 部分节点充当路由中继
- 需修改通信协议
-
手机APP监控
- 通过蓝牙连接主机
- 实现移动端实时查看
- 支持报警阈值远程设置
这个项目最让我自豪的是它的实用性和性价比。全部硬件成本不到200元,却解决了客户上万元的监控需求。在调试过程中积累的无线通信经验,比如如何避免2.4G频段干扰、提高传输可靠性等技巧,对后续的物联网项目都有很大帮助。