Sensor感应器介绍

article/2025/8/14 19:12:49

本文实例讲述了Android基于Sensor感应器获取重力感应加速度的方法。分享给大家供大家参考,具体如下:

FETC项目指导老师提出了新的需求,想要在游戏地图中表现出用户用户当期移动的方向,再用GPS的话显然很不靠谱,所以想到了android强大的感应器。。。

很多移动设备都内置了感应器,android通过Sensor和SensorManager类抽象了这些感应器,通过这些类可以使用android设备的传感器

一 介绍Sensor类

SDK只有一句介绍“Class representing a sensor. Use getSensorList(int) to get the list of available Sensors.”,表示一个感应器的类,可以使用getSensorList方法(此方法属于接下来要讲的SensorManager)获得所有可用的感应器,该方法返回的是一个List<Sensor>

下面的列表显示了,Sensor所提供的所有服务

Constants
int     TYPE_ACCELEROMETER     A constant describing an accelerometer sensor type.
//三轴加速度感应器 返回三个坐标轴的加速度  单位m/s2
int     TYPE_ALL     A constant describing all sensor types.                   
//用于列出所有感应器
int     TYPE_GRAVITY     A constant describing a gravity sensor type.              
//重力感应器
int     TYPE_GYROSCOPE     A constant describing a gyroscope sensor type          
//陀螺仪 可判断方向 返回三个坐标轴上的角度
int     TYPE_LIGHT     A constant describing an light sensor type.               
//光线感应器 单位 lux 勒克斯
int     TYPE_LINEAR_ACCELERATION     A constant describing a linear acceleration sensor type.
//线性加速度
int     TYPE_MAGNETIC_FIELD     A constant describing a magnetic field sensor type.            
  //磁场感应 返回三个坐标轴的数值  微特斯拉
int     TYPE_ORIENTATION     This constant is deprecated. use SensorManager.getOrientation() instead.
//方向感应器 已过时 可以使用方法获得
int     TYPE_PRESSURE     A constant describing a pressure sensor type                           
//压力感应器  单位 千帕斯卡
int     TYPE_PROXIMITY     A constant describing an proximity sensor type.                        
//距离传感器
int     TYPE_ROTATION_VECTOR     A constant describing a rotation vector sensor type.           
//翻转传感器
int     TYPE_TEMPERATURE     A constant describing a temperature sensor type                
//温度传感器 单位 摄氏度

此类中包含的方法都是get型的 用来获取所选sensor的一些属性,sensor类一般不需要new而是通过SensorManager的方法获得

二 介绍SensorManager类

SDK解释:“SensorManager lets you access the device's sensors. Get an instance of this class by calling Context.getSystemService() with the argument SENSOR_SERVICE.
Always make sure to disable sensors you don't need, especially when your activity is paused. Failing to do so can drain the battery in just a few hours. Note that the system will not disable sensors automatically when the screen turns off. ”
SensorManager 允许你访问设备的感应器。通过传入参数SENSOR_SERVICE参数调用Context.getSystemService方法可以获得一个sensor的实例。永远记得确保当你不需要的时候,特别是Activity暂定的时候,要关闭感应器。忽略这一点肯能导致几个小时就耗尽电池,注意当屏幕关闭时,系统不会自动关闭感应器。

三 常用的感应器

(1) 加速度感应器

可以通过这个感应器获得三个浮点型

x-axis
y-axis
z-axis

可参阅《android 高级编程2》中的一个插图分析次数据

 

X Y Z分别对应values[0]到[2]
X表示左右移动的加速度
Y表示前后移动的加速度

Z表示垂直方向的加速度 (测试时发现,将手机置于水平桌面稳定后 XY均为0 Z的值为9.4 约等于重力加速度,依次可以做一个简单的算法实现重力测力计,有时间会给大家一个例子)

下面先看一个基本的获取加速的demo,希望大家好好注意代码中的注释

/*
 * @author octobershiner
 * 2011 07 27
 * SE.HIT
 * 一个演示android加速度感应器的例子
 * */
