报警系统这话题听着老生常谈但真落到“用单片机自己搭一套无线报警系统”这需求上大多数人还是头大。最近就有个做课程设计的同学问我能不能用最便宜的方案做个报警器传感器放在门口主机放在屋里中间隔着一面墙不想拉线。我说可以问题不大但要做到“报警时不误报、不掉链子、能让你放心睡觉”里面的门道远比想象中多。我准备把完整的设计过程捋一遍从无线方案选型、硬件电路搭建、通信协议设计到调试阶段踩过的所有坑和最后的扩展方向一步步拆开讲。这篇内容既适合电子类专业的课程设计、毕业设计参考也适合电子竞赛选手和想自己动手组一套低成本报警装置的 DIY 玩家。原理讲明白代码和接线也会给照着做基本能跑通第一版。文章不会绕太多理论重点放在“怎么做出来”和“为什么这样做”上。如果你已经有一块单片机开发板那剩下的主要工作就是把传感器和无线模块接对线、把协议写稳再花点时间实测验证。1. 为什么报警系统必须无线——三类典型场景与两种系统形态1.1 哪些场景逼得你必须上无线很多人觉得报警器很简单拉两根线不就行了。但真实场景远不是这么回事。先说第一种最常见的需求房间墙体已经装修好门和窗户分布在不同位置你不可能为了装一个探测器去凿墙埋线。拉明线走踢脚线倒是能凑合但时间一长线被小孩扯断、被宠物咬断、被吸尘器挂到系统就变成摆设。无线方案的好处是布防灵活随时换位置不用动装修。第二种场景是多点协同。我帮同学搭的这个需求里从机不止一个大门一个窗户一个阳台推拉门一个。如果每个探测器都往主机拉线光是布线图就能画满一页纸而且故障点会成倍增加。无线方案只需要给每个从机分配一个地址主机统一接收所有节点在逻辑上是一个整体。第三种场景是临时布防。比如军训期间宿舍没人、假期实验室不通风但有贵重仪器这时候你需要的是“今天出门前把设备打开回来之后撤防”的设备而不是固定安装的线路。无线报警的便携性决定了它天然适合这种临时场景。所以结论很直接不是所有报警系统都需要无线但凡是涉及“部署位置分散”“墙体不能破坏”“需要灵活变更布防区域”的场景无线上场就是刚需。1.2 两种系统形态单点直报与多点组网动手之前先明确要做哪种形态这个决定直接影响所有后续选型。第一种是单点直报也叫一对一模式。一个从机检测报警直接发给一个主机主机声光报警。这是最简单的形态硬件上只需要两组单片机加无线模块软件上也不需要考虑地址分配和碰撞。适合一个房间进出门口有人、有人翻窗、或者贵重设备附近有人靠近的场景。第二种是多点组网一个主机对应多个从机。这种形态下每个从机要有独立地址主机要能区分“谁在报警”还要处理多个从机同时上报的冲突问题。从机数量 3 到 6 个是常见区间。报警逻辑上主机收到任何一个从机的报警帧都要立即响应同时显示哪个点位触发。这才符合“系统”这个词的定位。我在实际项目里推荐同学们直接做第二种形态哪怕你目前只需要一个点位。原因很简单课程设计和竞赛评审都更看重系统架构的完整性多点组网虽然多花一点时间但整体价值不是一个单点能比的。而且后面扩展起来不用推翻重来。1.3 先画框图再做器件选型别一上来就买模块这是我自己踩过的最大的坑。很多人拿到题目第一件事是打开电商平台搜模块看到哪块便宜就先拍下来最后发现传感器输出电平对不上、无线模块电压域不同、通信协议不兼容整个项目毫无章法。正确做法是在纸上先用十分钟画一个系统框图。从机包含传感器、单片机、无线模块三块核心主机包含无线模块、单片机、显示、蜂鸣器四块核心。每个框之间标清楚是电平信号还是串口信号、是模拟量还是开关量、电压范围是多少。画出这一步你才知道单片机需要几个定时器、几个外部中断、几个 ADC 通道也才知道无线模块该选什么接口类型。框图里还要标出供电方案每个从机是直接接电源适配器还是电池供电这个决定你的无线模块要不要考虑低功耗模式也决定传感器选型时对静态电流的要求。先把这个问题上想清楚后面 80% 的返工都可以避免。2. 无线通信方案选型——nRF24L01、433MHz、LoRa 还是蓝牙 WiFi2.1 几个常用方案的横向对比无线模块是整套系统里最容易让人纠结的部分市面上常见的方案就那么几个我先列一个实际选型时用的对比表。方案工作频段空旷通信距离发射峰值电流模块成本开发难度典型场景nRF24L012.4GHz100~300m加PA可到1000m13mA左右8~30元中室内多点组网、短距离可靠传输CC1101/433MHz模块433MHz300m~1km30mA左右15~30元中高穿墙较多的场景LoRaSX1278等433/868MHz2~8km120mA左右20~50元高超远距离、低速率上报蓝牙BLE2.4GHz10~50m15mA左右10~20元低手机联动、短距离上报WiFi模块ESP8266等2.4GHz30~100m80mA以上8~15元低需要上云、远程通知的场景这个表里没有绝对的好方案只有匹配不匹配。关键要看三件事距离够不够、功耗能不能接受、开发时间允许多少。报警系统里距离又分空旷距离和穿墙距离这两个概念差别很大后面单独说。2.2 为什么我在这套系统里选 nRF24L01课程设计或者电子竞赛的典型需求是距离 10 到 50 米隔一两堵墙从机数量不超过 6 个整体成本尽量压到百元以内。这个需求下nRF24L01 的性价比确实是最高的。首先是价格优势。一片裸模块几块钱到十几块钱加上 PA 和天线也就二十几块钱对比 LoRa 模块动辄三四十块的成本压力整体方案能省下不少预算。其次是资料丰富度。nRF24L01 是十多年的老芯片了网上中文资料、例程、原理解析一大堆哪怕你完全没接触过 SPI 通信找一个现成的驱动代码改一改也能跑通。第三点是它的通信模式比较灵活。nRF24L01 支持一对多组网通过设置不同的地址和通道可以做到一个主机收六个从机这对报警系统来说非常够用。还有硬件自动 ACK 和自动重发机制这些硬件特性可以减少很多软件层面的补发逻辑。当然它也有明显短板2.4GHz 频段穿墙能力弱如果是钢筋混凝土墙隔个两三堵基本就废了。所以选型时一定要先评估现场墙体情况不能只想着空旷距离。2.3 选型时最容易被忽略的一笔账距离、速率与功耗很多人选模块只看发射功率和标称距离这是最容易出错的地方。nRF24L01 的空中速率是可以调的从 250kbps 到 2Mbps但它不同速率下接收灵敏度差异很大。2Mbps 时灵敏度大概在 -82dBm 左右降到 250kbps 时能到 -94dBm这 12dB 的差距在无线电里意味着可通信距离接近翻倍。所以当你的报警系统出现“离远了就丢包、隔了墙就断连”的时候我建议你先别急着换大功率模块而是把空中速率从 2Mbps 降到 250kbps 试试。代价是每个数据包占用更长的无线时间但对报警系统这种低频次、小数据量的应用来说这点时延完全无所谓。再看功耗。报警系统有两种供电场景一种是插电使用那发射电流 13mA 还是 120mA 都无所谓另一种是电池供电比如门窗传感器放窗边没有插座那发射峰值电流和睡眠电流就是生死线。nRF24L01 的优势在于它可以在发送完成后进入待机模式配合单片机的睡眠从机平均电流能做到非常低。这个我会在最后一章详细讲。3. 硬件搭建——从传感器到无线模块的完整电路设计3.1 元件清单与基础选型下面这套清单是我按“一个主机、两个从机”的典型配置整理出来的预算大约一百元上下非常适合课程设计。器件型号/规格数量说明主控单片机STC89C52 或 STM32F1033片主机1片从机2片具体看熟悉哪款无线模块nRF24L01 模块3个建议买带PA和天线的版本人体红外传感器HC-SR5012个检测有人移动输出开关量问号门磁传感器干簧管磁铁2组门/窗打开时电平翻转设防烟雾传感器MQ-2 或 MQ-71个浓度模拟量输出接ADC显示模块LCD1602 或 OLED SSD13061个显示报警点位和状态蜂鸣器有源蜂鸣器 5V1个报警声音提醒用三极管驱动LED指示灯红色/绿色各若干若干布防状态、报警指示稳压芯片AMS1117-3.33片为无线模块提供干净3.3V电源电阻电容1k/4.7k电阻、100nF、100uF电容一批上拉、驱动、去耦用单片机选型上我建议 STC89C52 优先。理由不是性能强而是教材和例程多哪怕你只学过 51 的基础知识也能快速上手。STM32 当然更好但调试和配置难度更高如果总开发时间有限51 平台足够应对这套系统。3.2 传感器接口怎么接最稳人体红外模块 HC-SR501 是三针接口VCC、GND、OUT。OUT 在检测到有人移动时输出高电平持续一段时间后恢复低电平。这个模块上有两个电位器一个调灵敏度也就是检测距离一个调延时也就是高电平保持时间。接法上要注意单片机引脚默认是高电平还是低电平决定了报警逻辑怎么写。HC-SR501 输出高电平触发所以单片机引脚上可以加一个下拉电阻防止引脚下电瞬间悬空误触发。模块不要正对空调出风口或者暖气片热风流动会产生大量误报这个问题在实装之后相当常见。门磁传感器用的是干簧管把磁铁靠近时触点闭合远离时断开。我建议把它接成常闭信号也就是门关着时 IO 读到低电平门打开时变成高电平。这样做有个好处如果有人把干簧管的线剪断系统会直接报故障不会出现“线断了还静悄悄”的情况。烟雾传感器 MQ-2 是模拟输出也有个数字输出引脚可以调阈值。但 MQ 系列传感器上电初期读数漂移非常大前几十秒甚至几分钟输出都不稳定必须做预热处理。软件层面我建议上电后先连续采集若干次取平均作为基准值后面的读数跟这个基准做差值判断而不是直接用绝对电压值。3.3 电源电路容易被忽视的问题报警系统的故障里一半以上都能追溯到电源问题这不是夸张。nRF24L01 在发射瞬间电流会从几毫安跳到十几毫安如果供电线太长、稳压芯片余量不足电压就会瞬间跌落轻则丢包重则单片机复位。我实际用过的稳定方案是外部 5V 适配器进来先用 100uF 电解电容做输入滤波再过 AMS1117-3.3 稳压到 3.3V输出端再并联 100nF 瓷片电容和 10uF 电容然后才给无线模块供电。位置电容配置作用5V输入侧100uF电解吸收适配器纹波应付瞬时负载3.3V输出侧10uF电解 100nF瓷片稳定纹波滤除高频噪声无线模块供电脚100nF瓷片尽量贴近芯片近距离去耦抑制高频干扰特别提醒一下面包板和杜邦线在这种电流跳变场景下表现很差。杜邦线本身就有接触电阻针脚氧化之后问题更明显。如果你只是在面包板上做验证发现无线模块偶尔“假死”优先怀疑接触不良换一套短杜邦线或者直接焊接到洞洞板上再测。3.4 无线模块布线三原则照着做能少踩一半坑第一无线模块不要和传感器共用一个 IO 电源。HC-SR501 这类传感器在触发瞬间也会有电流波动跟无线发射叠加在一起电压跌落就更严重。给传感器单独一路 5V给无线模块单独一路 3.3V两种电压域分开。第二SPI 线越短越好。nRF24L01 是通过 SPI 接口和单片机通信的SCK、MOSI、MISO、CE、CSN 这五根线如果超过二十厘米信号完整性问题就会开始显现。实测中用二十厘米以上的杜邦线连接偶尔会出现寄存器读回全 FF 的情况而且很难复现排查起来非常折磨。第三天线区域要远离金属和电源变压器。nRF24L01 的 PCB 天线附近如果蹲着一块铜柱、一根金属螺杆或者一个充电器的变压器辐射方向图会被严重改变距离实测能差出一倍多。安装时天线尽量竖起来垂直地面不要贴在金属门框上。3.5 主机声光报警电路报警输出这一块最容易犯的错是让单片机直接驱动蜂鸣器。单片机的 IO 口驱动能力有限有源蜂鸣器平均电流动辄几十毫安直接驱动会拉低 IO 电平严重时整个主板工作异常。正确做法是用一个 NPN 三极管做开关驱动。以常见的 9013 三极管为例蜂鸣器接在 VCC 和集电极之间发射极接地基极串联一个 1k 到 4.7k 的限流电阻接单片机 IO。IO 输出高电平时三极管导通蜂鸣器响IO 输出低电平时截止蜂鸣器停。用 5V 电源和 9013 计算时需要知道蜂鸣器的工作电流假设 30mA三极管放大倍数取 100基极电流只需要 0.3mA 就能驱动那么基极电阻可以取 4.7k 甚至 10k。我用 1k 是为了保证深度饱和压降更小声音更响亮。这个电路同时也能驱动 LED每个支路串一个限流电阻即可。4. 软件设计——可靠的通信协议比单纯调信号强度更关键4.1 为什么报警系统必须有一套自己的数据帧协议很多人拿到 nRF24L01 例程之后就忽略了一个问题例程里收发的是纯数据缓冲区没有任何格式约定。在报警系统里主机要区分“这是哪个从机发来的”“这是心跳消息还是报警消息”“数据内容是什么”没有协议就全乱套。我在这里用的帧结构非常朴素但足够可靠帧头 从机地址 数据类型 数据长度 数据区 校验字节。typedef struct { uint8_t head; // 固定0xAA uint8_t addr; // 从机地址1~6 uint8_t type; // 0x01心跳 0x02报警 0x03撤防 uint8_t len; // 数据区长度 uint8_t data[4]; // 数据区 uint8_t checksum; // 校验值 } AlarmFrame;校验方式我用的是异或校验把所有字节逐位异或得到校验值。这种方式实现简单运算开销极低适合单片机。如果你想更保险可以用累加和或者 CRC8但对报警场景来说异或校验已经能把大部分随机误码识别出来。接收端在处理数据时第一件事不是判断报警类型而是验证帧头、长度范围和校验值。帧头不对的直接丢弃校验不过的丢弃并计数。这一步能过滤掉绝大多数无线干扰产生的垃圾数据。4.2 从机工作流程先确认再上报避免“假报警”从机是整个系统的感知端它的核心逻辑不是“一有信号就发”而是“确认信号稳定之后才发”。我在实际项目里给从机设计了三个状态正常状态、预警状态、报警状态。主机工作频段里从机每隔一段时间发一次心跳帧内容可以很简单就是“我还活着”。心跳的作用是让主机知道从机在线。从机检测到传感器触发后不立刻上报而是进入一个持续确认的过程比如连续三次采样隔一百毫秒采样一次每次都保持触发状态才确认为有效报警并打包发送。为什么要连续确认因为人体红外传感器对热源移动很敏感一个从窗外跑过去的猫、一片晃动的窗帘都可能让传感器输出一个短暂的高电平。如果第一次触发就发报警帧主机会频繁误报很快你就想把这个系统关掉了。连续确认牺牲的只是几百毫秒的响应时间换来的却是整体可信度的大幅提升这笔账非常划算。从机发送报警帧之后并不是发完就完事了它要等待主机的 ACK 确认。收到 ACK 说明主机收到并处理了这条报警从机可以把报警状态清除恢复正常心跳。如果超时未收到 ACK就进入重发流程。4.3 主机工作流程接收、校验、超时判定主机的工作就是三个字收、判、报。初始化后主机处于接收模式并打开所有数据通道任何从机发来的数据都会被收到。收到一帧数据之后先做协议过滤通过校验的帧再进入状态机如果是心跳帧更新对应从机的最后心跳时间如果是报警帧立即点亮对应点位的 LED、驱动蜂鸣器并刷新显示器上的报警位置如果是撤防帧则关闭该从机的报警逻辑。掉线检测是报警系统必须做的功能。从机心跳周期如果设置成 30 秒主机可以设置一个 90 秒的超时阈值也就是连续三个心跳周期没收到这个从机的任何数据就判定该从机离线在显示器上给出离线警告。for (uint8_t i 0; i NODE_COUNT; i) { if (now - last_heartbeat[i] HEARTBEAT_TIMEOUT) { node_state[i] STATE_OFFLINE; } }阈值为什么取 90 秒而不是 60 秒这个细节很关键。无线环境是会有偶发丢包的如果 60 秒超时一次 2.4GHz 频段的瞬时干扰就可能让主机误报离线。阈值放宽到 90 秒可以容忍丢两个包整体系统稳定性高很多。4.4 用 nRF24L01 的硬件自动重发机制兜底软件层协议之外nRF24L01 自带一个非常实用的硬件特性自动 ACK 和自动重发。启用自动 ACK 后发射端每发一个数据包接收端硬件会自动回复一个 ACK 包给发射端。如果发射端没有收到 ACK硬件会自动重发最多次数和重发间隔都可以配置。初始化时我一般这样配NRF_WriteReg(REG_EN_AA, 0x01); // 使能通道0自动ACK NRF_WriteReg(REG_SETUP_RETR, 0x2A); // 重发10次间隔500us NRF_WriteReg(REG_RF_CH, 40); // 信道40 NRF_WriteReg(REG_RF_SETUP, 0x0C); // 250kbps, 0dBm发送完成后通过读取 STATUS 寄存器判断结果。如果 TX_DS 位置位说明数据发出且收到了 ACK如果 MAX_RT 置位说明自动重发用尽了还是没收到 ACK这时候就需要应用层做补偿处理。uint8_t status NRF_ReadReg(REG_STATUS); if (status (1 4)) { NRF_WriteReg(REG_STATUS, (1 4)); // 清MAX_RT标志 return RETRY; // 上层决定是否再补发 } if (status (1 5)) { return OK; // TX_DS对端已确认 }应用层的补发次数我建议限定在三次每次间隔两百毫秒。不要无限重发否则多个从机同时出问题时会互相抢占无线信道。补发三次还失败就应该把报警信息保存在从机本地等下一次心跳周期再尝试发送。报警系统最怕的是“数据淹没”链路拥堵比链路断掉更麻烦。5. 调试阶段踩过的坑——无线不出数先查这三个地方5.1 最大的坑供电不稳导致无线模块“假死”这是我在调试过程中遇到的最诡异的问题没有之一。现象是这样的程序下载正常SPI 读写单独测试也正常但一发数据就死读寄存器读不出任何内容。一开始以为是程序问题代码检查了三遍都没有发现逻辑错误。后来用万用表测模块 VCC 才明白问题出在供电上。模块发射瞬间电流拉高供电电压瞬间从 3.3V 掉到 2.7V已经低于模块的最低工作电压。原因有两个接线的杜邦线太长太细形成了压降面包板供电轨的接触电阻本来就大电流一跳就撑不住。解决方法是把供电线换成粗短的飞线或者在模块供电脚旁边就地补一个 100uF 电容。这个电容的作用是储能缓冲发射瞬间优先从电容取电电压跌落幅度能明显缩小。以后再遇到“模块间歇性假死”我强烈建议先测供电再查代码。5.2 SPI 回读全是 0xFF 或 0x00先查时钟极性和相位nRF24L01 用的是 SPI 接口它的时序要求比较严格。这里有个非常典型的坑nRF24L01 的 SPI 要求时钟极性 CPOL0、时钟相位 CPHA0也就是 SPI Mode 0。如果你用的是 STM32 的硬件 SPI没有把极性配成 Mode 0或者用的是 GPIO 模拟时序但时钟空闲电平拉高了寄存器回读就会全是 0xFF怎么读都是错的。排查这个问题有个很简单的办法读 nRF24L01 的 SETUP_AW 寄存器它的默认值是 0x03。如果读出 0x03说明 SPI 时序没问题如果读出 0xFF基本可以断定是 SPI 配置错了不用怀疑模块坏了。另外还要注意一个细节用 GPIO 模拟 SPI 时数据要写在时钟边沿之前还是之后用 MOSI 数据线和 SCK 的相位关系一定要严格按照 “数据在上升沿写入” 的方式来写代码。很多移植例程失败都栽在这个细节上。5.3 距离一远就丢包降低空中速率、避开 WiFi 信道如果你在第一米距离测试时通信正常但拉远到十几米或者隔了一堵墙之后丢包率急剧上升多半不是硬件故障而是配置层面的两个问题。第一个是空中速率太高。我在前文提过nRF24L01 在 2Mbps 下的接收灵敏度远不如 250kbps。把速率降到 250kbps实测有效距离能提升一倍左右这是最立竿见影的优化。报警系统数据量极小200kbps 和 2Mbps 的速率差异完全感知不到但距离差异非常明显。第二个是信道冲突。2.4GHz 频段非常拥挤WiFi 路由器和蓝牙设备都呆在这一带。nRF24L01 有 125 个可选信道但很多人用默认信道信不信附近只要有人开了WiFi你的模块就会无缘无故丢包。WiFi 的主要信道集中在 1、6、11 附近对应 2.4GHz 频段的低中高区域。我习惯把报警系统的 RF_CH 配置到 40 到 80 这个区间避开 WiFi 的主用频率。另外有条件的话可以写一个简单的信道扫描程序依次看哪个信道的噪声底最低就把通信信道设在那个位置。5.4 现场验证方法双机回环测试和长时间日志所有调试的最后一步都是验证。我建议每个从机在正式接入系统之前先做一次双机回环测试。方法是把从机模块作为发射端主机模块作为接收端两个模块放在一米距离以内发送一组已知数据。通过串口把主机接收到的内容打印出来和原始发送内容逐字节对比。距离再逐渐拉远每移动几米观察一次误码情况记录丢包率。如果在二十米的距离内丢包率低于百分之零点几就可以放心部署了。部署完成之后非常重要的一步是长时间打压测试。报警系统好不好用不是靠你调通那一刻判断的而是靠连续运行数据说话。我习惯让系统连续跑四十八小时每隔几小时看一次串口日志统计误报次数、掉线次数和延迟情况。这些数据比任何理论分析都直观也是你向课程设计评委或者指导老师展示系统可靠性的最好材料。6. 从课程设计到能落地——三个值得考虑的功能扩展6.1 扩展方向一短信通知模块彻底摆脱局域网依赖本地声光报警的缺点是你不在现场就听不见。想解决这个问题最简单可行的方案是给主机接一个 GSM 模块报警触发时直接发短信或者拨号到设置好的手机号码。GSM 模块的接线不复杂一般通过 UART 串口和主机通信发送 AT 指令就能完成短信和通话功能。真正要注意的是供电GSM 模块在拨号或发送短信瞬间峰值电流能到 2A普通 AMS1117 稳压完全带不动必须单独用大电流降压电路或者直接用手机电池供电模块供电。这是很多人把 GSM 模块烧坏的原因。短信报警的发送频率也需要控制。我见过有人把报警逻辑写成“每隔几秒发一条短信”结果手机收到二十多条轰炸式信息而且 GSM 模块长时间处于高负荷工作状态。正确的做法是同一点位同一事件持续报警期间只在触发时刻发送一条短信之后没隔一段时间比如十分钟确认一次直到撤防。这类实现方案在实装时要注意信号覆盖问题地下车库、地下室这类场景 GSM 信号可能很差短信通知的可靠性会大打折扣需要提前测试。6.2 扩展方向二ESP8266 上云远程状态一手掌握如果家里本来就有稳定的 WiFi 网络那么用 ESP8266 模块把主机接入局域网再通过 MQTT 协议把报警信息推到云端或者手机客户端体验会比短信方案好很多。硬件上ESP8266 模块通过串口和主机单片机相连主机在报警发生时向 ESP8266 发送一条 JSON 格式的消息ESP8266 负责把消息通过 WiFi 网络发到服务器或者云平台。这个思路可以让整个系统从一个孤立的局域网设备变成物联网设备。手机端的远程通知可以实现也可以加一个简单的控制按钮实现远程布防和撤防。这些功能听起来复杂实际上调试的思路类似串口收发、协议解析、状态判断跟前面无线报警的底层逻辑是共通的。给主机的串口通信也设计一套简单的指令协议比如“A”表示布防、“S”表示撤防这样后续扩展时不用改主体程序。设计上我还是建议把本地声光报警作为绝对主线。云通知再稳定也依赖网络这个不确定因素一旦路由器重启、宽带断线远程通道就废了。要有“云断了本地依旧有声光报警”的闭环思路。6.3 扩展方向三低功耗从机设计让电池活得更久最后一个扩展方向也是我觉得最有实际价值的一个把从机做成真正可以电池供电的低功耗设备。之前提到的从机如果做成门磁传感器贴在窗户边根本没地方插电源只能靠电池。而门磁和人体红外这类传感器平时是不需要持续工作的绝大部分时间处于待机状态只有在门被打开、人移动时才有必要唤醒单片机。低功耗的核心思路是“能不干活就不干活”单片机平时进入睡眠模式用一个定时唤醒源每隔三十秒醒来一次发一个心跳帧然后继续睡。传感器触发用外部中断唤醒触发瞬间立刻进入报警程序。选型上STM32 的 L 系列或者带 RTC 和多个低功耗模式的单片机比基础款 51 更合适因为 51 的睡眠电流和唤醒开销都偏大。如果不想换单片机也可以考虑给从机的无线模块在非发送时段关电源用 GPIO 控制一个 P 沟道 MOS 管只在通信时给模块供电这样静态电流能降到微安级别。无线模块的发射功率也可以降。配置成最低功率档比最高功率档平均省下不少电流别总是习惯性打满功率——近距离使用时根本用不着省下来的每一毫安都意味着电池寿命变长。我做这种系统的最大体会是报警系统调到“能报警”很容易但调到“关门不误报、出门不担心漏报”至少要花一倍的时间。很多问题都是部署到现场才会暴露的比如把红外探头对着空调出风口比如门的金属门框影响了无线天线比如墙角那台路由器和你的通信信道撞到了一起。所以我一直建议所有做无线报警的朋友在正式投入使用之前至少连续跑四十八小时记录误报次数和丢包率用串口把状态日志导出来一遍一遍看。“能报警”是功能问题而“可靠地报警”是产品问题后者才真正值得花时间打磨。这套系统的价值不在于它用了多高级的芯片而在于它能在你需要的时候不骗你。