驭 光
N E U R O L U X
脑波驱灯 · 意念驭光
暑期一周树莓派高阶项目 | TGAM EEG → Raspberry Pi 4 → Philips WiZ Smart Light
🧠 蓝牙脑波采集
💡 智能灯光控制
📡 局域网脑波广播
📊 实时可视化仪表盘
🤖 Claude Code + DeepSeek
01 项目概述
🎯 一句话描述
佩戴 TGAM 脑波模块,睁眼看屏幕 → 灯自动亮冷白光;闭眼放松 → 灯自动切换暖橙暗光;长时间闭眼 → 灯光渐灭。全程无需手动、无需语音、无需手机——纯脑波驱动。
🔬 科学原理:α 波阻断(Alpha Blocking)
1929 年 Hans Berger 发现——人一闭眼,α 波功率立即飙升 2–5 倍;一睁眼,α 波瞬间被抑制。这是人体自动生理反射,不需训练、不受主观意志干扰,远比"主动意念控制"可靠。TGAM 前额电极(Fp1 位置)足以捕捉这一变化。这也是项目最核心的可靠性保障——我们控制的是反射,不是意念。
生理反射驱动
α 波阻断是硬编码在神经系统里的自动反射,睁眼即抑制、闭眼即爆发——稳定性远超主动意念控制
蓝牙无线采集
TGAM 通过蓝牙 SPP 发送数据,USB Dongle 插入树莓派即可接收,佩戴者零物理连线
局域网脑波广播
TCP Server :9527 实时推送 JSON 脑波流,局域网任何设备可订阅——为多端扩展预留标准接口
实时可视化仪表盘
Flask + Chart.js Web 面板:脑波雷达图、注意力/冥想双曲线、α 功率脉冲柱、虚拟灯泡
全异常容错
蓝牙断连自动重绑 · WiZ 掉线恢复 · 信号质量门控 · 状态切换防抖冷却 · 系统开机自启
AI 辅助开发
Windows 端 Claude Code + DeepSeek v4-pro 生成代码 → SSH/SCP 部署 Pi → VNC 远程验证
📋 关键性能指标
< 1.5s
睁眼→灯响应延迟
> 85%
睁/闭眼检测准确率
57600
蓝牙 SPP 波特率
2GB
Pi 内存全链路占用
02 系统架构
📐 全链路拓扑
┌──────────────────────────────────────────────────────────────────────────┐
│ 驭光 NeuroLux 系统架构 局域网 192.168.1.0/24 │
│ │
│ ┌──────────┐ 蓝牙 SPP ┌─────────────────────────────────────────┐ │
│ │ TGAM │ · · · · · · · · → │ 树莓派 4 (Debian 10, 2GB aarch64) │ │
│ │ 脑波模块 │ USB BT Dongle │ │ │
│ │ (前额佩戴) │ 57600bps │ /dev/rfcomm0 → pyserial → parser │ │
│ └──────────┘ │ ↓ │ │
│ │ 信号处理管线 │ │
│ │ 滑动滤波 → α功率提取 → 眨眼检测 → 质量门控 │ │
│ │ ↓ │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │ GPIO LED │ │ WiZ 灯泡 │ │TCP :9527 │ │ │
│ │ │PWM调亮度│ │UDP 38899│ │脑波广播│ │ │
│ │ └──────────┘ └──────────┘ └──────────┘ │ │
│ │ ↓ │ │
│ │ Flask :5000 (Web 仪表盘 + SSE 实时推送) │ │
│ └─────────────────────────────────────────┘ │
│ ↑ │
│ 局域网任意浏览器访问 :5000 │
│ │
│ ┌──────────────────────┐ │
│ │ Windows 开发机 │── SSH/SCP 部署代码 ──→ Pi │
│ │ Claude Code │── VNC 远程桌面 ────→ Pi │
│ │ + DeepSeek v4-pro │ │
│ └──────────────────────┘ │
└──────────────────────────────────────────────────────────────────────────┘
📂 项目代码结构(共 26 个文件)
~/brain-light/
├── main.py # 统一入口,argparse 参数化
├── config.yaml # 所有配置项集中管理
├── requirements.txt # Python 依赖
│
├── tgam/
│ ├── __init__.py
│ ├── parser.py # ThinkGear 协议解析 (字节状态机)
│ └── replayer.py # CSV 离线回放 (零佩戴开发)
│
├── signal/
│ ├── __init__.py
│ ├── processor.py # 滑动滤波 + FFT α 提取
│ ├── blink_detector.py # 眨眼尖峰检测 (>3σ)
│ └── classifier.py # 睁眼/闭眼/过渡三态分类
│
├── light/
│ ├── __init__.py
│ ├── gpio_led.py # GPIO17 PWM LED
│ ├── wiz_controller.py # WiZ UDP 38899 JSON
│ └── mapper.py # 脑波→(色温,亮度) 映射
│
├── network/
│ └── tcp_server.py # asyncio 脑波广播
│
├── web/
│ ├── __init__.py
│ ├── dashboard.py # Flask + SSE
│ ├── templates/index.html # 仪表盘页面
│ └── static/
│ ├── style.css
│ └── dashboard.js # Chart.js 图表
│
├── scripts/
│ ├── calibrate.py # 个人 α 基线校准
│ ├── brain_client.py # TCP 测试客户端
│ └── brain-light.service # systemd 自启
│
├── data/ # CSV 脑波录制
├── logs/ # 运行日志
└── README.md
03 硬件清单与接线
| # | 组件 | 型号/参数 | 用途 | 状态 |
|---|---|---|---|---|
| 1 | 树莓派 4 | 2GB · Debian 10 Buster · aarch64 | 主控制器:采集+处理+控灯+Web | 已有 |
| 2 | TGAM 脑波模块 | NeuroSky ThinkGear · 蓝牙 SPP · 57600bps · 512Hz | 前额 EEG 采集 | 已有 |
| 3 | USB 蓝牙 Dongle | CSR 芯片 · Bluetooth 4.0+ · 免驱 | Pi 端接收 TGAM 蓝牙数据 | 已有 |
| 4 | Philips WiZ 灯泡 | WiFi 直连 · UDP 38899 · RGB+色温 1700-6500K | 主力执行器 | 已有 |
| 5 | 普通 LED + 220Ω 电阻 | 5mm 高亮 LED | GPIO 本地开发验证 | ¥5 |
| 6 | 杜邦线 | 母对母 若干 | LED 接线 | ¥5 |
| 7 | 运动头带 | 宽款弹性跑步头带 | 固定 TGAM 于前额 | ¥20 |
| 8 | 医用导电膏 | EEG 专用导电凝胶 | 降低皮肤-电极阻抗 | ¥20 |
🔌 接线图
| 连接 | 方式 | 说明 |
|---|---|---|
| TGAM → Pi | 蓝牙无线 | TGAM 蓝牙模块广播 SPP → Pi USB Dongle 接收 → /dev/rfcomm0 (57600bps 8N1) |
| LED → Pi | 杜邦线 | LED 正极(长脚) → GPIO17 (Pin11) · LED 负极(短脚) → 220Ω → GND (Pin9) |
| WiZ 灯泡 → Pi | WiFi 无线 | 同一局域网 → Pi 通过 UDP 38899 发送 JSON 指令直控灯泡 |
| TGAM 供电 | 杜邦线 | TGAM VCC → Pi Pin1 (3.3V) · TGAM GND → Pi Pin6 (GND)——或独立电池供电 |
⚡ GPIO 引脚占用
| Pi 引脚 | BCM | 用途 |
|---|---|---|
| Pin 1 | 3.3V | TGAM 供电 (可选) |
| Pin 6 | GND | TGAM / LED 共地 |
| Pin 8 | GPIO14 / TXD | UART TX (备用,本项目不用) |
| Pin 10 | GPIO15 / RXD | UART RX (备用,本项目通过蓝牙) |
| Pin 11 | GPIO17 | LED PWM 亮度控制 |
| Pin 9 | GND | LED 负极回路 |
04 三层通信协议
📡 第1层:ThinkGear 数据包 (TGAM 蓝牙 → Pi)
┌──────┬──────┬──────┬────────────────────┬──────┐
│ SYNC │ SYNC │ PLEN │ PAYLOAD │ CHK │
│ 0xAA │ 0xAA │ N │ N 字节载荷 │ 校验 │
└──────┴──────┴──────┴────────────────────┴──────┘
校验: CHK = ~(sum(PAYLOAD) & 0xFF) → (CHK + sum) & 0xFF == 0 通过
PAYLOAD = [CODE][LEN][DATA...] 连续排列:
CODE 名称 长度 含义
0x02 Poor Signal 1 byte 0=完美 200=无信号 >50应丢弃
0x04 Attention 1 byte eSense 0-100
0x05 Meditation 1 byte eSense 0-100
0x80 Raw Wave 2 bytes Big-endian 16-bit signed, 512Hz
0x83 EEG Power 24 bytes 8频段 × 3字节 big-endian:
δ(0.5-2.75Hz) / θ(3.5-6.75Hz) / low-α(7.5-9.25Hz)
high-α(10-11.75Hz) / low-β(13-16.75Hz) / high-β(18-29.75Hz)
low-γ(31-39.75Hz) / mid-γ(41-49.75Hz)
💡 第2层:WiZ UDP 协议 (Pi → 灯泡)
| 项目 | 详情 |
|---|---|
| 传输层 | UDP 端口 38899 |
| 数据格式 | JSON 明文 |
| 发现灯泡 | 广播 {"method":"getPilot"} → 255.255.255.255:38899 |
| 设置状态 | {"method":"setPilot","params":{"state":true,"b":80,"temp":4200}} |
| 可设参数 | state(开关) · b(亮度 1-100) · temp(色温 1700-6500K) · r/g/b(0-255) · dimming(渐变 ms) · sceneId(场景编号) |
| 查询状态 | {"method":"getPilot"} 单播到灯泡 IP |
🔗 第3层:TCP 局域网广播协议 (Pi → 任意设备)
| 项目 | 详情 |
|---|---|
| 传输层 | TCP Server 监听 0.0.0.0:9527 (asyncio) |
| 消息格式 | JSON Line:每条完整 JSON + \n 分隔 |
| 消息类型 | brain_state (每 0.5s 一帧) · light_status (灯状态回执) · ping/pong (心跳 5s) |
| brain_state 格式 | {"type":"brain_state","ts":...,"attention":72,"meditation":25,"alpha_power":185.2,"beta_power":82.1,"blink_count":0,"eyes_state":"open","poor_signal":0} |
| 心跳超时 | 15s 无 Pong → 判定断线 → 自动移除客户端 → 灯保持最后状态不变 |
| 多客户端 | 支持任意数量客户端同时连接,各自独立心跳 |
🔄 数据流总览
TGAM 蓝牙 树莓派 执行器 / 外部
│ │ │
├─ 0xAA 0xAA ──→ │ [parser] 状态机逐字节扫描 │
├─ PLEN ──────→ │ │
├─ 0x02 ──────→ │ PoorSignal ←→ [质量门控] >50丢弃 │
├─ 0x04 ──────→ │ Attention ──→ 10帧平滑 │
├─ 0x05 ──────→ │ Meditation──→ 10帧平滑 │
├─ 0x80 ──────→ │ RawWave ──→ [眨眼检测] >3σ尖峰 │
├─ 0x83 ──────→ │ EEG Power──→ α=low+high ─→ 分类器 │
└─ CHECKSUM ──→ │ │
│ │
│ [classifier] OPEN/CLOSED/TRANSITION │
│ ↓ │
│ [mapper] 查表 → (色温,亮度,过渡) │
│ ↓ │
├─ WiZ UDP 38899 ───────────────→ 💡 │
├─ GPIO PWM ──────────────────→ LED │
├─ TCP :9527 broadcast ────────→ 🌐 │
└─ Flask SSE :5000 ────────────→ 📊 │
05 信号处理与状态判断
🔬 信号处理管线(5 个阶段)
| 阶段 | 模块 | 输入 | 处理 | 输出 |
|---|---|---|---|---|
| 1. 协议解析 | tgam/parser.py | 原始字节流 (/dev/rfcomm0) | 状态机: WAIT_SYNC1→WAIT_SYNC2→WAIT_PLEN→READ_PAYLOAD→VERIFY | dict{poor_signal, attention, meditation, raw_wave, eeg_power} |
| 2. 质量门控 | — (inline) | poor_signal | if poor_signal > 50 → DISCARD | 有效帧 / 丢弃标记 |
| 3. 滑动滤波 | signal/processor.py | attention, meditation, eeg_power | Attn/Med: 10帧(~1s)均值 · α_power: 20帧(~2s)均值 | 平滑后的 attn, med, alpha |
| 4. 眨眼检测 | signal/blink_detector.py | raw_wave (512Hz) | 500ms窗std → >3σ尖峰(50ms<宽<300ms) → 连续2次<1s=双眨眼 | blink_count, double_blink_event |
| 5. 状态分类 | signal/classifier.py | smoothed_alpha, attn, med, blink | α>150且Attn<45→CLOSED · α<60或Attn>55→OPEN · 其他保持 | OPEN / CLOSED / TRANSITION |
🎯 脑波 → 灯光映射表
| 脑波状态 | 判断条件 | 色温 | 亮度 | 视觉效果 | 过渡 |
|---|---|---|---|---|---|
| 睁眼·专注 | OPEN + Attn>60 | 5000K 冷白 | 85% | 高亮冷白,适合屏幕阅读 | 0.8s |
| 睁眼·普通 | OPEN + Attn≤60 | 4200K 自然白 | 65% | 自然白光,日常照明 | 1.0s |
| 过渡状态 | TRANSITION | 3500K 暖白 | 40% | 偏暖暧昧区 | 1.5s |
| 闭眼·放松 | CLOSED + <60s | 2400K 暖橙 | 20% | 暗暖橙光,放松氛围 | 2.0s |
| 长闭·入睡 | CLOSED + ≥60s | 2200K 极暖 | 3%→0 | 极暗→渐灭,助眠日落 | 5.0s |
⚙️ 状态机与防抖策略
| 机制 | 参数 | 作用 |
|---|---|---|
| 施密特滞回 | OPEN 阈: α<60 或 Attn>55 · CLOSED 阈: α>150 且 Attn<45 | 中间带保持上次状态——消除临界抖动 |
| 防抖确认 | 状态变化需持续 1.0s 才生效 | 过滤眨眼/短暂闭眼(100-300ms) |
| 冷却期 | 状态切换后 3s 内不响应新变化 | 防止频繁切换灯光闪烁烦人 |
| 入睡判定 | 连续 CLOSED ≥ 60s | 闭眼小憩不触发,真入睡才渐灭 |
| 唤醒策略 | 睁眼瞬间 → 65%/4200K | 不拖沓,快速回应 |
| 信号差保护 | PoorSignal>50 持续3s → 灯保持当前状态 | 电极脱落不误关灯 |
06 7 天详细开发计划
每半天一个可执行任务块,精确到操作步骤。开发方式:Windows Claude Code + DeepSeek v4-pro 生成代码 → SSH/SCP 部署 Pi → VNC 验证运行效果。
DAY 1
环境搭建 + 硬件冒烟验证
☀️ 上午(4h)—— 开发环境 + Pi 无头化
| 1.1 | Clash Verge | 从 files.buckfpga.uk 下载 Windows 版 → 配置代理 → 确认科学上网 |
| 1.2 | Claude Code | 按 buckfpga.uk 博客教程: Node.js → npm install → 配置 DeepSeek v4-pro endpoint + key |
| 1.3 | 验证 AI | 对话测试 → 代码生成 → 文件读写 → 确认 Claude Code 可用 |
| 1.4 | Pi 基线 | SSH 登录: cat /etc/os-release · uname -a · free -h · df -h · ip a · lsusb |
| 1.5 | 换源 | 清华 Debian 10 源 → apt update && apt upgrade -y |
| 1.6 | VNC 验证 | Windows VNC Viewer 连 Pi → 确认桌面可操作(已安装) |
| 1.7 | 🎯 拔线测试 | 拔 HDMI+键鼠,仅留电源+网线 → VNC 全流程 → 无头化确认 |
🏆 里程碑:Claude Code 能正常对话生成代码 + Windows VNC 可远程操作 Pi 桌面(Pi 已拔掉显示器键鼠,仅电源网线运行)+ scp 可推送文件到 Pi——开发-部署-验证三通道全部打通,后续所有工作都在这个闭环里完成
🌤️ 下午(4h)—— Python 环境 + 硬件冒烟
| 1.9 | Python venv | python3 -m venv ~/brain-light/venv && source venv/bin/activate |
| 1.10 | pip 依赖 | pip install pyserial RPi.GPIO numpy flask · apt install python3-scipy -y |
| 1.11 | 蓝牙栈 | apt install bluetooth bluez bluez-tools -y · systemctl enable bluetooth --now |
| 1.12 | Dongle 验证 | 插 USB 蓝牙 → lsusb 看到适配器 → hciconfig -a 确认 hci0 UP |
| 1.13 | GPIO 冒烟 | LED+220Ω 接 GPIO17+GND → Python 闪 3 次 → RPi.GPIO 正常 |
| 1.14 | 骨架+Git | 创建全部目录+__init__.py → git init → 首次 commit |
🏆 里程碑:Pi 上蓝牙服务运行正常,USB Dongle 识别为 hci0 且 UP 状态;GPIO17 接的 LED 可通过 Python 脚本控制闪烁;brain-light 目录结构全部建好、Git 已初始化——软件开发环境、无线通信栈、物理 IO 三层全部就绪,可以开始接入 TGAM
DAY 2
TGAM 蓝牙配对 + 脑波数据采集
☀️ 上午(4h)—— 蓝牙通信打通
| 2.1 | TGAM 上电 | TGAM VCC→Pi 3.3V/GND → 蓝牙模块指示灯确认工作 |
| 2.2 | 蓝牙扫描 | bluetoothctl → scan on → 找到 TGAM 设备 (名含 HC-05/BT/TGAM) → 记 MAC |
| 2.3 | 配对信任 | pair <MAC> → trust <MAC> → connect <MAC> → 确认配对 |
| 2.4 | rfcomm 绑定 | sudo rfcomm bind 0 <MAC> → ls /dev/rfcomm0 确认存在 |
| 2.5 | 持久化 | 配置 /etc/bluetooth/rfcomm.conf 或 udev → 重启自动重连 TGAM |
| 2.6 | 连通验证 | pyserial /dev/rfcomm0 57600 → 读原始字节 → 找到 0xAA 0xAA 同步头 |
🏆 里程碑:bluetoothctl 配对并 trust TGAM 设备成功;/dev/rfcomm0 设备文件存在;pyserial 打开 /dev/rfcomm0 57600bps 能读到以 0xAA 0xAA 开头的原始字节流——TGAM 的脑电数据已经通过蓝牙进入 Pi 内存,硬件链路完全打通,可以开始解析 ThinkGear 协议
🌤️ 下午(4h)—— 协议解析 + 数据录制
| 2.7 | 终端面板 | 每秒刷新: [14:32:05] Sig:0 Attn:72 Med:25 α:18.5k β:8.2k |
| 2.8 | CHECKSUM | 校验不符→丢弃+日志 · total/bad 包统计 |
| 2.9 | EEG Power | 0x83 → δ/θ/low-α/high-α/low-β/high-β/low-γ/mid-γ (8×24bit) |
| 2.10 | CSV 录制 | 全字段+ts 写 data/session_xxx.csv |
| 2.11 | tgam/replayer.py | 读 CSV 按原始间隔 yield → 零佩戴开发 |
🏆 里程碑:终端每秒刷新一行实时脑波数据(PoorSignal/Attention/Meditation/α/β 数值可见);CHECKSUM 校验通过率 >95%;CSV 文件完整记录了 5 分钟以上脑波数据;回放器按原始时间间隔逐帧 yield,后续开发可离线调试——从此不必每次测试都佩戴 TGAM 头带
DAY 3
信号处理 + GPIO LED 控制
☀️ 上午(4h)—— 信号处理管线
| 3.1 | 滑动窗口 | Attn/Med: 10帧(~1s) · α_power: 20帧(~2s) 均值平滑 |
| 3.2 | α 总功率 | alpha_total = low_alpha + high_alpha |
| 3.3 | 眨眼检测 | RawWave 500ms窗 std → >3σ尖峰(50ms<宽<300ms) → 双眨眼<1s |
| 3.4 | 质量门控 | PoorSignal>50 → skip · flag DISCARDED |
| 3.5 | 终端 ASCII | α 功率 █ 密度柱状图 |
🏆 里程碑:Attention/Meditation 经 10 帧滑动平均后曲线平滑无毛刺;α 总功率 = low_α+high_α 实时计算正确;眨眼检测能在终端正确打印 double_blink 事件(故意眨眼测试验证);PoorSignal>50 的帧被正确丢弃——4 条信号处理管线全部就绪,输入脑波帧、输出干净的特征向量
🌤️ 下午(4h)—— 脑波驱动 GPIO LED
| 3.6 | PWM | RPi.GPIO.PWM(pin,100) 0-100% 占空比 |
| 3.7 | 施密特滞回 | 开: Attn>60 持1.5s · 关: Attn<35 持2.0s · 中间保持 |
| 3.8 | 实测 | 戴 TGAM → 睁眼灯亮/闭眼灯暗 |
| 3.9 | 成功率 | 20轮期望vs实际 → 统计误触发率 |
| 3.10 | 调参 | 实测反馈调滞回上下限+个人基线 |
🏆 里程碑:佩戴 TGAM 后睁眼看屏幕→GPIO LED 自动亮起(PWM 渐亮);闭眼放松→LED 自动变暗至设定亮度;20 轮"期望 vs 实际"测试中误触发率 < 15%;施密特滞回有效防止了临界抖动——脑波信号已经能稳定驱动物理硬件做出正确响应
DAY 4
WiZ 灯泡协议 + 本地闭环
☀️ 上午(4h)—— WiZ UDP 协议封装
| 4.1 | 协议研究 | UDP 38899 JSON · Wireshark 验证 |
| 4.2 | 自动发现 | 广播 getPilot → IP/MAC/状态 |
| 4.3 | wiz_controller.py | discover/on/off/set_brightness/set_color_temp/set_rgb/set_scene/get_state |
| 4.4 | 命令行验证 | python3 wiz_controller.py --discover 全功能测试 |
| 4.5 | 渐变过渡 | fade_to(bri,ct,dur) 分20步UDP 视觉平滑 |
| 4.6 | 场景预置 | App设"夜灯""阅读"等 → 获取sceneId |
🏆 里程碑:light/wiz_controller.py 全部 8 个方法测试通过:discover() 能自动发现局域网内 WiZ 灯泡并返回 IP+MAC、on/off/set_brightness/set_color_temp/set_rgb 均可正确控制灯泡、fade_to() 渐变过渡视觉平滑、get_state() 可查询灯泡当前状态——灯泡已完全受代码控制,不再依赖 App
🌤️ 下午(4h)—— 脑波→WiZ 本地闭环
| 4.7 | signal/classifier.py | α_power/attn/med/blink → OPEN/CLOSED/TRANSITION |
| 4.8 | light/mapper.py | 5态映射表 → (色温,亮度,过渡) |
| 4.9 | 状态机冷却 | 3s防抖 · CLOSED≥60s渐灭 · 睁眼瞬间恢复 |
| 4.10 | 闭环联调 | TGAM→蓝牙→rfcomm→parser→processor→classifier→mapper→WiZ 全链路 |
🏆 里程碑:佩戴 TGAM → 睁眼看屏幕 WiZ 灯泡自动变为 5000K 冷白 85% 亮(适合阅读);闭眼放松灯泡自动变为 2400K 暖橙 20% 暗(放松氛围);连续闭眼超过 60 秒灯光逐渐熄灭(模拟入睡日落效果);再次睁眼灯泡立即恢复 65% 自然白光——TGAM 脑波 → WiZ 灯泡的全自动闭环控制链路完全跑通,这是项目最核心的功能达成
DAY 5
局域网脑波数据广播 (TCP Server)
☀️ 上午(4h)—— TCP Server 实现
| 5.1 | JSON Line | JSON+\n · brain_state/light_status/ping/pong |
| 5.2 | tcp_server.py | BrainServer: asyncio TCP 0.0.0.0:9527 → 客户端列表 → broadcast() |
| 5.3 | 多客户端 | client_id+IP+时间 · 断开自动移除 |
| 5.4 | 心跳 | 5s Ping · 15s无Pong→踢 |
| 5.5 | 连通验证 | nc Pi 9527 → 收到实时 JSON 脑波流 |
🏆 里程碑:局域网内另一台电脑执行 nc Pi_IP 9527,终端实时滚动打印 JSON 脑波流(attention/meditation/alpha_power/eyes_state 等字段每 0.5s 刷新一行);心跳 ping/pong 正常运转、超时 15s 自动踢客户端——脑波数据已可以实时流出 Pi,为多端扩展(手机/远程/AI分析)提供了标准数据接口
🌤️ 下午(4h)—— 集成 + 客户端测试
| 5.6 | 集成主循环 | 每0.5s: parse→classify → (1)WiZ控灯 (2)broadcast() |
| 5.7 | 灯状态回传 | WiZ执行后回传light_status 一并广播 |
| 5.8 | brain_client.py | brain_client.py --host 192.168.1.x → 终端实时显示远端脑波 |
| 5.9 | 断线测试 | 客户端断→server移除 · 重连→继续收数据 |
| 5.10 | config.yaml | tcp.enabled / tcp.port 配置化 |
🏆 里程碑:brain_client.py --host Pi_IP 在局域网任意电脑上运行即可实时显示远端脑波数据;主循环同时完成了控灯+broadcast 两项工作;客户端断开重连后可无缝恢复数据接收;灯状态在断线期间保持最后值不变——本地脑波控灯 + 远程数据订阅双通道稳定运行,为互联网远程控灯预留了标准化的 TCP 接口
DAY 6
可视化仪表盘 + 全链路集成
☀️ 上午(4h)—— Web 实时仪表盘
| 6.1 | Flask 骨架 | web/dashboard.py 监听 0.0.0.0:5000 |
| 6.2 | REST API | GET /api/state · /api/history?n=200 · /api/light · POST /api/light/set |
| 6.3 | SSE 推送 | /api/stream — Server-Sent Events 每500ms一帧 |
| 6.4 | 仪表盘页面 | CSS Grid 四区域明亮科技风面板 |
| 6.4a | → 脑波雷达图 | Chart.js δ/θ/α/β/γ 六边形 · 闭眼α瓣剧烈膨胀 |
| 6.4b | → 注意力/冥想线 | 红蓝双Y折线 60s滚窗 |
| 6.4c | → α功率脉冲柱 | 柱状图 + CSS glow动画 · 闭眼猛涨 |
| 6.4d | → 虚拟灯泡 | CSS SVG 颜色亮度随脑波实时变 |
| 6.5 | 信号质量仪表 | 圆形指针 绿(0-30)/黄(30-70)/红(70-200) |
🏆 里程碑:打开浏览器 http://Pi_IP:5000 即可看到暗色科技风仪表盘:雷达图五频段六边形随脑波真实旋转、注意力(红线)和冥想度(蓝线)双曲线在 60s 窗口内滚动、α 功率柱状图在闭眼时瞬间猛涨并带有 CSS 发光脉冲动画、虚拟 SVG 灯泡颜色从冷白渐变到暖橙——全程通过 SSE 实时推送无需手动刷新,是演示验收的核心视觉载体
🌤️ 下午(4h)—— 全链路集成 + 服务化
| 6.6 | main.py | argparse: --config · --calibrate · --replay · --no-light · --no-tcp · --no-web |
| 6.7 | config.yaml | rfcomm设备·WiZ IP/发现·TCP开关端口·阈值·日志级别 |
| 6.8 | calibrate.py | 交互:"睁眼10s→闭眼10s"→自动算α基线→写config |
| 6.9 | systemd | brain-light.service: After=bluetooth.service network.target · Restart=always |
| 6.10 | 日志系统 | INFO→文件 · DEBUG→journald · WARNING→stderr |
🏆 里程碑:sudo systemctl start brain-light 一条命令启动全部功能(蓝牙连接→脑波采集→信号处理→WiZ 控灯→TCP 广播→Web 仪表盘);systemctl enable brain-light 后 Pi 断电重启自动恢复运行;journalctl -u brain-light 可查看完整运行日志;config.yaml 中修改任何参数无需改代码——项目已从开发原型进化为可部署的系统服务
DAY 7
全面测试 + 震撼演示验收
☀️ 上午(4h)—— 全面测试
| 7.1 | 功能回归 | GPIO LED→本地WiZ→TCP广播→Web仪表盘→校准→配置切换 |
| 7.2 | 异常测试 | 电极脱落·灯泡断电·WiFi断·蓝牙断连·Pi重启自恢复 |
| 7.3 | 长稳测试 | 戴1h→htop监控·丢包率·蓝牙断连次数 |
| 7.4 | 延迟测量 | 睁眼→灯变 < 1.5s |
| 7.5 | 参数精调 | 基于1h实测微调 |
🏆 里程碑:功能回归清单 12 项全部通过(GPIO LED/本地 WiZ/TCP 广播/Web 仪表盘/校准/配置切换);异常场景测试通过:电极脱落→信号质量跳红灯保持→重戴自动恢复、WiZ 断电重现→重新自动连接、网线拔掉 TCP 断→重连恢复数据流、Pi 重启→ systemd 自动拉起全部服务;1 小时连续佩戴运行无崩溃无内存泄漏;端到端睁眼→灯变延迟 < 1.5s——系统达到可交付的稳定状态
🌤️ 下午(4h)—— ⭐ 震撼演示验收
| 7.6 | 3分钟演示剧本 | 分镜见下表 |
| 7.7 | 视觉打磨 | 毛玻璃·α柱glow·灯泡辉光·打字机标题·实时日志滚动 |
| 7.8 | 分屏录屏 | OBS: 仪表盘(左)+演示者(右上)+灯泡特写(右下) |
| 7.9 | 接线图 | Fritzing/ASCII标注 |
| 7.10 | 代码清理+Git | docstring · git tag snapshot-YYYYMMDDhhmmss |
| 7.11 | README | 背景·硬件清单·蓝牙步骤·配置·运行·TCP协议·FAQ |
🏆 最终验收:3 分钟演示全程无卡顿无故障:仪表盘雷达图 α 瓣随睁眼闭眼剧烈变化、实体 WiZ 灯泡同步冷白↔暖橙切换、TCP 广播实时 JSON 流在另一台电脑终端滚动、电极拔掉重戴自恢复流畅自然。演示录制完成、代码仓库已打 tag、README 完整可复现——暑期一周树莓派高阶项目「驭光 NeuroLux」正式交付!
🎬 Day 7 演示剧本(3 分钟分镜)
| 时间 | 画面 | 内容 |
|---|---|---|
| 00:00 | 仪表盘首页 | 明亮科技风面板:雷达图旋转 + 双曲线波动 + 数据流粒子 |
| 00:10 | 戴 TGAM | 演示者戴头带 → 雷达图 α 瓣收缩(睁眼特征)→ 虚拟灯泡亮冷白光,标注"注意力 78" |
| 00:25 | 分屏对比 | 浏览器仪表盘(左) + 实体 WiZ 灯泡(右) 同步冷白高亮——视觉冲击点1 |
| 00:40 | 闭眼 | 演示者闭眼 → 雷达图 α 瓣剧烈膨胀!→ 虚拟灯泡切换暖橙——视觉冲击点2 |
| 00:55 | 实体灯同步 | WiZ 灯泡同步变暖橙暗光——视觉冲击点3 |
| 01:10 | 旁白讲解 | 信号路径动画:TGAM→蓝牙→rfcomm→parser→classifier→mapper→WiZ UDP |
| 01:25 | 睁眼 | 睁眼 → 灯瞬间冷白高亮——α 抑制的震撼速度 |
| 01:40 | TCP 广播演示 | 另一台电脑 brain_client.py 实时打印 JSON 脑波流 |
| 01:55 | 异常演示 | 拔掉电极 → 信号质量跳红 → 灯保持 → 重新戴上 → 自动恢复 |
| 02:15 | 结尾 | 架构总览图 + 性能指标 + GitHub 地址 |
07 Web 仪表盘设计
📊 四大面板布局
| A · 脑波雷达图 | δ/θ/α/β/γ 五频段六边形 · Chart.js radar · 闭眼α瓣剧烈膨胀(主视觉冲击) |
| B · 注意力/冥想 | 红蓝双Y折线 · 60s滚动窗 · 实时更新 |
| C · α 功率脉冲柱 | 柱状图+CSS glow · 闭眼柱体猛涨带脉冲发光动画 |
| D · 虚拟灯泡 | CSS SVG 灯泡+辉光 · 颜色亮度随脑波实时变化 · 睁眼冷白/闭眼暖橙 |
🔧 技术选型
| 后端 | Flask (Python) · 0.0.0.0:5000 |
| 实时推送 | Server-Sent Events (SSE) · Content-Type: text/event-stream · 500ms/帧 |
| 前端图表 | Chart.js 4.x · radar + line + bar 混合 |
| 样式 | 纯 CSS · 明亮科技风 · 零第三方 UI 库 |
| 访问 | 局域网任意浏览器 → http://Pi_IP:5000 |
08 关键风险与预案
| 风险 | 概率 | 影响 | 预案 |
|---|---|---|---|
| USB BT Dongle 不兼容 Debian 10 | 中 | Day2 阻塞 | lsusb 查芯片→内核模块 · 换 CSR 芯片 Dongle (¥15) |
| TGAM 蓝牙配对失败 | 中 | Day2 阻塞 | 确认 TGAM 蓝牙模块型号(HC-05/06) · 手机先验证 TGAM 可被发现 |
| rfcomm 绑定不稳定、频繁断连 | 中 | Day3-7 体验差 | watchdog 脚本监控 /dev/rfcomm0 · systemd 自动重绑 · rfcomm.conf 持久化 · 灯保持最后状态不闪 |
| 电极接触不良,信号质量差 | 中 | 实测效果差 | 酒精棉片擦额头+导电膏 · Day2 做 CSV 回放器可离线开发 · PoorSignal>50 门控兜底 |
| DeepSeek API 不可用 | 低 | 全程受阻 | Clash Verge 代理确认在线 → 再配 Claude Code · 备: 换其他 API endpoint |
| 2GB 内存吃紧 (Flask+numpy+BT) | 中 | 仪表盘卡顿 | 关桌面 multi-user.target · numpy 轻量操作 · Flask 单线程 · 仪表盘静态资源最小化 |
| WiZ 协议文档不全,UDP 指令试错 | 低 | Day4 延迟 | Wireshark 抓 WiZ App 通信包逆向 · 已有成熟社区文档 |
| 当天任务没完成 | 中 | 整体顺延 | 每天下午6点 checkpoint · 未完成项顺延不超阶段1天 |
09 每日开发工作流
┌──────────────────────────────────────────────────────┐
│ 1. Windows: Claude Code + DeepSeek v4-pro 生成代码 │
│ 2. 本地快速语法检查 / 单元测试 │
│ 3. scp → Pi ~/brain-light/ 部署 │
│ 4. VNC 连接 Pi → python3 main.py → 观察运行效果 │
│ 5. 有问题 → 回 Windows Claude Code 修 → 再部署 │
│ 6. 功能确认 → git commit │
│ 7. 每日 18:00 checkpoint → 记录进度+阻塞项 │
└──────────────────────────────────────────────────────┘
10 未来提升方向(不纳入本周)
| 方向 | 说明 | 实现思路 |
|---|---|---|
| 互联网远程控灯 | 另一台 Pi 通过互联网订阅脑波流,异地控灯 | 利用已有代理工具暴露 TCP :9527 → 远程 Pi 连公网地址 |
| 双向映射 | 两人各戴 TGAM+各有一灯,A 脑波→B 灯、B 脑波→A 灯 | TCP 双发 + 各自 mapper 独立 |
| 移动端 App | 手机替代 Web 仪表盘,更便携 | 连 Pi TCP :9527 或直接蓝牙连 TGAM |
| 佩戴产品化 | 3D 打印外壳+头带,隐藏所有线 | Fusion 360 建模 → 淘宝 3D 打印 ¥30 |
| 多灯光模式 | 阅读/冥想/影音/睡眠模式自动切换 | config.yaml 预设多套映射表 |
| 云端存储 | 脑波历史上传,长期趋势+睡眠报告 | SQLite 本地 → 定期同步云端 |
| 智能家居联动 | 检测到睡着→触发语音助手"晚安"场景 | Home Assistant API / 关窗帘+设闹钟 |