本帖最后由 gasment 于 2026-1-6 14:51 编辑
在花了差不多200块来买开发板做测试,以及跟项目作者交流了几十条讨论后,终于有些东西可以拿出来分享下了。
本文目录:
一、项目说明
二、测试案列
三、espectre固件制作
espectre是我第一次接触esp32和esphome,
espectre固件制作说明内详细记录了esphome固件的制作刷写以及调试处理,也适合初次接触esphome的朋友借鉴
Espectre,基于Wi-Fi的运动检测,值不值得玩?
espectre是一个基于 Wi-Fi 频谱分析(CSI)的运动检测系统,它使用 Wi-Fi 信号检测移动(无需摄像头,无需麦克风), 你可以把信号想象成一个水塘,水塘中的有活动会泛起涟漪,通过检测这个涟漪的特征,来判断活动状态
支持ESP32开发板低成本部署,无需外接传感器,原生支持esphome接入HA - 无需编程,简单配置yaml即可编译固件刷入ESP32
- 只需要2.4G的wifi接入点,无需修改路由器设置
- 一定的穿墙检测能力(存疑)
- 支持与其他esphome传感器共同工作(光照、温湿度等)
- espectre与AP为一对一工作,并非侦听环境中的所有无线频谱,检测只能作用于espectre与单独AP之间区域
- espectre需要持续接收网络流量来提取流量中的CSI数据,可以是主动发送后接收,也可以被动接收(详见下文),主动发送模式会占用很少的网络通讯窗口期,espectre节点数量越多越明显
它能代替雷达人在传感吗? 目前不能,项目尚处于早期阶段,检测效果高度依赖于环境,检测准确度和稳定性都不如雷达人在传感,但是检测范围比雷达稍大一点 但是作者已经打算将后续主要开发方向转移到机器学习的高级功能上,我想后面应该不会有检测优化之类的大更新了 当前版本(2.3.0 develop分支)会遇到的问题: 1. espectre每次启动半分钟内都要保持其所在空间静止,以校准检测,否则检测数值直接失真 2. 即便每次启动都能保持静止,检测数值与上一次也会存在一定差异 3. 调整检测阈值无法持久保存,修改阈值无法应用于下一次启动,需要重新修改固件配置yaml并重新刷入
总结:espectre目前可以作为实验性传感器接入,用以学习和研究,其诸多方面都不如雷达传感器,无法做到上位替代甚至同位补充。 如果你有兴趣尝试下,那么先看看它与其他活动检测方案的区别 检测方案 | 示例产品 | 价格 | 响应速度 | 部署难度 | 检测类型 | 分区检测 | 数量统计 | 检测范围 | 误报率 | 24/60G雷达 | 领普ES系列
LD24xx+ESP等 | 40~100 | <1s | 低 | 物体活动 | 部分方案有 | 部分方案有 | 正向<6m最佳 | 低 | espectre | ESP32 S3 | 20~40 | 1~2s | 中 | 物体活动 | 无 | 无 | 正向3~8米最佳 | 中 | 视觉AI | Frigate | 3位数起步上不封顶 | 2~5s | 高 | 物体活动
&
物体种类 | 有 | 有 | 视摄像头视角,
可见即可检测 | 低 |
-----------------------------------------------------------------------------
检测方案 | 配套设备 | 安装点位 | 发展方向 | 24/60G雷达 | 蓝牙代理/网关(可选) | 根据监测区域自由调整 | 多区域检测/活动物体数量等 | espectre | 2.4G 接入点 | 与地板垂直高度1-1.5m,背面净空10-20cm;
避免角落与封闭区域;
需与AP保持3-8m距离,且之间没有金属阻挡物 | 手势识别/人体活动识别/人数统计 | 视觉AI | 摄像头、高性能主机 | 依赖摄像头点位 | 行为检测 |
下面是我的一些测试示例:
1、测试一:
- 两个安装点垂直高度大概一致,相互可视无遮挡
- AP为普通无线路由,全向天线,ESP32为PCB天线,天线面朝向AP
- 5个方向进出基本都能达到检测阈值(默认值1),浅红色内阈值持续>1,基本实现活动检测
如图:
2、测试二:
- 两个安装点垂直高度大概一致,相互可视无遮挡
- AP为86面板AP,定向天线(?),ESP32为PCB天线,天线面朝向AP
- 浅红色内区域,检测值不稳定,大部分达不到阈值,主径方向稍好,活动检测效果不佳
- 房间外部有几率产生>1的检测值
如图:
测试经验:
- AP与ESP32之间的距离不能过近或过远,rssi信号值在-45~-60db之间为佳
- 测试二中即使距离有5m,信号值仍高于-40,检测效果不佳
- 两个设备的位置,避免角落安装与贴墙安装,与墙壁或后部物体保持10~20cm
- 有反馈显示距离雷达人在传感器过近可能会影响其正常工作
下面开始固件制作与刷写步骤说明:
以下方法基于windows平台进行
一、硬件准备
1、该项目目前推荐使用的ESP32型号有: ESP32-C6/C6-SurperMini, ESP32-S3(N16R8), ESP32-C3/C3-SurperMini
- 仅需基础功能使用C3/C3-SurperMini,性价比高
- C6/C6-SurperMini 支持wifi6频段,支持标准功能
- 高配用S3,更大的内存可以战未来,支持高级功能,有支持外接天线的版本
2、注意:
S3(N16R8)带外接天线IPEX座的版本,默认使用自带的PCB天线,如果想切换到外置天线,需要修改电路跳线,如图,
非必要不要改,焊点非常小,除非技术过关,否则不要尝试(0R电阻可以直接一坨锡短接代替)
二、系统软件准备
部署完成后也可用于esphome的其他固件编译刷写
1、安装python & pip
- 微软商店直接安装3.12,会附带安装pip(什么你没有微软商店?自己去官网下载吧,pip也要自己安装并配置系统变量)
2、安装git
- 我这里使用便携版(Git - 下载软件包 - Git 版本控制系统),挑选一个合适的位置解压git目录,记录其内的bin文件夹路径如C:\Program Files\Git\bin
- 管理员运行CMD,执行以下添加系统变量(注意替换bin路径),或手动添加系统变量
SETX PATH "%PATH%;C:\Program Files\Git\bin" /M
三、项目文件准备
1、任意位置新建项目文件夹esphome,比如D:\esphome,esphome文件夹内新建espectre文件夹,如D:\esphome\espectre
2、下载对应你开发版型号的配置文件,放入到espectre文件夹内
- C3/C3 Super mini:
- C6/C6 Super mini:
- S3(N16R8):
3、打开配置文件并参考注释说明,按需修改
- traffic_generator_rate: 100,(C3 Supermini不要高于95)如果配置为0,则切换到外部流量生成模式,需要同一网络下其他设备向其发送持续流量,作者提供了一个python脚本来实现:https://github.com/francescopace ... ternal-traffic-mode
- traffic_generator_mode: dns ,如果启动卡在Auto-Calibration Starting (file-based storage),尝试修改为ping模式
- segmentation_threshold: 1.0,这个值只影响改变运动传感器的on/off状态阈值,并不是灵敏度,与HA上那个number实体是一个配置
- 修改wifi连接信息,如果使用的是AC+AP或者mesh组网,可以通过bssid绑定对应的节点,bssid可以通过wifi魔盒等工具扫描到
- 额外传感器支持,需要使用esphome esp-idf框架支持的i2c、uart等传感器,比如DHT22温湿度单总线就不行
- 示例:BH1750(GY-30)光照度传感器,SHT4x温湿度传感器(SHT3xd 官方库有问题无法使用,但可以用外部库解决)
- BH1750和SHT3xd我已在C3/S3/C6上测试可用(esphome 2025.12.4),相关配置已写入yaml文件,取消注释并修改GPIO来应用
-
四、安装esphome
1、在esphome文件夹内,按住shift然后鼠标右键,打开命令行或powershell,如果进入powershell,可输入cmd后回车来切换到cmd
2、创建并激活python环境目录,cmd执行,完成后esphome文件夹内会多一个venv文件夹
python3 -m venv venv
venv\Scripts\activate
3、安装esphome组件,cmd继续执行,安装时长视网络环境而定,尽可能使用科学上网 4、安装完成后不要关闭cmd窗口
五、连接开发板 1、将开发板以下载模式连接至PC - 对于单USB接口的C3/C6/S3:按住BOOT键不放,插入数据线上电,2~3秒后松开BOOT
- 对于双USB接口的S3:直接连接到COM口即可(如果COM口刷写时报错提示非下载模式,则切换到USB接口,然后使用C3/C6方式进入)
2、可能没有自带驱动,串口芯片可能为FT232R或CH343,下载安装对应驱动然后重新连接
3、记录com口号,比如我这里是com5
4、回到cmd窗口,执行命令,尝试擦除闪存来验证是否已进入下载模式
esptool --port comX erase-flash #comX为com口号,如com5
5、完成后不要关闭cmd窗口
六、编译固件 & 刷入
1、需要为git组件提供科学上网来拉取资源文件
- 如果为路由器端提供,则不需要额外操作
- 如果为本机使用Clash代理:
- 检查Clash的混合代理端口,比如我这里的7897
- 新建一个cmd窗口,执行命令,为git 设置全局代理(注意替换端口号):
git config --global http.proxy http://127.0.0.1:7897
git config --global https.proxy http://127.0.0.1:7897
- 该设置会持久生效,如果想取消:
git config --global --unset http.proxy
git config --global --unset https.proxy
- 完成后可关闭此cmd窗口
2、编译固件,在(venv)的cmd执行,具体yaml文件名按自己开发板型号而定
esphome run espectre\espectre-xx-with-env-sensors.yaml
- 期间会拉取github文件资源,编译时长与CPU性能相关,快的1分钟,慢的10分钟
- 如期间卡在INFO Installing tools via idf_tools.py,尝试更换代理节点
- 如期间报错PermissionError: [WinError 5] 拒绝访问,关闭cmd,删除espectre文件夹内的.esphome文件夹,从第一步重新开始
- 如期间报错`error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools"`,
需要安装C++库,前往:https://visualstudio.microsoft.c ... al-cpp-build-tools/ 下载生成工具,然后按图安装:
3、烧写固件
- 固件编译完,会提示选择刷写的com口,按你实际的com口选择序号
- 带CH343串口的C3可以直接显示日志
- C6、S3需要拔掉数据线重新连接(双口S3连接到USB而不是COM),使用其他串口工具连接,这里推荐mobaxterm,可以按R快速重连,
对C6、S3这种rst时com口会掉的情况,快速重连才能及时看到完整的启动日志
4、debug & 配置
- 启动日志刷出后,观察系统工作情况,如果能看不断刷出类似信息如下,证明系统工作正常,确保万一,可以多rst几次板子,观察是否每次都如期工作
[I][espectre:234][wifi]: [##-------------|----] 19% | mvmt:0.1914 thr:1.0000 | IDLE | 100 pkt/s | ch:9 rssi:-38
[D][sensor:135][wifi]: 'Movement Score': Sending state 0.19145 with 2 decimals of accuracy
[I][espectre:234][wifi]: [##-------------|----] 16% | mvmt:0.1686 thr:1.0000 | IDLE | 98 pkt/s | ch:9 rssi:-39
[D][sensor:135][wifi]: 'Movement Score': Sending state 0.16863 with 2 decimals of accuracy
[I][espectre:234][wifi]: [###########----|----] 73% | mvmt:0.7354 thr:1.0000 | IDLE | 107 pkt/s | ch:9 rssi:-37
[D][sensor:135][wifi]: 'Movement Score': Sending state 0.73542 with 2 decimals of accuracy
[I][espectre:234][wifi]: [###############|####] 191% | mvmt:1.9194 thr:1.0000 | MOTION | 98 pkt/s | ch:9 rssi:-34
- 如果配置了 其他传感器,如其正常工作,会一同输出传感器的数值,如没有,检查启动日志里关于i2c的报错
- 进入ha,会自动发现设备(如果没有esphome集成就先安装),如没有提示发现,可以通过esp32获取的ip来手动添加
- 成功接入后,把板子固定到目标位置,按下Calibrate开关,重新校准,注意按下开关的1分钟内,保持室内静止
- 观察Movement Value的值,找到静止与活动的边界,然后把Motion Threshold调整到对应的值
- Motion Threshold的值在板子重启后会还原,如需固定可以写死在yaml文件内的segmentation_threshold,然后擦除板子闪存,重新编译固件刷入
PS、可选外壳
- 如果不需要外置天线,pdd上就有esp32s3的打印壳:
- 我没有找到支持外置天线的壳子,于是让AI搓了一个简易壳
- 如果你也想自制外壳,但是不会建模也不会打印,那么可以这样玩:
1、下载安装openscad,openscad可以用纯代码建模
2、找个靠谱的AI,将你的需求转化为openscad代码,过程肯定足够艰辛
3、使用openscad的STL模型输出功能,输出为STL模型,在嘉立创3D打印上提交打印,等待收货
- 如果你想试下我这个简易壳(没有固定结构,需要点胶粘一下,仅支持双口S3)
STL:
分开打印两个文件,用LEDO 6060(白色 打磨-粗磨)材料,一套10块左右
✅以上~
|