App Inventor 2 传感器应用教程 - 位置/方向/加速度传感器

« 返回首页

概述

App Inventor 2内置了多种传感器组件,可以直接读取手机的硬件传感器数据。本文介绍三种最常用的传感器:

传感器组件 功能 典型应用
LocationSensor GPS定位、经纬度、速度 地图导航、运动追踪、地理围栏
OrientationSensor 方向角、倾斜角 电子罗盘、水平仪、游戏控制
AccelerometerSensor 加速度、摇晃检测 计步器、摔倒检测、摇晃操作

LocationSensor(位置传感器)

组件位置

组件面板 → SensorsLocationSensor

核心属性

属性 类型 说明
Enabled boolean 是否启用传感器
Accuracy number 精度等级(只读)
Latitude number 纬度(只读)
Longitude number 经度(只读)
Altitude number 海拔高度(只读,米)
Speed number 速度(只读,m/s)
HasAccuracyLongitudeLatitude boolean 是否有经纬度数据
ProviderName text 定位提供者(GPS/Network)
DistanceInterval number 最小更新距离(米)

核心事件

事件 参数 说明
LocationChanged latitude, longitude, altitude, speed 位置变化时触发

基本用法:获取当前位置

当 Screen1.初始化
  设 LocationSensor1.启用 = true

当 LocationSensor1.位置改变(纬度, 经度, 海拔, 速度)
  标签_经度.文本 = "经度:" & 经度
  标签_纬度.文本 = "纬度:" & 纬度
  标签_海拔.文本 = "海拔:" & 数学.保留小数(海拔, 1) & "米"
  标签_速度.文本 = "速度:" & 数学.保留小数(速度 * 3.6, 1) & "km/h"

注意事项

  • 首次定位需要时间(GPS冷启动约30-60秒)
  • 室内GPS信号弱,建议在室外测试
  • Android 6.0+需要动态申请位置权限
  • DistanceInterval 设大一点可以省电(如10米)

OrientationSensor(方向传感器)

组件位置

组件面板 → SensorsOrientationSensor

核心属性

属性 类型 说明
Enabled boolean 是否启用
Yaw number 偏航角/方位角(0-360°,北=0)
Pitch number 俯仰角(-180~180°,手机前后倾斜)
Roll number 翻滚角(-90~90°,手机左右倾斜)
Magnitude number 倾斜总量
Angle number 倾斜方向角度

核心事件

事件 参数 说明
OrientationChanged yaw, pitch, roll 方向变化时触发

方位角(Yaw)对照表

Yaw值 方向
45° 东北
90°
135° 东南
180°
225° 西南
270° 西
315° 西北

实战:电子罗盘

使用Canvas绘制指南针:

当 OrientationSensor1.方向改变(偏航, 俯仰, 翻滚)
  设 标签_方位.文本 = 偏航转方向(偏航) & " " & 数学.保留小数(偏航, 1) & "°"
  调用 画布1.清除()
  调用 绘制指南针(画布1, 偏航)

定义 偏航转方向(角度) 返回 方向
  如果 角度 ≥ 337.5 或 角度 < 22.5
    返回 "北"
  否则 如果 角度 < 67.5
    返回 "东北"
  否则 如果 角度 < 112.5
    返回 "东"
  否则 如果 角度 < 157.5
    返回 "东南"
  否则 如果 角度 < 202.5
    返回 "南"
  否则 如果 角度 < 247.5
    返回 "西南"
  否则 如果 角度 < 292.5
    返回 "西"
  否则
    返回 "西北"

AccelerometerSensor(加速度传感器)

组件位置

组件面板 → SensorsAccelerometerSensor

核心属性

属性 类型 说明
Enabled boolean 是否启用
XAccel number X轴加速度(m/s²)
YAccel number Y轴加速度(m/s²)
ZAccel number Z轴加速度(m/s²,静止约9.8)
Sensitivity number 摇晃灵敏度(1-3,1最灵敏)
MinimumInterval number 最小触发间隔(毫秒)

核心事件

事件 参数 说明
AccelerationChanged xAccel, yAccel, zAccel 加速度变化时触发
Shaking 检测到摇晃时触发

摇晃检测

当 AccelerometerSensor1.摇晃
  ' 随机换色
  设 颜色列表 = [红色, 蓝色, 绿色, 黄色, 紫色]
  设 随机色 = 列表第(数学.随机整数(1, 5))项(颜色列表)
  设 标签_背景.背景颜色 = 随机色

实战:摔倒检测

通过检测加速度突变来判断摔倒:

设 上次加速度 = 0
设 检测阈值 = 20  ' m/s²,正常活动约10-15
设 摔倒检测中 = false

当 AccelerometerSensor1.加速度改变(x, y, z)
  设 合加速度 = 数学.平方根(x*x + y*y + z*z)
  
  如果 合加速度 > 检测阈值 且 非 摔倒检测中
    设 摔倒检测中 = true
    ' 等待2秒检测是否还在运动
    调用 时钟_摔倒检测.启动()
    
