alxndrchernov/auto-lamp
GitHub: alxndrchernov/auto-lamp
通过 USB 连接的 RF-NANO 射频桥接,从 PC 端跨平台控制小米显示器挂灯的开关、亮度与色温,无需树莓派或原始遥控器。
Stars: 0 | Forks: 0
# auto-lamp
通过 USB 从任何计算机控制 **小米米家显示器挂灯 (MJGJD01YL)**,使用一块廉价的 **RF-NANO** 开发板(Arduino Nano + nRF24L01)作为 2.4 GHz 无线电桥接。
```
PC ──USB/serial── RF-NANO (ATmega328P + nRF24L01) ──2.4 GHz RF── Light Bar
host CLI / library generic serial bridge firmware Telink TLSR8368
```
与大多数现有项目不同,本项目是**由主机驱动**的:无线电逻辑存在于一个小型固件中,该固件通过串口使用纯文本协议进行通信,并由一个跨平台的主机程序(此处的 Go CLI)进行驱动。你**不**需要 Raspberry Pi,也**不**需要原始遥控器——请参阅[配对](#pairing-no-remote-needed)。
## 我们使用的硬件
| 部件 | 具体型号 | 备注 |
|------|-------------|-------|
| 台灯 | **小米米家显示器挂灯 `MJGJD01YL`** | 由无线旋转遥控器控制的非 BLE 版本 |
| 无线电桥接 | **RF-NANO**(带有板载 nRF24L01 的 Arduino Nano 克隆版) | 在我们的设备上为 `CE=D10`, `CSN=D9`(某些修订版可能会互换) |
| 数据线 | USB → Mini/Micro-USB | 取决于你的 RF-NANO 使用的接口 |
普通的 Arduino Nano + 独立的 nRF24L01+ 模块也可以工作;只需连接 `CE`/`CSN`/SPI 并在固件中调整引脚 `#define` 即可。
台灯遥控器使用的是 Telink TLSR8368,在 PHY 层*几乎*与 nRF24 兼容,这正是实现此 hack 的基础。
## 工作原理
* 只有遥控器(以及我们的桥接器)会进行发射;台灯是一个纯粹的接收器,就像无线鼠标的接收器一样。没有确认机制或配对加密。
* 台灯接受来自它绑定的任何 3 字节“遥控器 ID”的命令。
* 你可以通过在台灯通电后的短时间内发送 `reset` 命令,将台灯绑定到**你选择的任何 ID**。不需要原始遥控器。
完整的字节级详情:[`docs/PROTOCOL.md`](docs/PROTOCOL.md)。
## 快速开始
### 1. 烧录固件
使用 [PlatformIO](https://platformio.org/):
```
cd firmware
pio run -t upload
```
在 nRF24 初始化完成后,开发板会在启动时通过串口打印 `READY`。
### 2. 构建主机 CLI
需要 Go 1.22+。
```
go build -o lamp ./cmd/lamp
```
### 3. 配对(无需遥控器!)
```
./lamp pair --port /dev/cu.usbserial-10 # macOS example; pick your port
# Linux: /dev/ttyUSB0
# Windows: COM3
```
按照提示操作:拔下台灯,重新插上,然后在几秒钟内按下 Enter 键。当台灯绑定到所选 ID(默认为 `11:11:11`)时,它会**闪烁一次**。端口和 ID 会保存到配置文件中,因此之后你可以省略 `--port`。
### 4. 控制它
```
./lamp on # on/off (it is a single toggle)
./lamp bright +5 # brightness up (step 1..15)
./lamp bright -3 # brightness down
./lamp warm +5 # cooler (see note in CLI reference)
./lamp warm -2 # warmer
```
## CLI 参考
```
lamp [--port DEV] [arg]
pair [AA:BB:CC] Bind the lamp to an ID of your choice (no original remote needed).
Defaults to the saved ID, then to 11:11:11.
scan Listen for the original remote's ID and save it (Ctrl-C to stop).
set-id [AA:BB:CC] Write a Remote ID to firmware EEPROM + config manually.
on / off Toggle the lamp (same code; the lamp has no discrete on/off).
bright +N | -N Brightness step, N = 1..15.
warm +N | -N Colour-temperature step, N = 1..15.
reset Factory-reset the lamp.
config Show the saved port and ID.
--port DEV Serial device. Defaults to config, then /dev/ttyUSB0.
```
**备注 / 注意事项**
* `on` 和 `off` 发送**相同**的切换代码(`0x01 0x00`);该协议没有绝对的开/关。每次调用都会翻转当前状态。
* `warm +N` 当前发送*冷色*代码(`0x02`),而 `warm -N` 发送*暖色*代码(`0x03`)。可随意重命名——请参阅 [`TODO.md`](TODO.md)。
* 不要同时运行两个 `lamp` 进程 → `Serial port busy`。
* 亮度/暖度值为带符号的(`-3`),需手动解析,以免 shell/flags 在处理前导 `-` 时出错。
## 项目结构
```
lib/
├── firmware/
│ ├── platformio.ini # PlatformIO: atmelavr / nanoatmega328new / RF24
│ ├── src/main.cpp # serial-bridge firmware (protocol + UART parser)
│ └── sws_reader/ # optional: read the remote's ID off its Telink chip via SWS
├── cmd/lamp/main.go # host CLI
├── internal/
│ ├── config/ # config file (~/.config/lamp/config.json)
│ └── serial/ # serial port wrapper (115200, READY handshake)
├── docs/PROTOCOL.md # byte-level protocol + attribution
├── TODO.md # roadmap to turn this into a real library
├── go.mod # module: github.com/alxndrchernov/auto-lamp
└── LICENSE
```
## 致谢
* **协议逆向工程:**
[lamperez/xiaomi-lightbar-nrf24](https://github.com/lamperez/xiaomi-lightbar-nrf24)
— 数据包格式、CRC 参数、命令代码以及电源循环配对技巧均出自此项工作。
* 相关实现与先例技术:
* [ebinf/lightbar2mqtt](https://github.com/ebinf/lightbar2mqtt) — ESP32 + MQTT / Home Assistant
* [BAJ810/xiaomi-lightbar-nrf24-esp32](https://github.com/BAJ810/xiaomi-lightbar-nrf24-esp32)
* [eugene-reim/lightbar2mqtt-esp8268](https://github.com/eugene-reim/lightbar2mqtt-esp8268)
* [benallen-dev/xiaomi-lightbar](https://github.com/benallen-dev/xiaomi-lightbar) — Arduino Nano sketch
本项目在上述基础之上增加了:**主机驱动、跨平台**的控制路径(PC ↔ USB-serial ↔ 通用桥接固件),以及一种**配对优先**的工作流程,既不需要 Raspberry Pi,也不需要原始遥控器。
## 许可证
MIT — 请参阅 [LICENSE](LICENSE)。
标签:Arduino, Go语言, 射频通信, 小米智能设备, 嵌入式开发, 日志审计, 物联网控制, 硬件桥接, 程序破解