ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

STM32+UWB模块自制无感解锁系统:从测距到门锁联动

2026/9/4 4:34:40 拓冰建站 浏览量
STM32+UWB模块自制无感解锁系统:从测距到门锁联动 开门这个动作大部分智能锁其实还没有真正“无感”。指纹锁要抬手按指纹人脸锁要在门前站定等识别手机蓝牙锁虽然不用掏钥匙但在门口等蓝牙回连、反复校准位置的时候我自己是经历过几次“罚站”的。UWB超宽带技术把这件事往前推了一大步用厘米级测距判断“你是不是真的站在门前”而不是简单判断“你在不在附近”。这也就是标题里“无感解锁”的核心逻辑。这次我们不聊量产车规级的 UWB 数字钥匙方案而是聊一个更硬核的方向用 STM32、DWM3000 这类容易买到的 UWB 模块自己搭一套“走近自动开门、离开自动上锁”的原型系统。整个项目不是跑 AI 模型也不是堆显存它更像一个嵌入式软硬件结合工程涉及高精度测距时序、天线布局、低功耗策略、门锁机构联动、多标签白名单管理以及最容易被忽略的安全边界问题。如果你手里已经有 STM32 或者 ESP32 的开发板想在门禁、储物柜、工位电脑、电动车这类场景里加一个“人来了就解锁、人走了就锁定”的能力这篇文章可以整理好思路再动手。1. UWB 无感解锁解决什么问题先还原一个典型场景。你带着钥匙扣或者手机走到办公室门禁前不需要拿出任何设备也不用把脸凑到某个特定位置门锁在你走到门前 1 米内自动弹开。离开 2 到 3 米后门锁自动复位。整个过程由门锁侧的系统主动发起测距而不是手机 App 在前台点击按钮。这个需求用传统无线方案也能做一半。比如蓝牙 RSSI 测距芯片成本低、生态成熟但 RSSI 受环境影响很大人挡住、手机天线方向变化、周围有多台蓝牙设备信号强度都可能跳变。直接拿 RSSI 阈值做开锁容易出现“还在走廊就被解锁”或者“站在门前却不触发”两种极端。红外人体传感器只在“检测到人”这个层面有效无法区分人站在门外还是已经走到门内也无法区分你是在门口等人还是在掏钥匙。如果家里还有宠物误触发概率就更高了。UWB 的价值在于时间测距。UWB 信号是纳秒级的窄脉冲带宽大、时间分辨率高可以通过测量信号在设备之间的飞行时间算出距离。典型 UWB 测距精度可以做到 10 到 30 厘米级别比蓝牙 RSSI 稳定得多。再加上 UWB 脉冲本身抗多径干扰能力较强在室内复杂环境下比蓝牙更容易拿到稳定的距离值。方案典型测距/感知方式优点主要不足蓝牙 RSSI根据接收信号强度估算距离成本低、生态好信号波动大阈值不好设红外/微波雷达检测人体存在或移动安装简单不能区分“门内门外”会误触发指纹/密码锁明确身份认证安全级别可控不是无感需要主动操作人脸视觉方案摄像头图像识别有身份识别能力需要算力、可能涉及敏感图像信息UWB 测距测量信号飞行时间换算距离厘米级、抗中继能力强、稳定硬件成本和功耗相对较高V2X 数据采集、UWB安全支付、UWB数字钥匙在车规产品里已经有很多验证。Apple 的 AirTag、部分手机厂商的“数字车钥匙”都是用 UWB 做空间感知的典型方向。自己做一套目的不是和车规量产方案比安全性而是把“高精度测距”这套链路真正跑通理解它的时序和工程边界。2. 核心能力速览与项目定位自制 UWB 无感解锁系统本质上包含两大部分一个随身携带的“标签”Tag可以是 UWB 模块加电池也可以是 UWB BLE 组合钥匙扣。一个固定在门侧的“锚点”Anchor负责持续监听标签、发起测距、控制门锁继电器或电子锁。锚点侧可以单独用 STM32 系列主控连接 UWB 模块也可以直接使用带 UWB 收发器的综合开发板标签侧同理会尽量做小体积、低功耗。两者通过 UWB 物理层完成双向测距门锁控制器根据距离变化决定是否开锁。下面是这个项目的整体能力速览能力项说明项目类型嵌入式硬件自制项目非 AI / 云端应用核心技术UWB 双向测距SS-TWR / DS-TWR可选到达角定位常用模块方向DWM3000 系列 UWB 模块 STM32/ESP32 等主控无线方式UWB 测距为主BLE/Wi-Fi 可作为低功耗唤醒或网络上报显存 / GPU 需求无不涉及 CUDA、PyTorch 等深度学习依赖接口开放性门锁状态可通过串口、MQTT 或 HTTP 接口转发具体需按自建平台调整批量扩展性支持多标签白名单、多门禁统一管理需额外做后台主要交付效果走近自动解锁、离开自动上锁、合法标签可注册可注销适合开发基础掌握 C/C、GPIO、SPI/UART 基础即可入门需要特别说明项目不存在“显存占用”这个维度。真正需要重点观察的是测距延迟、刷新频率、UWB 收发功耗、主控负载、天线摆放位置和距离抖动。3. 适用场景与使用边界这个自制方案比较适合下面几类场景家庭室内门或老式电控门改造门锁已经支持电控开锁UWB 锚点只需输出一个开关信号。办公室小型门禁原型给团队内部做一个“进门不用刷工卡”的体验验证整体成本比采购整套商业门禁低。电动自行车、储物柜、工具柜解锁使用场景相对固定对 UWB 测距距离要求不高。室内定位和机器人跟随项目的前置实验把 UWB 定位用在“某个人出现在某个区域”的触发逻辑里。它不适合什么场景不适合一上来就替代银行金库、汽车防盗等高安全级别的门禁。自制 UWB 解锁要做安全难度其实很高需要补上加密通信、防重放、防中继、设备白名单离线分发、异常告警等一系列设计。如果只是把模块接上继电器就对外宣称“UWB 无感汽车门禁”那风险非常大。使用边界也要提前问清楚。UWB 测距只是告诉你“标签距离锚点多少厘米”它不负责判断这个人是否被胁迫、是否带着标签但手机被劫持。如果门锁开锁逻辑里完全没有身份认证之外的第二道校验只要合法标签出现在有效距离内门就会开。安全与合规提醒要写清楚自制项目只能用于你有授权或自己拥有的设备不要试图帮别人“绕过”门禁更不要用高精度测距技术未经许可追踪他人位置。UWB 定位能力越强越应该约束在合法、授权、隐私保护边界内使用。4. 硬件选型与环境准备4.1 主控与 UWB 模块选型目前自己动手做 UWB 测距最常接触的模块是 Qorvo 的 DWM1000 / DWM3000 系列以及部分国产 UWB 芯片模组。DWM3000 系列通常内置天线、晶振和射频匹配电路外部主控通过 SPI 接口操作即可拿到测距结果。第一版不建议直接手工焊接 UWB 裸芯片高频电路布局对天线净空区、电源去耦要求很高焊好也未必能稳定工作。主控部分常见选择有两种STM32 系列例如 STM32F103C8T6、STM32F407VET6。优点是资料多、SPI 外设可靠、可以通过 STM32CubeMX 快速生成工程适合做“锚点/门锁控制器”侧开发。ESP32 系列。优点是自带 Wi-Fi/BLE方便把测距结果上报到局域网或用 App 调参缺点是本身功耗偏高做小体积随身 Tag 需要额外考虑省电策略。UWB 系统一般分成锚点和标签两种角色。设计时要提前决定谁做 Tag谁做 Anchor还是两块板都通过切换角色来支持双向测距。第一版建议固定角色。4.2 开发环境准备清单嵌入式开发环境围绕主控来搭建。工具用途说明STM32CubeIDE 或 Keil MDKSTM32 固件开发生成工程、烧录、调试Arduino IDE 或 PlatformIOESP32 / Arduino 兼容板开发社区库丰富上手快ST-Link / J-LinkSTM32 程序下载与在线调试建议多备一个USB 转 TTL 串口模块查看调试日志 / 测距数据输出模块本身常自带串口功能视型号而定万用表 / 稳压电源检查供电、测量静态与工作电流排查异常时必备开发之前先把模块的数据手册和 Demo 例程跑通。不要一上来就写“无感解锁”完整逻辑而是先用官方示例程序验证两块开发板能不能互相测距。这一步成功后面做门锁联动才有基础。4.3 电路连接注意事项UWB 模块一般通过 SPI 与主控通信同时可能还需要一个中断引脚。DWM3000 这类模组通常还需要一个 GPIO 做复位或唤醒控制。具体引脚功能以你所选模块厂家提供的数据手册为准这里给一个通用接线规划参考主控引脚功能连接方向SPI_SCKSPI 时钟主控 - UWB 模块SPI_MOSISPI 数据输出主控 - UWB 模块SPI_MISOSPI 数据输入UWB 模块 - 主控SPI_CSSPI 片选主控 - UWB 模块GPIO_IRQ模块中断请求UWB 模块 - 主控GPIO_RST复位控制主控 - UWB 模块电路上要注意电平匹配。UWB 模块通常工作在 3.3V如果主控使用 5V 供电SPI 引脚不能直接接 5V 逻辑。门锁继电器驱动最好用隔离或者驱动管方案不要直接用主控 GPIO 硬推大电流继电器否则主控很容易复位。4.4 门锁机构准备UWB 无感解锁系统的最终执行机构是门锁。如果你只是做原型验证不想破坏家里门锁可以先用一个 12V 电磁锁 继电器 开关电源搭一个桌面测试台。后期再移植到实际的门锁或者电动自行车锁上。电控锁建议选择“断电开锁”还是“上电开锁”要根据实际场景决定。家里阳台门、办公室门禁通常用断电开锁的电磁锁因为火灾等紧急情况下断电会自动打开。如果做保险柜或者需要防误开的柜门则要选择上电开锁并且搭配机械应急开锁方式。这个设计决策比 UWB 测距本身更重要。5. 系统整体工作流程整套系统在软件上可以简化成这样一个状态机锚点上电后系统默认处于“锁定”状态。锚点周期扫描环境中是否有已注册的 UWB 标签。扫描到标签后向标签发起双向测距得到一个距离值。对连续多次的距离值做滤波处理。当距离低于“解锁阈值”并维持一定次数后说明人确实走到了门前。锚点驱动继电器或者电子锁控制器执行解锁。标签距离超过“上锁阈值”并持续一段时间后锚点执行闭锁。这里有两个非常关键的细节。第一解锁阈值和上锁阈值必须分开。如果都用同一个值比如 1 米。人在 1 米边缘来回挪动时系统有可能在“开锁 / 闭锁”之间反复切换继电器频繁通断是灾难。所以解锁阈值建议设置在 0.6 到 1 米上锁阈值设置在 2 到 3 米中间留出滞回区间。第二不能只看单次距离就开锁。UWB 测距虽然比蓝牙稳定但仍可能在某一帧受遮挡或多径影响发生跳变。连续 N 次测距都低于阈值比单次触发可靠得多。N 的取值需要平衡体验和稳定N 太大会让人站在门前还要等很久太小又容易误触发。“UWB雷达”这个词在部分材料里也常出现它指的是用 UWB 信号感知人体存在或运动状态。如果你后续想增加“门内有人时不闭锁”“门外长期徘徊时告警”这类功能可以在 UWB 测距基础上再叠加雷达回波状态分析。6. 固件开发与测距逻辑6.1 双向测距的基础理解UWB 测距最基础的方法是单边双向测距但晶振误差会直接影响测量结果。自制项目建议使用双边双向测距通常叫 DS-TWR。一次典型的 DS-TWR 流程是这样Tag 发出 Poll 帧Anchor 收到后延迟固定时间发出 Response 帧Tag 收到 Response 后再次发出 Final 帧。在整个过程中双方都记录各自的发送和接收时间戳。最终可以算出信号在两者之间的飞行时间再乘上光速得到距离。实际开发时模块厂商的 SDK 通常把测距协议封装好了。我们主要面对的是初始化、配置信道、配置身份标识然后调用测距接口。这里用一段示意代码描述距离计算思路不能直接编译需要替换为所购模块 SDK 提供的时间戳接口。// 示意代码DS-TWR 距离计算逻辑需结合模块SDK的实际接口 #include stdint.h // 这些时间戳由UWB模块在收发中断中记录 typedef struct { uint64_t t_poll_tx; // Poll 发送时间 uint64_t t_poll_rx; // Poll 接收时间 uint64_t t_resp_tx; // Response 发送时间 uint64_t t_resp_rx; // Response 接收时间 uint64_t t_final_tx; // Final 发送时间 uint64_t t_final_rx; // Final 接收时间 } uwb_timestamp_t; float uwb_calculate_distance_cm(const uwb_timestamp_t *ts) { // 根据时间戳计算飞行时间 // tof (Tround1 * Tround2 - Treply1 * Treply2) / // (Tround1 Tround2 Treply1 Treply2) uint64_t t_round1 ts-t_resp_rx - ts-t_poll_tx; uint64_t t_reply1 ts-t_resp_tx - ts-t_poll_rx; uint64_t t_round2 ts-t_final_rx - ts-t_resp_tx; uint64_t t_reply2 ts-t_final_tx - ts-t_resp_rx; // 晶振频率决定时间戳单位这里需要换算成实际秒 float tof (float)((t_round1 * t_round2) - (t_reply1 * t_reply2)); tof / (float)(t_round1 t_round2 t_reply1 t_reply2); // 光速约为 0.0299792458 cm / ps 或按时间戳单位换算 // 此处只列公式实际换算系数需按模块时间戳精度调整 float distance_cm tof * SPEED_OF_LIGHT_CONSTANT; return distance_cm; }在 STM32 UWB 工程中你更常做的是丢一个uwb_start_measurement()进去等待 IRQ 中断然后从 FIFO 或寄存器里读测距结果。无论如何理解 DS-TWR 的时序都能帮你排查“为什么测距结果明显偏大/偏小”。6.2 滤波与阈值判断距离数据从 UWB 模块出来之后不要直接拿来做开关量。我的建议是先维护一个滑动窗口窗口大小 5 到 10 帧。每来一个新距离扔掉最旧的一个值然后对窗口内的数据做排序取中位数或者先剔除最大值最小值再取平均。为什么用中位数而不是全平均因为 UWB 偶尔会冒出一个极大或极小的野值平均值会把野值带偏中位数对少量野值更稳定。下面是简单的窗口滤波示意#define DIST_WINDOW_SIZE 5 float dist_window[DIST_WINDOW_SIZE]; uint8_t dist_index 0; float uwb_filtered_distance(float new_dist) { float sorted[DIST_WINDOW_SIZE]; dist_window[dist_index % DIST_WINDOW_SIZE] new_dist; dist_index; for (uint8_t i 0; i DIST_WINDOW_SIZE; i) { sorted[i] dist_window[i]; } // 冒泡排序取中位数嵌入式数据量小时足够用 for (uint8_t i 0; i DIST_WINDOW_SIZE - 1; i) { for (uint8_t j i 1; j DIST_WINDOW_SIZE; j) { if (sorted[j] sorted[i]) { float tmp sorted[i]; sorted[i] sorted[j]; sorted[j] tmp; } } } return sorted[DIST_WINDOW_SIZE / 2]; }再往下就是门锁状态判断。建议用一个递增计数来做“连续满足条件才动作”uint8_t unlock_confirm_count 0; void door_control_loop(float dist_cm) { if (door_is_locked()) { if (dist_cm 80) { unlock_confirm_count; if (unlock_confirm_count 3) { door_unlock(); unlock_confirm_count 0; } } else { unlock_confirm_count 0; } } else { if (dist_cm 250) { lock_confirm_count; if (lock_confirm_count 3) { door_lock(); lock_confirm_count 0; } } else { lock_confirm_count 0; } } }这里的 80 厘米、250 厘米只是示例实际要根据你家门廊宽度、UWB 天线安装位置重新标定。加了这段状态判断后即使瞬时距离抖动门锁也不会被单帧数据骗开。6.3 标签白名单与身份管理UWB 测距只能判断距离。距离小于阈值的人是合法的吗如果是陌生人带着自己做的 UWB 标签靠近你的门理论上也能进入测距流程。因此无感解锁系统必须维护一个标签白名单。每块 UWB 模块都有唯一的 64 位或者 128 位标识在出厂时写死或者可以在初始化后设置。锚点初始化时把合法标签 ID 存到一个表里。测距之前先解析和校验标签 ID不在列表里的标签直接忽略。这样做的好处是即使被人使用自制的仿冒标签扫到门口也不会触发解锁。白名单可以存储在 STM32 的内部 Flash 中也可以用一个外部 I2C EEPROM 保存多条记录。开发阶段先做成固定数组更直观typedef struct { uint64_t tag_id; char owner_name[16]; uint8_t enabled; } tag_entry_t; tag_entry_t allowed_tags[] { {0x1122334455667788, owner_1, 1}, {0x99AABBCCDDEEFF00, owner_2, 1}, };如果将来要给朋友临时开门可以通过串口命令或者手机小程序动态增删白名单而不用重新烧录固件。6.4 主控实现注意点实时测距和门锁控制放在同一个 MCU 上时务必注意不要让重型任务阻塞 UWB 的中断响应。不要在中断回调里做 Flash 擦写、延迟等待、串口打印大量日志。常见的结构是中断回调里只读时间戳、置事件标志主循环再统一处理测距、滤波、状态机和门锁控制。如果你用的是 ESP32因为有较复杂的协议栈和 Wi-Fi 共存逻辑UWB 测距中断服务要设置合理优先级长期运行时要重点测试会不会因为 Wi-Fi 活动导致 UWB 数据传输超时。7. 联调与功能验证功能验证建议分三个层级进行跳过任何一层都容易在后期排查时来回返工。7.1 第一层固定距离稳定性测试把锚点固定在桌面或门框上标签放在距离锚点 0.5 米、1 米、2 米、3 米的位置。每个位置静止测试 1 到 2 分钟。通过串口把每次测距结果输出到电脑并记录。判断标准是滤波后的距离稳定在真实距离附近不出现周期性的大幅跳变。如果某个固定位置距离值频繁跳变大概率不是软件滤波问题要检查天线朝向、环境遮挡和附近金属反射。UWB 模块天线区域前不要放金属板或大面积导线模块最好贴在非金属外壳上并且让天线面正对走廊方向。7.2 第二层阈值与滞回测试把标签从 3 米外慢慢向门移动。观察当距离低于解锁阈值时系统是否在预期位置自动解锁。再从门前慢慢向后退观察系统回到上锁状态的位置。可以用一张表记录多次测试结果测试序号开锁触发距离上锁触发距离是否出现抖动备注1实测记录实测记录是/否例如天线斜对2实测记录实测记录是/否例如手握住模块时3实测记录实测记录是/否例如门关闭状态如果出现自动开锁后马上又闭锁说明开锁和上锁阈值区间太小需要调大滞回范围。7.3 第三层真实进门场景模拟模拟人从走廊走到门前、停留、进门、离开的完整过程。重点观察三个指标人在门前停留时是否只解锁一次。人站在门内但靠近门的位置时系统是否错误闭锁。陌生人没有标签时系统是否完全忽略。真实场景测试不要只做一次。UWB 受到人体遮挡、门体开合角度、金属钥匙链位置等因素影响很大。标签放在裤袋、背包、手机壳三种位置都要各测一轮。7.4 常见失败现象定位如果在实际验证中“门锁不动作”不要先怀疑密码或者电机驱动先按链路倒着查标签是否被锚点识别串口日志里目标距离是多少距离值是否低于解锁阈值阈值触发计数是否达到开锁要求门锁控制引脚的 GPIO 状态是否翻转继电器是否供电、门锁是否适配 12V/24V 驱动大多数 UWB 无感解锁原型做不出来不是测距算法的问题而是门锁供电或 GPIO 驱动能力出了问题。所以桌面测试台上先把继电器点动测试跑通再接大电流门锁。8. 接口、批量门禁与自动联动UWB 无感解锁只是门禁闭环的一部分。你大概率还想把解锁记录、标签权限、设备状态接入到已有的管理系统里。这块能力取决于你自建的网络层不同的实现会有差别。8.1 串口输出与事件上报最简单的方式是让锚点通过串口输出结构化事件便于外接网关或电脑端读取EVT_DOOR_OPEN tag_id1122334455667788 dist_cm65 time20241001 12:00:01 EVT_DOOR_LOCK tag_id1122334455667788 dist_cm300 time20241001 12:02:10外部网关收到这类日志后可以转发到自己的数据库或企业微信/钉钉通知机器人。8.2 HTTP API 联动示例如果锚点或网关已经接入局域网可以在门锁执行开锁的同时向本地服务发送一个 HTTP 请求。下面是一个通用的 Python 示例请求路径需要按你自己的后端实现调整import requests import time def report_door_event(door_id: str, event: str, tag_id: str): # 示例接口实际项目请替换为自建服务地址 url http://192.168.1.100:8080/api/v1/door/event payload { door_id: door_id, event: event, # door_open / door_lock tag_id: tag_id, timestamp: int(time.time()), } try: response requests.post(url, jsonpayload, timeout5) response.raise_for_status() except requests.RequestException as exc: # 记录失败日志并做好重试不要因为网络问题阻塞门锁主流程 print(report event failed:, exc)需要特别注意的是网络请求失败不能阻塞门锁本身的执行。应该在门锁动作已经成功后再把事件放到发送队列里异步上报。8.3 多门禁与多标签批量管理当你有多个门、多个标签时最值得做的是一个小的设备管理后台。后台维护两个维度门禁列表每个门对应一个锚点 ID。标签列表每个标签注册到多个门禁白名单中。批量任务设计上不必做得太重。用一个本地 SQLite 数据库或者 JSON 文件提供标签注册、生效时间、过期时间、解绑门禁四个操作即可。每次固件启动时要么从后台拉取白名单要么由后台生成加密配置文件下发到锚点。这样做的好处是新增一个访客标签不需要走到每扇门前去烧写固件后台下发一次配置就能生效。批量撤销某个标签时也可以一次性把状态同步到所有门禁。8.4 接口服务要加认证UWB 模块做的是物理层测距网络层还是要有访问控制。自建 HTTP API 不要裸奔在公网至少要加 API Key 或 Token。刷门禁记录、临时授权这种操作后台必须能识别操作人身份。涉及个人进出记录的信息属于比较敏感的数据不要随意采集长期保存。如果项目在公司内部使用需要先确认是否符合公司隐私和安全管理规范。9. 性能优化与功耗观察UWB 无感解锁属于低功耗无线 嵌入式门禁结合体性能观察重点和 AI 项目完全不一样。9.1 测距延迟与刷新频率从 UWB 发起测距到锚点拿到距离值中间有一个完整帧交互过程。测距值更新频率主要受标签广播间隔、锚点测距调度和通信负载影响。如果是两三个标签轮流测距单轮测距时间通常很短端到端延迟主要消耗在调度安排和滤波窗口上。调低测距频率可以降低功耗但会拖慢“人走到门前自动开锁”的响应速度。调高测距频率又能提升响应速度但功耗和无线占用会变大。第一版建议先把测距频率设为 10 到 20 Hz也就是每秒钟更新 10 到 20 次距离观察延迟和功耗是否可接受。9.2 功耗测量方法用万用表串联供电回路分别测标签空闲状态、测距状态、开门动作瞬间的平均电流。较专业的做法是使用电流探头配合示波器观察瞬态波形。不要凭着主控手册上的理论电流估算整机功耗UWB 模块收发瞬间电流可能明显高于主控平均电流。9.3 低功耗设计方向UWB 持续收发耗电并不低随身标签不能一直满功率工作。常见的做法是给标签加一个低功耗唤醒源例如 BLE 广播、加速度计运动检测或者定时唤醒。标签默认睡眠只有被唤醒后才进入 UWB 测距模式。锚点侧因为是门锁供电功耗压力小很多可以一直保持测距接收状态。锚点要关注的是主控上电稳定性不要让 UWB 模块收发时的瞬态电流把电源拉低到 MCU 复位阈值以下这种“上电正常、测距就重启”的问题在自制项目里很常见。9.4 天线与安装位置对性能影响UWB 信号虽然抗多径性能好但天线前有金属或大面积接地平面时辐射方向图会变形。门锁锚点如果嵌在铁质门框里测距范围可能明显缩小。建议先做一个简单的天线净空实验模块背后留出一定空间不要贴死金属然后比较无遮挡和遮挡状态下的测距效果。10. 常见问题与排查方法问题现象可能原因排查方式解决方案串口没有测距数据输出模块 SPI 接线错误或供电异常检查电源电压、SPI 引脚连接、模块复位时序先跑模块官方 Demo排除接线问题测距结果随机跳变环境多径反射或天线被遮挡固定标签观察距离曲线检查天线附近是否放金属增加滤波窗口、调整天线位置、减少遮挡距离值整体偏大DS-TWR 时间戳换算系数或主控晶振不准对比静止 1 米、2 米处读数校准时间戳单位或改用模块自动校准时钟人在门前不开锁阈值太低或滤波后距离仍高于阈值查看串口日志中的实时距离重新标定阈值检查是否触发开锁连续计数人离开后门不闭锁上锁阈值过大或标签仍在背包内被反射信号测到查看距离是否仍然小于上锁阈值调低上锁阈值并增加计时判断门锁执行机构无反应继电器未驱动、门锁供电不足或 GPIO 配错先手动触发 GPIO 测试门锁再通过程序触发增加驱动电路检查独立供电上电正常测距时单片机复位UWB 模块收发时电流过大电源跌落用示波器查看电源波形加粗电源线、增加电容、改用稳压电源标签加入后不识别标签 ID 不在白名单确认标签地址和允许表比对逻辑扩展白名单或先关闭白名单测试多标签轮询时延迟变大测距调度不够合理记录每一轮测距耗时精简轮询策略或将低频标签延后处理实际排查时养成一个习惯每次串口日志都带时间戳和原始距离。不要只看“最终开不开门”这个布尔结果。没有日志遇到概率性跳变问题几乎没法定位。11. 最佳实践与合规提醒11.1 先做最小闭环再追求无感第一次搭这个系统不要直接把它改成嵌入式逻辑嵌进大门。建议把 UWB 模块、主控、继电器和电磁锁放在桌面试验台上。先验证“测距值稳定”和“距离触发开锁”两个基本环节再考虑做成低功耗钥匙扣。这样即使 UWB 天线或调度逻辑没调好也不影响正常生活。11.2 把安全边界写进设计里自制门禁的可靠性不能只依赖 UWB 测距距离。合法的钥匙扣掉了怎么办门锁必须支持软件注销标签而不是删掉一个固件数组就完事。如果门锁是联网的应支持远程冻结白名单。在门锁物理结构上也要保留机械钥匙或者备用开锁口防止 UWB 模块、主控或供电出问题时人被锁在外面。UWB 测距本身具备较强的防中继能力但自制实现如果不是完整安全协议栈不要承诺绝对安全。对外展示项目时也应明确说明这是“功能原型与学习验证”不是量产级安全门禁。11.3 使用合规提醒这个项目涉及“开门”这种敏感物理动作。我在前面反复强调只能在自己拥有或得到明确授权的设备、门禁、储物柜上测试。不要做任何绕过他人门禁、追踪他人位置、干扰公共设施的设计。如果使用场景包含家人、同事、访客要提前告知门禁会记录什么样的信息只采集完成任务所需的最小数据并做好数据删除和权限管理。在博客中记录项目成果时尽量避免上传真实房屋位置、门锁布局、钥匙扣轨迹等敏感信息避免给不相关的人带来安全风险。11.4 工程化建议所有 UWB 模块固定使用同一个信道设置避免多套系统互相干扰。给标签 ID 和门禁白名单做版本管理不要只保存在内存数组里。门锁动作加入日志和失败次数统计连续解锁失败时能本地蜂鸣或上报。定期做异常场景测试比如断电后门锁状态是否符合预期、被 WIFI 干扰时能否正常测距。12. 总结与下一步UWB 无感解锁的核心价值在于它把“门锁自动判断该不该打开”这个动作从靠摄像头、手机蓝牙或人体红外换成了基于信号飞行时间的厘米级距离判断。STM32 UWB 模块的组合确实不复杂最难的部分在距离滤波、白名单身份校验、门锁执行链路和低功耗标签设计。如果你准备动手我的建议是先从两块 UWB 开发板做起先跑通固定点测距再手动调整标签移动路线让串口输出信号稳定到“可以顺畅读出一条距离曲线”后再考虑接入继电器和门锁。最容易被低估的坑有两个一个是 UWB 模块的天线净空与供电稳定性另一个是开锁/上锁阈值之间的滞回设计。这两个点解决好无感解锁体验的完成度会立刻不一样。下一步可以继续做的扩展方向不少做一个小体积可充电的 BLE UWB 钥匙扣把锚点侧接入 MQTT将开门记录同步到已有的智能家居平台也可以把单点测距换成多点 UWB 定位让门锁识别“人是从走廊还是从室内走近的”进一步降低误触发概率。这个项目的技术栈非常适合嵌入式爱好者用来综合练手能覆盖 SPI 外设、中断时序、无线测距、状态机、低功耗设计和机电控制等多个技能点。只要目标明确、测试数据有记录做成一个稳定可靠的“免罚站门锁”并不是一件不可能完成的事。