QPython 传感器自动化——从数据采集到自动触发动作
核心思路
传感器自动化的基本模式是:持续读取传感器数据 → 判断是否满足某个条件 → 如果满足就执行动作。这个模式可以应用在很多场景:
- 检测到手机被晃动 → 自动拍照 + 发送通知(防盗)
- 光线变暗 → 自动提高屏幕亮度
- GPS 到达某个位置 → 自动记录位置或发短信
- 温度过高 → 自动开通知提醒
基本框架
from androidhelper import Android
import time
droid = Android()
# 1. 启动传感器
droid.startSensingTimed(1, 1000) # 加速度计,1 秒一次
try:
while True:
# 2. 读取数据
events = droid.sensorsGetEventBuffered().result
# 3. 判断条件
if events:
latest = events[-1]
z_accel = latest.get("z", 9.8)
if abs(z_accel) > 20: # 阈值:检测到异常晃动
# 4. 执行动作
droid.makeToast("检测到手机晃动!")
droid.takePicture("suspicious.jpg")
time.sleep(1)
except KeyboardInterrupt:
# 5. 停止传感器
droid.stopSensing()
print("已停止")
实用场景一:到点自动拍照
# 每 5 分钟拍一次照,用于监控场景
from androidhelper import Android
import time
import subprocess
droid = Android()
# 确保 GPS 定位开启
droid.startLocating()
while True:
# 获取当前时间
from datetime import datetime
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
# 拍照
photo_path = f"monitor_{timestamp}.jpg"
droid.takePicture(photo_path)
# 获取 GPS 并记录
location = droid.getLastKnownLocation().result
with open("location_log.txt", "a") as f:
f.write(f"{timestamp}, {location.get('latitude')}, {location.get('longitude')}\n")
# 等 5 分钟
time.sleep(300)
实用场景二:光线自动调节
# 光线变暗时提高屏幕亮度,变亮时降低
import time
from androidhelper import Android
droid = Android()
droid.startSensingTimed(5, 2000) # 光线传感器,2 秒一次
try:
while True:
events = droid.sensorsGetEventBuffered().result
if events:
latest = events[-1]
light = latest.get("lux", 500) # 单位:勒克斯
if light < 100: # 很暗
droid.setScreenBrightness(200)
elif light > 5000: # 很亮
droid.setScreenBrightness(80)
time.sleep(2)
finally:
droid.stopSensing()
注意:setScreenBrightness 在部分 ROM 上受限,可能静默失败。
实用场景三:步数计数器(完整版)
# 简化版步数统计
import time
from androidhelper import Android
droid = Android()
droid.startSensingTimed(1, 200) # 加速度计,200ms 采样
step_count = 0
last_z = 9.8
last_state = "up"
try:
while True:
events = droid.sensorsGetEventBuffered().result
if events:
latest = events[-1]
z = latest.get("z", 9.8)
# 过零检测:z 轴加速度从高变低算一步(简化逻辑)
if last_z > 9.8 and z < 9.8 and last_state == "up":
step_count += 1
droid.makeToast(f"步数: {step_count}")
last_state = "down"
elif z > 9.8:
last_state = "up"
last_z = z
time.sleep(0.2)
except KeyboardInterrupt:
droid.stopSensing()
print(f"最终步数: {step_count}")
让自动化脚本长时间运行
Android 对后台进程很不友好。让脚本持续运行需要:
1. 前台服务
QPython 的某些版本支持用 droid.foregroundStart() 启动前台服务,脚本会在通知栏显示持续运行状态。这能让 Android 认为 QPython 是一个需要持续运行的 App,不容易被杀。
2. 忽略电池优化
- 系统设置 → 应用管理 → QPython → 电池优化 → 设为「无限制」
- 或者 QPython 设置里找到「后台保护」选项打开
3. 防止休眠
调用 droid.wakeLockAcquire() 获取唤醒锁,防止屏幕熄灭时 CPU 停转。用完记得 droid.wakeLockRelease() 释放。
4. 定时心跳
每隔几分钟让脚本执行一个轻量操作(如写一行日志、发一个 Toast),让 Android 认为脚本还有活干。
注意事项
电量消耗
传感器持续运行非常耗电。实用建议:
- 采样频率别设太高(1 秒一次通常足够)
- 条件判断加去抖(连续几次满足才触发)
- 长时间运行时务必插着充电器
- 用完立即
stopSensing()
传感器编号
不同 QSL4A 版本的传感器编号可能略有不同。建议先查 QSL4A 官方文档或在 REPL 里试:
droid.startSensingTimed(1, 1000) # 试 1(加速度计)
events = droid.sensorsGetEventBuffered().result
droid.stopSensing()
# 看 events 里返回的是什么
多传感器同时监听
某些版本的 startSensingTimed 只支持同时监听一种传感器。如果需要同时监听多个(如加速度计 + 光线),可能需要分别启动和轮询。
小结
传感器自动化是 QPython 最具特色的用法之一——用 Python 把手机变成一个可编程的 IoT 设备。基本框架就是「读数据 → 判条件 → 执行动」。让脚本长时间运行需要解决 Android 后台问题(前台服务、忽略电池优化),同时注意控制电量消耗。
继续看 FullScreenWrapper2 UI 框架,了解如何用 Python 在 Android 上构建界面。