首页 / 资讯中心 / 文章详情

基于单片机的无线烟雾检测报警系统设计与实现

基于单片机的无线烟雾检测报警系统设计与实现 ★ FEATURED ARTICLE
1. 系统总体架构与设计思路1.1 为什么选择单片机作为核心控制器做这套无线烟雾检测报警系统的初衷是为了解决家庭和仓库场景里“有线报警器布线麻烦、单点报警覆盖范围有限”的痛点。市面上现成的烟雾报警器大多是独立式蜂鸣器报警人不在现场根本听不到更别说在火灾初期就远程知道情况。所以我把核心思路定为用单片机作为本地采集和判断的大脑配上无线模块把报警信息发出去形成一个“检测-确认-上报”的小型物联网闭环。选单片机而不是直接用现成物联网模组比如带Wi-Fi的SOC方案主要出于三点考虑一是成本一颗常规单片机芯片价格在几元以内整机的物料成本能压得比一体化模组低不少二是灵活性烟雾传感器的信号调理、报警阈值、无线协议重传机制都可以自己改不受模组固件限制三是稳定性在工业库房这类电磁环境复杂的地方单片机系统只要做好抗干扰设计运行可靠性比依赖外部协议栈的方案更可控。实际项目里我选的是一颗主流8位单片机主频跑在8MHzRAM 512字节、Flash 8KB这个配置跑烟雾检测逻辑和无线协议绰绰有余。1.2 整体硬件框图与模块划分整个系统拆开看可以分成五个功能块感知端烟雾传感器、信号处理端运放与比较电路、控制端单片机、通信端无线模块、执行端声光报警和电源管理。传感器输出的微弱电流信号经过I-V转换和放大后进单片机的ADC引脚。单片机做两件事一是实时采集浓度值做软件滤波二是通过GPIO控制无线模块的收发和报警灯蜂鸣器。无线模块的选型我放在后面单独讲这里提一个容易犯的错误——不少人喜欢把无线模块的天线直接怼在单片机旁边导致射频干扰串进ADC采集测出来的烟雾浓度值跳得厉害。正确做法是模拟信号回路和射频天线区域在PCB上分区布置中间用地线隔开天线部分尽量悬在板边。模块之间用SPI或UART连接但信号线上要串22欧姆电阻做阻尼降低高频反射。另外电源部分我用了一颗低压差线性稳压器LDO给单片机供电烟雾传感器单独用开关稳压器供电避免电机或无线发射时的瞬时压降干扰传感器基准电压。2. 烟雾传感器选型与硬件电路细节2.1 传感器类型对比离子式、光电式、半导体式烟雾探测的核心是传感器市面主流有三类离子式、光电式、半导体式。离子式对微小火源比如阴燃极其灵敏但内部含有微量放射性源现在消费级产品里越来越少采购和废弃处理都麻烦。光电式利用光散射原理对明火产生的灰白烟雾响应快寿命长是目前家用报警器的主流方案。半导体式如MQ-2便宜、灵敏度高但功耗大、选择性差容易对酒精、油烟误报。我做这套系统用的是光电式烟雾传感器——一个光学迷宫结构里放着红外发射管和光电接收管。关键参数有三个灵敏度每英尺浓烟引起的光电流变化、暗电流无烟时的漏电流、响应时间。选型时要注意传感器的输出电压量程很多光电传感器的输出只有几十毫伏到几百毫伏直接给单片机ADC读分辨率完全不够必须加放大电路。我在传感器输出端用了一级同相放大器增益调到10倍左右让满量程输出贴近ADC的参考电压2.5V这样烟雾浓度变化在ADC读数上才有足够的分辨率。2.2 信号调理电路与阈值设定信号调理的关键是把传感器输出的微弱电流信号变成单片机好读的电压信号。这里我用了一个典型的跨阻放大器TIA运放选择的是低偏置电流的型号偏置电流控制在皮安级否则微弱电流会被运放自身的偏置吃掉。反馈电阻取1M欧姆左右配合传感器内阻能在无烟状态下输出一个约0.4V的基准电平。之后再加一级二阶低通滤波器截止频率设在10Hz滤掉工频干扰和高频噪声。阈值设定是个技术活不能拍脑袋定一个固定值。我在固件里留了两个阈值报警阈值和预警阈值。报警阈值取正常基线的50%变化量预警阈值取20%。但基线不是固定不变的——传感器会随温度湿度漂移灰尘积累也会让基线抬高。所以程序里写了一个“自适应基线”逻辑每10秒取一次滤波后的ADC值连续一小时变化不超过±3%就用这个均值作为新基线。这个逻辑实测下来很有用安装后前两个小时基线可能漂移明显自适应之后误报率大幅下降。有人会问为什么不直接在硬件比较器上设一个固定电压阈值因为固定阈值没法适应不同环境比如厨房的油烟背景和洁净的卧室差异很大。用单片机做软件阈值可以随时通过无线参数配置接口远程调整不用拆机器改电阻这是硬方案做不到的。2.3 供电设计中的低功耗考量很多烟雾报警器需要干电池供电一用就是一年以上所以电源设计直接影响实用性。我这个系统是市电供电加电池备份的双电源方案平时用220V适配器供电停电时自动切换电池。功耗大头是无线模块的发射瞬间峰值能到100毫安以上如果电池直接供电瞬间压降会导致单片机复位。我在电池输出端加了一颗470uF的电解电容做储能同时用一颗带使能脚的LDO给射频模块供电只在无线发送前50毫秒打开LDO发送完成立即关掉这样电池的平均电流能控制在微安级别。传感器也要低功耗处理。光电式烟雾传感器需要持续供电才能响应但可以通过降低发射管的驱动电流来省电——用PWM驱动红外发射管占空比设为1%采样时同步开启ADC平时完全关断。实测下来这种方式把传感器的平均功耗从5毫安降到了0.2毫安左右。注意PWM频率不能太低否则采样窗口会错过烟雾颗粒散射信号的最佳响应时间我测试了1kHz的PWM配合5ms的ADC采样窗口效果最好。3. 无线通信方案的选择与数据协议设计3.1 常用无线模块对比433MHz、2.4GHz、LoRa无线方案决定了报警信息能不能可靠地送到用户手里。市面上可选的模块很多我重点对比了几种433MHz的FSK模块、2.4GHz芯片、LoRa模块。433MHz模块比如常见的CC1101方案优点是绕射能力强穿透墙体效果好室内隔两三堵墙还能收到缺点是速率低几十kbps但传几个字节的报警信息绰绰有余。2.4GHz模块比如NRF24L01速率高、成本低但穿墙衰减大实测隔一堵承重墙信号就掉一半对仓库这种多隔间场景不太合适。LoRa模块覆盖最远、功耗最低但模块成本是前者的两三倍且需要占用频谱授权或者用免费频段加限制。我最终选了433MHz FSK模块作为主机和从机的通信链路理由很直接烟雾报警是低速率、高可靠性的场景我不需要每秒传几百KB的数据我需要的是报警信号能穿墙到达几米外的接收主机。433MHz的无线模块价格能做到几块钱加上一个简易的偶极天线实际测试空旷距离300米以上室内穿两堵墙后接收率还有95%。3.2 数据帧格式与丢包处理无线通信最烦人的就是丢包报警信息丢了是要命的事。所以我在协议层做了一套简单的确认重传机制。每个数据帧固定7个字节帧头0xAA、设备ID1字节、数据类型1字节、数据值2字节、校验和1字节。校验和用累加和虽然简单但够用。设备ID用来区分多个报警器不然接收端分不清是谁在报警。发送端流程是这样单片机采集到烟雾浓度超过报警阈值立即进入报警状态连续发送5次报警帧每次间隔100毫秒。接收端收到任何一帧就回复ACK帧发送端收到ACK后停止发送如果5次都没收到ACK进入300秒的重试周期期间每10秒发一次直到收到ACK或者用户手动确认。实测这种冗余策略之后丢包率从裸传的20%降到5%以下关键报警信息的到达时间基本在1秒内。3.3 多节点组网与冲突避免一个接收主机往往要管理好几个报警器比如一个仓库里装六个探测器。这时候冲突问题就出来了如果两台报警器同时触发无线信道一抢谁也别想发出去。我的方案是给每个设备分配一个固定时隙采用时分复用TDMA思想。主机每隔1秒广播一个同步信标各报警器根据自己设备ID计算偏移时隙在属于自己的时间窗口内发送数据。窗口长度50毫秒10个设备排满也不冲突。除了时隙我还加了载波侦听CCA功能。CC1101这类模块可以读取当前信道的能量值发送前先检测信道是否空闲如果忙就随机退避一段时间再试。TDMA加CCA双保险实测6个节点同时模拟报警成功接收率100%没有出现一次碰撞丢失。当然这套协议只适合节点数几十个以内的场景如果上百个节点就得改用专门的组网协议了但家庭和小型仓库够用。4. 单片机软件逻辑与抗干扰处理4.1 主循环与状态机设计软件架构我用了一个简单的主循环加状态机没有上RTOS因为逻辑不算复杂RTOS反而增加系统开销和调试难度。状态机分五个状态正常监视、预警、报警、故障、静音。正常状态每秒做一次ADC采样和滤波同时通过无线模块向主机上报心跳包每30秒一次主机如果连续三分钟收不到心跳包就判定这个探测器离线了这也是及时发现设备被拔线或失效的手段。状态迁移逻辑要防止抖振比如采样值在阈值附近来回波动状态机会在“正常-预警-正常”之间反复跳。软件里我加了一个去抖计数连续三次采样超过预警阈值才进入预警状态连续三次低于阈值才恢复。报警状态则要求更严格必须连续五次超限且至少持续两秒防止炒菜油烟飘过导致的瞬间误报。逻辑不复杂但写好状态机的关键在于要画出状态迁移表把每个状态下允许响应的事件列清楚我在编码前用表格列了一遍后面调试省了大量时间。4.2 软件滤波算法与误报抑制烟雾传感器的原始信号噪声很大特别是在电源波动或无线发送瞬间。我用了两种滤波滑动平均滤波和一阶低通滤波。滑动平均取10次采样每次间隔100毫秒窗口覆盖1秒能把高频毛刺磨平。一阶低通滤波则用公式y[n] α * x[n] (1-α) * y[n-1]α取0.3这样既保留了烟雾浓度的变化趋势又不会让瞬时抖动直接触发阈值。真正的误报大头不是噪声而是环境因素的缓慢变化比如灰尘沉积、温度漂移。前面提过自适应基线处理了这部分但还不够。我又加了一个“变化速率判定”逻辑如果浓度值在1分钟内缓慢上升但始终没到报警阈值说明可能是环境积累而非火灾如果浓度在几秒内急剧上升那大概率是真火情。程序里记录每个采样点的变化斜率斜率超过一定值才允许进入报警判断否则只记录预警。这个逻辑帮我挡掉了好几次夏天高温高湿环境下的误报。4.3 报警声光与远程通知联动报警触发后本地执行端要做三件事蜂鸣器持续鸣叫这个选了压电蜂鸣器通过PWM输出2.7kHz方波驱动实测响度达到85分贝、红色LED快闪、无线发送报警帧。同时还有一个继电器输出可以联动电磁阀或排风扇在确认报警后自动切断燃气或启动排烟。继电器驱动用了达林顿管加续流二极管这个细节不能省否则继电器电感反电动势分分钟击穿输出引脚。远程通知是这套系统的亮点。接收主机我用的是另一块单片机板收到报警帧后通过串口转Wi-Fi模块把消息推送到手机。推送通道用的是免费的MQTT协议主题按设备ID区分比如smoke/alarm/01。手机端写了个简单的订阅程序收到消息弹窗报警。为了防网络抖动主机本地还有一块EEPROM用来缓存未送达的消息网络恢复后补发。实测从报警发生到手机收到通知延迟基本在1~3秒关键是链路断了也能靠本地声光和继电器先顶上双保险。5. 实际测试中的问题与调试经验5.1 传感器交叉灵敏度导致的误报测试中最头疼的问题是传感器对油烟和水蒸气的反应。烟雾传感器本质是检测空气中悬浮颗粒油烟颗粒和水雾颗粒同样会散射红外光所以厨房里煎个牛排、卫生间里洗个热水澡都可能触发预警。用标准烟雾测试烟做标定后我用酒精蒸汽、食用油加热油烟、蒸汽发生器三种干扰源做了交叉测试。结果发现蒸汽确实会造成约30%的浓度读数上升但上升速率比真实火情慢很多。针对这个问题我把变化速率判定的权重加大当烟雾浓度上升速度低于每秒2%满量程时即使绝对值超过了报警阈值也只报预警不报报警。这个参数调了很久最开始阈值设成每秒5%结果真实棉绳阴燃火的上升速度也超过了5%果然误报为报警了。后来通过示波器抓取真实燃烧信号看到阴燃火从15%到50%大概用时20秒斜率约1.7%而蒸汽干扰虽然最终能冲到80%但前10秒斜率只有0.5%所以把斜率阈值定在每秒1%左右比较稳妥既不会漏报真火也不会被蒸汽骗过去。5.2 无线信号衰减与天线位置优化无线测试阶段踩过一个深浅坑把报警器装在金属配电箱旁边接收端几乎收不到信号断连率极高。原因很明确金属箱体屏蔽了电磁波433MHz信号根本透不出来。后来我把报警器位置挪到了距配电箱30厘米外的木质墙板上信号强度从-85dBm提升到-65dBm接收率立马上去了。实际安装时一定要避开金属体、大块混凝土梁和紧贴墙体天线尽量垂直朝下可以在天线末端留3-5厘米垂直段因为433MHz鞭状天线的最佳辐射方向是水平面全向垂直布置才能发挥最大的水平覆盖能力。还有一个细节天线周围20厘米内不要有大面积铺铜或排线穿过否则会改变天线等效长度造成失谐。我用矢量网络分析仪量过靠近排线后天线的回波损耗从-18dB恶化到-6dB相当于发了80%的功率但只辐射出去一半。调试时先用网络分析仪把天线调到谐振再到现场做覆盖测试效率会高很多。5.3 长期稳定性测试与功耗实测系统上电测试结束后我在等一个长期的稳定性跑测目标连续运行30天不误报、不宕机。前一周就发现一个问题单片机偶尔会死机指示灯停在一个状态不动。排查了半个月最后锁定是无线模块发送瞬间拉低了电源轨导致单片机某个状态下触发了意外的复位引脚事件。解决方案是把单片机的复位检测时间延长同时给无线模块的电源加了一个软开关发送前先充电到稳定电平再开射频。加了这层保护之后跑了三个月没再死机。功耗实测数据我列一下正常监视状态整机平均电流约3.8毫安传感器0.2毫安、单片机低功耗模式2.1毫安、无线模块待机1.5毫安报警状态含LED和蜂鸣器平均电流约45毫安无线发送瞬间峰值电流120毫安。用两节18650电池约5000mAh供电理论待机时间超过30天这个成绩在持续烟雾监测的场景里是可以接受的。对比一下成品烟雾报警器的功耗它们通常做到微安级待机一颗9V电池用一两年。我这套系统因为带无线和主控功耗肯定高出一个量级但换来了联网能力和远程布防使用场景不太一样。如果要做电池供电的版本后续可以考虑把无线模块改成低功耗的定时唤醒模式只在心跳和报警时让射频上电待机电流能砍到微安级这个优化方向留给有兴趣的开发者自己尝试。最后分享一个兜底技巧测试烟雾报警器时别用打火机直接烧传感器那会把光学迷宫熏黑导致灵敏度永久下降。正确的做法是用一小束棉绳点燃吹灭火焰后让产生的白烟慢慢飘到探测器附近这样既能模拟阴燃火情又不伤传感器。我在发文章前就是靠这个方法反复验证报警阈值和无线链路的可靠性整套系统从设计到落地前前后后改了四版最深的体会是单片机项目七分靠硬件设计三分靠软件打磨每一步踩坑之后把原因记录下来比单纯调通代码值钱得多。
阅读完成 · 觉得有帮助?
咨询建站