w88优德

电子圈

IC热门型号:
您所在的位置:w88优德 > 电子圈 > 元器件知识 > 传感器的组成及常用传感器介绍与用法

在线老虎机真人娱乐场

出处 : 电子发烧友 发布时间 : 2018/11/27 关键词: 传感器 阅读 : 194

摘要:敏感元件直接感受被测量,并输出与被测量有确定关系的物理量信号;转换元件将敏感元件输出的物理量信号转换为电信号;变换电路负责对转换元件输出的电信号进行放大调制;转换元件和变换电路一般还需要辅助w88优德老虎机供电。

传感器的组成

  传感器一般由敏感元件、转换元件、变换电路和辅助w88优德老虎机四部分组成。

  敏感元件直接感受被测量,并输出与被测量有确定关系的物理量信号;转换元件将敏感元件输出的物理量信号转换为电信号;变换电路负责对转换元件输出的电信号进行放大调制;转换元件和变换电路一般还需要辅助w88优德老虎机供电。

  主要功能

  常将传感器的功能与人类5大感觉器官相比拟:

  光敏传感器——视觉

  声敏传感器——听觉

  气敏传感器——嗅觉

  化学传感器——味觉

  压敏、温敏、

  流体传感器——触觉

  敏感元件的分类:

  物理类,基于力、热、光、电、磁和声等物理效应。

  化学类,基于化学反应的原理。

  生物类,基于酶、抗体、和激素等分子识别功能。

  通常据其基本感知功能可分为热敏元件、光敏元件、气敏元件、力敏元件、磁敏元件、湿敏元件、声敏元件、放射线敏感元件、色敏元件和味敏元件等十大类(还有人曾将敏感元件分46类)。
传感器