package uni.sensor;
import java.util.Iterator;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Log;
public class SensorDemoActivity extends Activity {
  /** Called when the activity is first created. */
  //设置LOG标签
  private static final String TAG = "sensor";
  private SensorManager sm;
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    //创建一个SensorManager来获取系统的传感器服务
    sm = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
    //选取加速度感应器
    int sensorType = Sensor.TYPE_ACCELEROMETER;
    /*
     * 最常用的一个方法 注册事件
     * 参数1 :SensorEventListener监听器
     * 参数2 :Sensor 一个服务可能有多个Sensor实现,此处调用getDefaultSensor获取默认的Sensor
     * 参数3 :模式 可选数据变化的刷新频率
     * */
    sm.registerListener(myAccelerometerListener,sm.getDefaultSensor(sensorType),SensorManager.SENSOR_DELAY_NORMAL);
  }
  /*
   * SensorEventListener接口的实现,需要实现两个方法
   * 方法1 onSensorChanged 当数据变化的时候被触发调用
   * 方法2 onAccuracyChanged 当获得数据的精度发生变化的时候被调用,比如突然无法获得数据时
   * */
  final SensorEventListener myAccelerometerListener = new SensorEventListener(){
    //复写onSensorChanged方法
    public void onSensorChanged(SensorEvent sensorEvent){
      if(sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
        Log.i(TAG,"onSensorChanged");
        //图解中已经解释三个值的含义
        float X_lateral = sensorEvent.values[0];
        float Y_longitudinal = sensorEvent.values[1];
        float Z_vertical = sensorEvent.values[2];
        Log.i(TAG,"\n heading "+X_lateral);
        Log.i(TAG,"\n pitch "+Y_longitudinal);
        Log.i(TAG,"\n roll "+Z_vertical);
      }
    }
    //复写onAccuracyChanged方法
    public void onAccuracyChanged(Sensor sensor , int accuracy){
      Log.i(TAG, "onAccuracyChanged");
    }
  };
  public void onPause(){
    /*
     * 很关键的部分:注意,说明文档中提到,即使activity不可见的时候,感应器依然会继续的工作,测试的时候可以发现,没有正常的刷新频率
     * 也会非常高,所以一定要在onPause方法中关闭触发器,否则讲耗费用户大量电量,很不负责。
     * */
    sm.unregisterListener(myAccelerometerListener);
    super.onPause();
  }
}
测试的时候会发现刷新的特别快,这就引出一个问题,如果真的要呈现在UI中的话,就会不断的绘制界面,非常耗费资源,所以《android高级编程》中给出了一个方案就是引入新的线程来刷新界面


http://chatgpt.dhexx.cn/article/VGXSeluY.shtml

相关文章

单片机之振动传感器

那我们现在就开始来学习我们的振动传感器 振动传感器 电路原理图如下&#xff1a; 原理&#xff1a; 管内有一跟固定的导线&#xff0c;在这根导线的周围有另一根较细的导线以螺旋状环绕它。可以想象为一个弹簧旁边有一跟导线。在不振动时&#xff0c;两根导线不会相碰&#…

stm32的简易小项目之震动感应灯

文章目录 一、原理二、硬件三、接口说明四、源代码五、中断配置六、完整代码 一、原理 需要一个震动感应器来感应是否产生震动&#xff0c;然后把这个震动感应器作为GPIO输入&#xff0c;单片机来读取这个输入是否产生震动。如果产生震动&#xff0c;我们就可以把一个GPIO作为…

【传感器大赏】压电薄膜震动传感器

Grove-Piezo Vibration Sensor Grove - Piezo Vibration传感器适用于弹性&#xff0c;振动&#xff0c;冲击和触感的测量。该模块基于PZT薄膜传感器LDT0-028。当传感器来回移动时&#xff0c;其中的电压比较器将产生一定的电压。宽动态范围&#xff08;0.1Hz~180Hz&#xff09;…

振动传感器应用电路

传感器采用“801S振动传感器”&#xff0c;该传感器性能比较好。极宽的震动侦测范围.无方向限制。可以用用于汽车/摩托车防盜报警器/器, 電子鎖.安防系列产品等。 原理图如下&#xff1a;&#xff08;Multisim 10.1仿真通过&#xff0c;实际焊接测试也通过&#xff09; 经过测试…

震动传感器使用

震动传感器上有四个引脚&#xff0c;一个VCC,一个GND,一个DO,一个AO。我们使用到的是VCC,GND,DO。 VCC与GND不用多说&#xff0c;接电源和接地用的。使用杜邦线连接 VCC-5v,GND-GND,DO-P3.3。这时已经将c51单片机和传感器连接好了。下面可以输入代码了&#xff1a; 使用单片机上…

Arduino压电震动传感器

Arduino压电震动传感器 读取震动传感器的模拟值&#xff0c;串口输出&#xff1b;按压震动传感器控制LED灯亮灭。 外观 接线 Arduino震动传感器5V5VGNDGNDA0A02D0 读取模拟值时&#xff0c;D0不用接。A0模拟信号输出&#xff0c;D0TTL电平输出。 串口读取模拟值 void set…

振动传感器介绍

1. 工作电压 &#xff1a;3.3V或5V2. 工作电流 &#xff1a;<1mA3. 工作温度范围&#xff1a;&#xff0d;10℃&#xff5e;&#xff0b;70℃4. 接口类型&#xff1a;模拟信号输出5. 尺寸大小&#xff1a;30mm x 23mm6. 重量大小&#xff1a;5g7.引脚定义&#xff1a;S信号输…

震动传感器应用