当 时钟_摔倒检测.计时
  调用 时钟_摔倒检测.停止()
  设 当前加速度 = 数学.平方根(
    AccelerometerSensor1.X轴加速度^2 + 
    AccelerometerSensor1.Y轴加速度^2 + 
    AccelerometerSensor1.Z轴加速度^2)
  
  ' 如果剧烈加速后又静止,可能是摔倒
  如果 当前加速度 < 9.5 或 当前加速度 > 11
    调用 发送报警.发送短信("18888888888", "检测到可能的摔倒!请确认安全!")
    调用 通知.显示信息("⚠️ 摔倒报警", "已发送紧急短信")
  
  设 摔倒检测中 = false

实战:防近视提醒App

检测手机倾斜角度(低头看手机=近视姿势),长时间低头提醒:

设 低头计数 = 0
设 提醒阈值 = 30  ' 30秒低头触发提醒

当 OrientationSensor1.方向改变(偏航, 俯仰, 翻滚)
  ' 俯仰角 > 30度表示低头
  如果 俯仰 > 30
    设 低头计数 = 低头计数 + 1
    如果 低头计数 ≥ 提醒阈值
      调用 通知.显示信息("⚠️ 注意用眼姿势", "你已经低头看了" & 低头计数 & "秒了,抬头休息一下吧!")
      调用 振动器.震动()
  否则
    设 低头计数 = 0

传感器组合实战

运动追踪器

结合GPS和加速度传感器:

设 总距离 = 0
设 上次纬度 = 0
设 上次经度 = 0
设 是否运动 = false

当 LocationSensor1.位置改变(纬度, 经度, 海拔, 速度)
  如果 上次纬度 ≠ 0
    设 距离 = 计算两点距离(上次纬度, 上次经度, 纬度, 经度)
    设 总距离 = 总距离 + 距离
  
  设 上次纬度 = 纬度
  设 上次经度 = 经度
  
  设 是否运动 = 速度 > 0.5  ' 0.5 m/s ≈ 1.8 km/h
  设 标签_距离.文本 = "总距离:" & 数学.保留小数(总距离/1000, 2) & "km"
  设 标签_速度.文本 = "速度:" & 数学.保留小数(速度*3.6, 1) & "km/h"

定义 计算两点距离(纬度1, 经度1, 纬度2, 经度2) 返回 距离
  ' Haversine公式(简化版,短距离足够)
  设 R = 6371000  ' 地球半径(米)
  设 dLat = (纬度2 - 纬度1) * 数学.PI / 180
  设 dLon = (经度2 - 经度1) * 数学.PI / 180
  设 a = 数学.正弦(dLat/2)^2 + 数学.余弦(纬度1*数学.PI/180) * 数学.余弦(纬度2*数学.PI/180) * 数学.正弦(dLon/2)^2
  设 c = 2 * 数学.反正切(数学.平方根(a), 数学.平方根(1-a))
  返回 R * c

常见问题

Q1: LocationSensor获取不到位置?

可能原因:

  • 没有授予位置权限(Android 6.0+需要动态授权)
  • GPS未开启
  • 室内GPS信号弱

解决方案:

  1. 确保手机设置中开启了位置服务
  2. 在室外测试GPS定位
  3. 使用 ProviderName 查看当前使用的定位方式

Q2: 传感器数据抖动严重?

解决方案:

  • 使用滑动平均滤波: ``` 设 加速度历史 = 创建空列表 设 窗口大小 = 5

当 AccelerometerSensor1.加速度改变(x, y, z) 设 加速度历史 = 添加列表项(加速度历史, x) 如果 列表长度(加速度历史) > 窗口大小 设 加速度历史 = 取列表子集(加速度历史, 2, 列表长度(加速度历史)) 设 平滑X = 列表求和(加速度历史) / 列表长度(加速度历史) ```

Q3: 传感器很耗电?

省电技巧:

  • LocationSensor设置较大的 DistanceInterval(如50米)
  • AccelerometerSensor设置较大的 MinimumInterval(如200ms)
  • 不使用时关闭传感器(Enabled = false

Q4: OrientationSensor方向角不准确?

方向传感器受附近磁场干扰影响较大。校准方法:手持手机画”8”字形几次。

总结

传感器 更新频率 精度 耗电
LocationSensor 低(按距离/时间) 5-50米
OrientationSensor 高(持续) ±2°
AccelerometerSensor 高(持续) ±0.01 m/s²

使用建议:

  • 不使用时关闭传感器(设 Enabled = false)
  • 合理设置更新频率和间隔
  • 对数据做平滑滤波减少噪声
  • GPS定位在室外效果最佳

版权声明:MIT App Inventor 官方文档采用 CC BY-SA 4.0 授权,本文档由 ai2claw 🐝 整理。

文档反馈