QPython 中文文档 下载 App

QPython 传感器自动化——从数据采集到自动触发动作

核心思路

传感器自动化的基本模式是:持续读取传感器数据 → 判断是否满足某个条件 → 如果满足就执行动作。这个模式可以应用在很多场景:

基本框架

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. 忽略电池优化

3. 防止休眠

调用 droid.wakeLockAcquire() 获取唤醒锁,防止屏幕熄灭时 CPU 停转。用完记得 droid.wakeLockRelease() 释放。

4. 定时心跳

每隔几分钟让脚本执行一个轻量操作(如写一行日志、发一个 Toast),让 Android 认为脚本还有活干。

注意事项

电量消耗

传感器持续运行非常耗电。实用建议:

传感器编号

不同 QSL4A 版本的传感器编号可能略有不同。建议先查 QSL4A 官方文档或在 REPL 里试:

droid.startSensingTimed(1, 1000)  # 试 1(加速度计)
events = droid.sensorsGetEventBuffered().result
droid.stopSensing()
# 看 events 里返回的是什么

多传感器同时监听

某些版本的 startSensingTimed 只支持同时监听一种传感器。如果需要同时监听多个(如加速度计 + 光线),可能需要分别启动和轮询。

小结

传感器自动化是 QPython 最具特色的用法之一——用 Python 把手机变成一个可编程的 IoT 设备。基本框架就是「读数据 → 判条件 → 执行动」。让脚本长时间运行需要解决 Android 后台问题(前台服务、忽略电池优化),同时注意控制电量消耗。

继续看 FullScreenWrapper2 UI 框架,了解如何用 Python 在 Android 上构建界面。