第二节:传感器基础与信号采集
各位同学,咱们今天聊聊传感器。说白了,消防报警系统能不能在火灾初期就发现火情,全靠这些传感器。我做了十几年消防电子,见过太多因为传感器选型不当或者信号采集出问题导致的误报、漏报。嗯,这节课咱们就把烟雾、温度、气体这三种核心传感器掰开揉碎了讲清楚。
2.1 烟雾传感器:光电式与离子式
烟雾传感器是消防报警的“主力军”。目前主流的有两种:光电式和离子式。
2.4.1 光电式烟雾传感器
原理其实很简单。里面有个发光管和一个接收管。正常状态下,接收管几乎收不到光。一旦烟雾颗粒进入迷宫,光线被散射,接收管就能检测到光信号。光越强,烟雾越浓。
我个人习惯在项目里优先选光电式。为什么?因为它对阴燃火(比如沙发、电线慢慢冒烟)反应特别灵敏。我在一个仓库项目里遇到过,电线老化冒烟,光电式传感器提前了整整3分钟报警,给疏散争取了宝贵时间。
2.4.2 离子式烟雾传感器
离子式用的是放射性物质(镅-241),电离空气产生电流。烟雾颗粒进入后,会吸附离子,导致电流下降。电流变化量就是烟雾浓度的指标。
离子式对明火(比如纸张、木材快速燃烧)反应更快。但有个硬伤——它含有放射性物质,虽然剂量很小,但环保和回收是个麻烦事。现在很多国家已经限制使用了。
| 类型 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 光电式 | 对阴燃火灵敏,无放射性 | 对黑烟反应慢 | 住宅、办公室、仓库 |
| 离子式 | 对明火灵敏,响应快 | 含放射性物质,有环保问题 | 特殊工业场所 |
2.2 温度传感器:热敏电阻与热电偶
温度传感器在消防里主要用来检测环境温度异常升高。比如火灾发生时,温度会迅速上升。常用的有热敏电阻和热电偶。
2.2.1 热敏电阻(NTC/PTC)
NTC(负温度系数)热敏电阻,温度越高,电阻越小。PTC(正温度系数)则相反。我一般用NTC,因为它的灵敏度高,价格也便宜。
但要注意,NTC的阻值和温度不是线性关系。你需要查表或者用公式(比如Steinhart-Hart方程)来换算。我曾经在一个项目中偷懒,直接用线性近似,结果温度偏差了5度,差点导致误报。后来老老实实做了查表法。
// NTC温度查表示例(简化版)
const float temp_table[] = { // 温度-电阻对应表
// 温度(°C) : 电阻(kΩ)
// 0°C : 32.5
// 10°C : 19.8
// 20°C : 12.3
// 30°C : 7.8
// 40°C : 5.1
};
float get_temperature(uint16_t adc_value) {
float resistance = calculate_resistance(adc_value);
// 查表找到最接近的电阻值,返回对应温度
for (int i = 0; i < TABLE_SIZE; i++) {
if (resistance >= temp_table[i]) {
return temp_table[i]; // 简化处理,实际需要插值
}
}
return -1;
}
2.2.2 热电偶
热电偶适合测高温,比如厨房、锅炉房这些地方。它利用两种不同金属接触时产生的热电势来测温。优点是量程大(能到上千度),但输出信号很微弱(毫伏级),需要专门的放大电路。
2.3 气体传感器:一氧化碳与半导体
气体传感器在消防里主要用来检测火灾产生的特征气体,比如一氧化碳(CO)。火灾初期,很多材料不完全燃烧会产生大量CO。
2.3.1 电化学式CO传感器
这种传感器精度高,功耗低。原理是CO在电极上发生电化学反应,产生电流。电流大小与CO浓度成正比。我推荐在高端报警器里用这个,虽然贵一点,但可靠。
不过它有个寿命问题,一般2-3年就得换。而且不能长时间暴露在高浓度CO里,否则电极会“中毒”。
2.3.2 半导体式气体传感器
半导体式便宜,灵敏度也高。它利用气敏材料(比如二氧化锡)吸附气体后电阻变化的原理。但选择性差,酒精、水蒸气都可能让它误报。
我记得有一次在实验室测试,旁边有人喷了香水,结果半导体传感器直接报警了。所以,如果你要用它,一定要做好算法滤波和补偿。
2.4 ADC采样:从模拟到数字
传感器输出的都是模拟信号(电压、电流、电阻)。我们需要用ADC(模数转换器)把它变成数字量,才能让单片机处理。
2.4.1 ADC的关键参数
- 分辨率: 比如12位ADC,能区分4096个等级。分辨率越高,精度越高。
- 采样率: 每秒采多少次。消防传感器一般变化不快,几百赫兹就够了。
- 参考电压: 决定了ADC的量程。比如参考电压3.3V,那么ADC值4095对应3.3V。
2.4.2 采样中的坑与技巧
ADC采样看着简单,但实际项目里坑不少。我总结几个经验:
- 滤波是必须的。 传感器信号里有很多噪声。我习惯用滑动平均滤波,取最近10次采样的平均值。效果不错,计算量也小。
- 采样时间要稳定。 不要用延时函数来等采样,用定时器触发。否则采样间隔不均匀,数据会抖动。
- 参考电压要稳。 如果参考电压波动,ADC值会跟着变。我一般用外部基准电压源,比如TL431。
// 滑动平均滤波示例
#define FILTER_SIZE 10
uint16_t filter_buffer[FILTER_SIZE];
uint8_t filter_index = 0;
uint16_t adc_filter(uint16_t new_value) {
filter_buffer[filter_index] = new_value;
filter_index = (filter_index + 1) % FILTER_SIZE;
uint32_t sum = 0;
for (int i = 0; i < FILTER_SIZE; i++) {
sum += filter_buffer[i];
}
return (uint16_t)(sum / FILTER_SIZE);
}
2.4.3 传感器信号调理
很多传感器输出的信号很微弱,或者不是标准的0-3.3V范围。这时候就需要信号调理电路。比如:
- 放大: 用运放把毫伏级信号放大到ADC能识别的范围。
- 偏置: 有些传感器输出有直流偏置,需要减去。
- 低通滤波: 在ADC输入端加一个RC低通滤波器,滤除高频噪声。
好了,这节课就到这里。下节课咱们聊聊嵌入式系统里的实时操作系统(RTOS),看看怎么让多个传感器任务协同工作。记住,传感器是消防报警的“眼睛”,把眼睛擦亮了,后面的算法才能看得准。