1.震动传感器模块外部照片 2.新建shake工程 ①在USER中新建shake文件夹&#xff0c;并且在其中新建shake.c、shake.h文件 ②在Keil5中添加shake.c&#xff08;直接添加&#xff09;&#xff0c;shake.h&#xff08;现在shake.c中#include “shake.h”然后编译后自动添加了sha…

无线震动传感器

无线振动传感器是一种能够检测物体振动情况的设备&#xff0c;它可以通过无线网络与其他设备进行通信&#xff0c;实现物联网系统的数据采集和远程监控。无线振动传感器的工作原理是基于振动传感器的原理。当物体发生振动时&#xff0c;振动传感器会产生电信号&#xff0c;传感…

震动传感器(模拟和数字)

index 数字震动传感器简介产品参数连线图示例代码结果 震动传感器2用途&#xff1a;模块特色&#xff1a;模块使用说明&#xff1a;实验器材&#xff1a;Arduino 168P 基础套件 互动媒体实验目的&#xff1a;实验电路&#xff1a;实验原理&#xff1a;实验步骤&#xff1a;实验…

计算机网络的类别

计算机网络的类别 1. 按覆盖的地理范围分 1.1 互联网(internet) 互联网又称网际网络&#xff0c;或音译因特网(Internet)、英特网&#xff0c;互联网始于1969年美国的阿帕网。是网络与网络之间所串连成的庞大网络&#xff0c;这些网络以一组通用的协议相连&#xff0c;形成逻…

网络类型与网络拓扑

网络类型与网络拓扑 局域网、城域网、广域网 按照地理覆盖范围来划分、网络可以分为局域网&#xff08;Local Area Network&#xff09;、城域网&#xff08;Metropolitan Area Network&#xff09;和广域网&#xff08;Wide Area Network&#xff09;。 局域网&#xff08;…

计算机网络分类

概述&#xff1a; 什麽是网络&#xff1f; 网络就是在一定区域内将两台或两台以上的计算机以一定的方式连接起来&#xff0c;起到共享文件、程序、数据的作用。 网络的分类&#xff1a; 1.按照覆盖范围分&#xff1a; 局域网&#xff08;LAN-Local Area Network&#xff09…

网络连接类型区分

说明&#xff1a;不定期更新 日期&#xff1a;2019-12-24 参考&#xff1a;已在文章中标注 网络连接类型区分&#xff08;e.g. LAN, WAN) 网络分类 有线连接网络&#xff1a;WAN(宽带) LAN(~以太网) ADSL(电话线) 拨号上网 无线连接网络: WLAN, Bluetooth, 4G 虚拟专用网络&a…

计算机网络-网络类别[#1]

文章目录 前言基础概念网络类别作用范围使用者分类拓扑结构交换技术 前言 作为一名CRUD的业务工程师&#xff0c;在实际开发中&#xff0c;我们接触的最多最近却最容易不受重视的技术可能就是计算机网络了&#xff0c;通常我们深陷于业务需求->开发的重复劳动中&#xff0c…

各种分类网络

20问--各种网络类 LeNet各层参数1、Input层2、C1卷积层3、S2池化层&#xff08;下采样层&#xff09;4、C3卷积层5、S4池化层&#xff08;下采样层&#xff09;6、C5卷积层7、F6全连接层8、Output层-全连接层 AlexNet网络亮点&#xff1a;Alexnet数据增强操作&#xff1a;局部相…

什么是计算机网络网络?网络分类,网络参考模型,网络拓扑分类,网络性能指标。

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「专栏简介」&#xff1a;此文章已录入专栏《计算机网络零基础快速入门》 学习目标 了解什么是网络&#xff0c;有哪几种网络&#xff1f;了…

计算机网络基础 — 网络的类型

目录 文章目录 目录局域网(LAN)城域网(MAN)广域网(WAN)互联网(Internet)万维网(WWW)局域网(LAN) LAN(Local Area Network,本地局域网),使用集线器(Hub)或交换机(Switch)等设备连接起来的计算机处于一个 LAN。一个 LAN 表示一个广播域,LAN 中所有成员都会…

网络的分类(计算机网络)

目录 ​编辑 1&#xff0e;按网络的拓扑结构分类 2&#xff0e;按服务方式分类 1&#xff0e;按网络的拓扑结构分类 网络的拓扑结构是指网络中通信线路和站点&#xff08;计算机或设备&#xff09;的几何排列形式。 ⑴ 星型网络&#xff1a; 各站点通过点到点的链路与中心…

【网络类型】

网络类型 网络类型—根据数据链路层所使用的协议及规则来进行划分 P2P网络 — 点到点网络 MA网络 — 多点接入网络 — BMA 广播型多点接入网络 — NBMA 非广播型多点接入 数据链路层协议 以太网协议 ---- 封装数据帧&#xff0c;需要借助源MAC地址和目标MAC地址 &#xff…