常用传感器介绍与用法

  Android平台支持三个大类的传感器

  Motion sensors(运动传感器)

  这些传感器测量加速力,并沿三个轴的旋转力。此类别包括加速度计,重力感应器, 陀螺仪和旋转矢量传感器。

  Environmental sensors (环境传感器)

  这些传感器测量各种环境参数,例如环境空气温度和压力,照明和湿度。此类别包括气压计,光度计,和温度计。

  PosiTIon sensors (位置传感器)

  这些传感器测量设备的物理位置。这个类别包括方向传感器和磁力计。

  传感器实现流程

  第一步:得到SensorManager

  SensorManager mSensorManager = (SensorManager) mContext

  .getSystemService(Context.SENSOR_SERVICE);12

  第二步:注册传感器

  Sensor sensor = mSensorManager

  .getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

  if (null != sensor)

  mSensorManager.registerListener(this, sensor,

  SensorManager.SENSOR_DELAY_NORMAL);12345

  registerListener这个方法有三个参数。

  第一个参数是传感器数据变化的监听器

  我们需要去实现SensorEventListener接口,他里面有两个回调方法,

  @Override

  public void onSensorChanged(SensorEvent event) {

  //当传感器的数值发生变化时调用

  }

  @Override

  public void onAccuracyChanged(Sensor sensor, int accuracy) {

  //传感器的精度发生变化时调用

  }123456789

  onSensorChanged方法只有一个SensorEvent类型的参数event,其中SensorEvent类有一个values变量非常重要,该变量的类型是float[]。但该变量最多只有3个元素,而且根据传感器的不同,values变量中元素所代表的含义也不同。

  关于values值的详细含义请看参考文章!!!

  第二个参数是我们需要监听的传感器

  Sensor sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);1

  Sensor.TYPE_ACCELEROMETER则是Android设定传感器类型,这里是指加速度传感器,

  第三个参数是传感器数据更新数据的速度

  有以下四个值可选,他们的速度是递增的

  SENSOR_DELAY_UI

  SENSOR_DELAY_NORMAL

  SENSOR_DELAY_GAME

  SENSOR_DELAY_FASTEST

  传感器的注销

  //注销所有传感器对象

  public voidunregisterListener(SensorEventListener listener)

  //注销指定的传感器对象

  public voidunregisterListener(SensorEventListener listener, Sensor sensor)1234

  sensor的获取依旧是通过SensorManager.getDefaultSensor()方法。

  获得手机支持的所有传感器

  Listsensors = sensorManager.getSensorList(Sensor.TYPE_ALL);1

  Android传感器类型表

  加速度传感器:TYPE_ACCELEROMETER

  以m/s2测量它设备所有三个物理轴线方向(x,y,和z)加速度。

  周围温度传感器:TYPE_AMBIENT_TEMPERATURE

  检测周围空气温度。

  重力传感器:TYPE_GRAVITY

  测量重力

  陀螺仪传感器:TYPE_GYROSCOPE

  以rad/s测量设备三个物理轴线方向(x,y,和z)。旋转速度。

  光照传感器:TYPE_LIGHT

  以lx测量周围的光线级别。

  线性加速度传感器:TYPE_LINEAR_ACCELERATION

  检测沿着一个轴向的加速度。

  磁力传感器:TYPE_MAGNETIC_FIELD

  测量周围的三个物理轴线方向的磁场。

  方向传感器: TYPE_ORIENTATION

  测量设备所有三个物理轴线方向(x,y和x)的旋转角度。

  压力传感器:TYPE_PRESSURE

  测量周围空气气压

  接近传感器:TYPE_PROXIMITY

  检测物体与手机的距离

  相对湿度传感器:TYPE_RELATIVE_HUMIDITY

  检测周围空气相对湿度

  旋转矢量传感器:TYPE_ROTATION_VECTOR

  用于检测运动和检测旋转。

  温度传感器: TYPE_TEMPERATURE

  检测设备的温度

  传感器使用实践

  这里以方向传感器为例

  方向传感器的获取方式

  Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);1

  上面这个,对,已经被google弃用了,了解就好。

  Android中的坐标系

  自己画的有点丑,将就着看吧,Z轴默认垂直于地面,所谓获取的三个Values数组即对应手机与Z,Y,X形成的夹角,后面会说明,

  前面说了,TYPE_ORIENTATION已被弃用,那么最新的方向传感器是如何做的呢?

  事实上,Android 获取手机旋转的方向和角度是通过加速度传感器和地磁传感器共同计算得出的

  OK,我们这时候是需要同时使用两个传感器的,看代码

  Sensor accelerometerSensor = sensorManager.getDefaultSensor(Sensor.

  TYPE_ACCELEROMETER);

  Sensor magneticSensor = sensorManager.getDefaultSensor(Sensor.

  TYPE_MAGNETIC_FIELD);

  sensorManager.registerListener(listener, accelerometerSensor,

  SensorManager.SENSOR_DELAY_GAME);

  sensorManager.registerListener(listener, magneticSensor,

  SensorManager.SENSOR_DELAY_GAME);12345678

  同时使用了加速度传感器和地磁传感器

  获取旋转矩阵数组R

  SensorManager.getRotationMatrix(R, null, accelerometerValues, magneticValues);1

  获取手机旋转数据

  SensorManager.getOrientation(R, values);1

  values 是一个长度为 3 的 float 数组,手机在各个方向上的旋转数据都会被存放到这个数组当中。

  对应关系:

  values[0]-》Z轴、values[1]-》X轴、values[2]-》Y轴

  values[0]的取值范围是-180到180 度,其中±180 度表示正南方向,0 度表示正北方向,-90 度表示正西方向,90 度表示正东方向,如图

  所谓,实践是检验真理的唯一标准,这是我检测后自行画的,大家看一下就明白该怎么根据获取到的角度来做对应的处理了

  一个完整的方向传感器封装类

  public class DirectionSensorUtils implements SensorEventListener {

  private SensorManager sensorManager;

  float[] accelerometerValues = new float[3];

  float[] magneticValues = new float[3];

  float lastRotateDegree;

  private ImageView compassImg;//指南针背景图

  public DirectionSensorUtils(Context context , ImageView compassImg) {

  sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);

  this.compassImg = compassImg;

  }

  //注册传感器

  public void registerSensor(){

  Sensor accelerometerSensor = sensorManager.getDefaultSensor(Sensor.

  TYPE_ACCELEROMETER);

  Sensor magneticSensor = sensorManager.getDefaultSensor(Sensor.

  TYPE_MAGNETIC_FIELD);

  sensorManager.registerListener(this, accelerometerSensor,

  SensorManager.SENSOR_DELAY_GAME);

  sensorManager.registerListener(this, magneticSensor,

  SensorManager.SENSOR_DELAY_GAME);

  }

  //解除传感器注册

  public void unregisterSensor(){

  if (sensorManager != null) {

  sensorManager.unregisterListener(this);

  }

  }

  @Override

  public void onSensorChanged(SensorEvent event) {

  // 判断当前是加速度传感器还是地磁传感器

  if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {

  // 通过clone()获取不同的values引用

  accelerometerValues = event.values.clone();

  } else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {

  magneticValues = event.values.clone();

  }

  //获取地磁与加速度传感器组合的旋转矩阵

  float[] R = new float[9];

  float[] values = new float[3];

  SensorManager.getRotationMatrix(R, null, accelerometerValues,

  magneticValues);

  SensorManager.getOrientation(R, values);

  //values[0]-》Z轴、values[1]-》X轴、values[2]-》Y轴

  //使用前请进行转换,因为获取到的值是弧度,示例如下

  // Math.toDegrees(values[0]);

  // Math.toDegrees(values[1]);

  // Math.toDegrees(values[2]);

  handleEvent(values);

  }

  public void handleEvent(float[] values){

  // 这里实现了一个指南针

  float rotateDegree = -(float) Math.toDegrees(values[0]);

  if (Math.abs(rotateDegree - lastRotateDegree) 》 1) {

  RotateAnimation animation = new RotateAnimation

  (lastRotateDegree, rotateDegree, Animation.RELATIVE_TO_SELF, 0.5f, Animation.

  RELATIVE_TO_SELF, 0.5f);

  animation.setFillAfter(true);

  compassImg.startAnimation(animation);

  lastRotateDegree = rotateDegree;

  }

  }

  @Override

  public void onAccuracyChanged(Sensor sensor, int accuracy) {

  }

  }

免责声明:凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。