概述
App Inventor 2内置了多种传感器组件,可以直接读取手机的硬件传感器数据。本文介绍三种最常用的传感器:
| 传感器组件 | 功能 | 典型应用 |
|---|---|---|
| LocationSensor | GPS定位、经纬度、速度 | 地图导航、运动追踪、地理围栏 |
| OrientationSensor | 方向角、倾斜角 | 电子罗盘、水平仪、游戏控制 |
| AccelerometerSensor | 加速度、摇晃检测 | 计步器、摔倒检测、摇晃操作 |
LocationSensor(位置传感器)
组件位置
组件面板 → Sensors → LocationSensor
核心属性
| 属性 | 类型 | 说明 |
|---|---|---|
| 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(方向传感器)
组件位置
组件面板 → Sensors → OrientationSensor
核心属性
| 属性 | 类型 | 说明 |
|---|---|---|
| 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值 | 方向 |
|---|---|
| 0° | 北 |
| 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(加速度传感器)
组件位置
组件面板 → Sensors → AccelerometerSensor
核心属性
| 属性 | 类型 | 说明 |
|---|---|---|
| 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信号弱
解决方案:
- 确保手机设置中开启了位置服务
- 在室外测试GPS定位
- 使用
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 🐝 整理。
扫码添加客服咨询