Files
padsleep_adb/README.md
T
kushidouandClaude Fable 5 9940db451f feat: 添加 GPIO 电平检测触发亮屏/息屏
新增 GPIOEventDetector 后台线程,以 50ms 间隔轮询 GPIO 引脚。
检测到电平变化时唤醒屏幕并启动 60 秒倒计时,到期无新变化则息屏。

- 添加 GPIOEventDetector 类,支持 RPi.GPIO 硬读取和 Mock 回退
- 集成到 PadSleepApp 主循环,GPIO 触发优先级高于定时亮屏时段
- TUI 状态面板新增 GPIO 行,显示引脚号和倒计时
- 支持通过配置文件调整引脚号(gpio_pin)和倒计时长度
- install.sh 修复:补装 rpi-lgpio 依赖

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 16:10:42 +08:00

234 lines
6.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# padsleep_adb
基于树莓派,通过 ADB 控制安卓平板自动亮屏和息屏的守护程序。
## 功能特性
- **定时控制**:根据配置的时间段自动亮屏/息屏
- **超时保护**:屏幕亮起超过设定时长且不在亮屏时间段内 → 自动息屏
- **GPIO 触发**:(新增)检测 GPIO 电平变化 → 亮屏 + 60 秒倒计时 → 倒计时结束息屏
- **无线 ADB**:支持通过 TCP/IP 连接安卓设备(无线调试)
- **TUI 管理**:提供终端界面工具,方便查看状态和修改配置
- **IPC 通信**:通过 Unix Socket 与 TUI 工具通信
- **自动重连**:无线连接断开后自动尝试重新连接
## 系统要求
- 树莓派(或其他 Linux 设备)
- Python 3.10+
- ADB (Android Debug Bridge)
- 安卓平板(已开启 USB 调试或无线调试)
## 安装
### 1. 安装系统依赖
```bash
# Debian/Ubuntu
sudo apt update
sudo apt install adb python3-curses
# 树莓派 OS
sudo apt install adb
```
### 2. 安装 Python 依赖
```bash
cd padsleep_adb
pip install -r requirements.txt
```
依赖列表:
- `adbutils>=2.12.0` — Python ADB 库
- `rpi-lgpio>=0.6` — 树莓派 GPIO 控制(仅在树莓派上需要)
### 3. 快速安装
```bash
sudo ./install.sh
```
安装脚本会将程序部署到 `/opt/apps/padsleep`,创建命令行入口和 systemd 服务。
## 使用方法
### 启动守护程序
```bash
# 直接启动
python padsleep.py
# 或使用安装后的命令行入口
padsleep
```
守护程序会自动:
1. 加载配置文件 `config.json`
2. 检测 ADB 设备
3. 启动 GPIO 电平检测(默认 BCM 17
4. 启动 IPC 服务(`/tmp/padsleep.sock`
5. 进入主循环,定期检查屏幕状态
### 启动 TUI 管理工具
```bash
# 新终端窗口
python padsleep_tui.py
# 或使用安装后的命令行入口
padsleep-config
```
TUI 快捷键:
| 按键 | 功能 |
|------|------|
| `↑/k` `↓/j` | 选择亮屏时间段 |
| `A` | 新增亮屏时间段 |
| `E` | 编辑选中时间段 |
| `D` | 删除选中时间段 |
| `S` | 选择 ADB 设备 |
| `W` | 无线连接设备 |
| `R` | 刷新状态 |
| `L` | 重载守护进程配置 |
| `F` | 强制息屏 |
| `N` | 强制亮屏 |
| `T` | 重新连接守护进程 |
| `H` | 显示帮助 |
| `Q` | 退出 |
## 配置说明
配置文件 `config.json` 示例:
```json
{
"screen_on_periods": [
{"start": "08:00", "end": "22:00"}
],
"check_interval_seconds": 30,
"auto_sleep_delay_minutes": 5,
"adb_device_serial": "",
"adb_wireless_host": "",
"adb_wireless_port": 5555,
"adb_wireless_auto_connect": false,
"gpio_enabled": true,
"gpio_pin": 17,
"gpio_countdown_seconds": 60
}
```
### 字段说明
| 字段 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| `screen_on_periods` | array | `[{"start":"08:00","end":"22:00"}]` | 亮屏时间段列表,支持跨天(如 22:00~08:00 |
| `check_interval_seconds` | int | `30` | 检查间隔(秒) |
| `auto_sleep_delay_minutes` | int | `5` | 非亮屏时段屏幕亮起多久后自动息屏(分钟) |
| `adb_device_serial` | string | `""` | 指定 USB 设备 serial,空表示自动选择第一个 |
| `adb_wireless_host` | string | `""` | 无线设备 IP 地址,空表示不使用无线连接 |
| `adb_wireless_port` | int | `5555` | 无线设备端口 |
| `adb_wireless_auto_connect` | bool | `false` | 启动时是否自动连接无线设备 |
| `gpio_enabled` | bool | `true` | 是否启用 GPIO 电平检测 |
| `gpio_pin` | int | `17` | GPIO 引脚号(BCM 编号),如 GPIO17 = 物理 pin 11 |
| `gpio_countdown_seconds` | int | `60` | GPIO 触发后倒计时秒数,到期无新变化则息屏 |
## GPIO 电平检测
> 由于购买的模块有问题,无法稳定输出电平,但是人来人走时会发生短暂电平切换,
> 因此采用这个折中的法子:检测到 GPIO 电平变化就亮屏并重置倒计时,
> 倒计时结束且无新变化则息屏。
### 工作原理
1. **后台线程** 以 50ms 间隔高频轮询 GPIO 引脚
2. **检测到任意电平变化**(上升或下降沿)→ 立即亮屏,重置倒计时
3. **倒计时期间再次触发** → 倒计时重置,保持亮屏
4. **倒计时到期无新变化** → 息屏(除非当前在定时亮屏时段内)
### 决策优先级
```
GPIO 触发(60s 倒计时) > 定时亮屏时段 > 超时息屏
```
### 接线参考
GPIO 引脚号(BCM 编号)对照:
| BCM 编号 | 物理引脚 | 功能 |
|----------|----------|------|
| GPIO17 | Pin 11 | 默认 GPIO 检测引脚 |
| GND | Pin 6 / 9 / 14 / ... | 接地 |
将传感器信号线接 GPIO17,GND 接树莓派 GND 即可。
### 日志记录
所有 GPIO 事件记录在 `padsleep.log` 中:
```
[2026-07-19 15:59:25] GPIO触屏 — BCM 17 电平变化,60s 倒计时
[2026-07-19 15:59:28] GPIO息屏 — BCM 17 在 60s 内无电平变化
```
## 无线 ADB 连接
### 方式一:配置文件预设
`config.json` 中设置:
```json
{
"adb_wireless_host": "192.168.1.100",
"adb_wireless_port": 5555,
"adb_wireless_auto_connect": true
}
```
### 方式二:TUI 手动连接
1. 启动 TUI 工具
2.`W`
3. 输入 IP 地址和端口
4. 确认连接
### 开启安卓设备无线调试
1. 连接 USB,执行 `adb tcpip 5555`
2. 或在设备上:设置 → 开发者选项 → 无线调试 → 开启
### 连接优先级
程序采用 **USB 优先** 策略:
1. 首先尝试 USB 连接
2. 如果 USB 不可用且配置了无线,尝试无线连接
3. 无线连接断开后自动重连(最多 3 次)
## 文件结构
```
padsleep_adb/
├── padsleep.py # 守护程序主程序(含 GPIO 检测)
├── padsleep_tui.py # TUI 管理工具
├── config.json # 配置文件
├── requirements.txt # Python 依赖
├── install.sh # 安装脚本
├── padsleep.service # systemd 服务文件
└── README.md # 本文档
```
## 开发说明
- 在 Windows 上开发,在树莓派上运行
- 使用 `adbutils` 库与 ADB Server 通信
- GPIO 使用 `RPi.GPIO`(通过 `rpi-lgpio` 驱动 `lgpio` 内核模块)
- IPC 使用 Unix Socket + JSON 行协议
- TUI 使用 Python `curses`
- 非树莓派环境 GPIO 自动降级为模拟模式(不影响主功能)
## 许可证
MIT License