当前位置:首页 > 嵌入式 > 嵌入式软件
[导读] 自从苹果公司在2007年发布第一代iPhone以来,以前看似和手机挨不着边的传感器也逐渐成为手机硬件的重要组成部分。如果读者使用过iPhone、HTC Dream、HTC Magic、HTC Hero以

自从苹果公司在2007年发布第一代iPhone以来,以前看似和手机挨不着边的传感器也逐渐成为手机硬件的重要组成部分。如果读者使用过iPhone、HTC Dream、HTC Magic、HTC Hero以及其他的Android手机,会发现通过将手机横向或纵向放置,屏幕会随着手机位置的不同而改变方向。这种功能就需要通过重力传感器来实现,除了重力传感器,还有很多其他类型的传感器被应用到手机中,例如磁阻传感器就是最重要的一种传感器。虽然手机可以通过GPS来判断方向,但在GPS信号不好或根本没有GPS信号的情况下,GPS就形同虚设。这时通过磁阻传感器就可以很容易判断方向(东、南、西、北)。有了磁阻传感器,也使罗盘(俗称指向针)的电子化成为可能。

在Android应用程序中使用传感器要依赖于android.hardware.SensorEventListener接口。通过该接口可以监听传感器的各种事件。SensorEventListener接口的代码如下:

package android.hardware;

public interface SensorEventListener

{

public void

onSensorChanged(SensorEvent event);

public void

onAccuracyChanged(Sensor sensor, int accuracy);

}

在SensorEventListener接口中定义了两个方法:onSensorChanged和onAccuracyChanged。当传感器的值发生变化时,例如磁阻传感器的方向改变时会调用onSensorChanged方法。当传感器的精度变化时会调用onAccuracyChanged方法。

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

在解释values变量中元素的含义之前,先来介绍一下Android的坐标系统是如何定义X、Y、Z轴的。

X轴的方向是沿着屏幕的水平方向从左向右。如果手机不是正方形的话,较短的边需要水平放置,较长的边需要垂直放置。

Y轴的方向是从屏幕的左下角开始沿着屏幕的垂直方向指向屏幕的顶端。

将手机平放在桌子上,Z轴的方向是从手机里指向天空。

下面是values变量的元素在主要的传感器中所代表的含义。

1.1 方向传感器

在方向传感器中values变量的3个值都表示度数,它们的含义如下:

values[0]:该值表示方位,也就是手机绕着Z轴旋转的角度。0表示北(North);90表示东(East);180表示南(South);270表示西(West)。如果values[0]的值正好是这4个值,并且手机是水平放置,表示手机的正前方就是这4个方向。可以利用这个特性来实现电子罗盘,实例76将详细介绍电子罗盘的实现过程。

values[1]:该值表示倾斜度,或手机翘起的程度。当手机绕着X轴倾斜时该值发生变化。values[1]的取值范围是-180≤values[1]

≤180。假设将手机屏幕朝上水平放在桌子上,这时如果桌子是完全水平的,values[1]的值应该是0(由于很少有桌子是绝对水平的,因此,该值很可能不为0,但一般都是-5和5之间的某个值)。这时从手机顶部开始抬起,直到将手机沿X轴旋转180度(屏幕向下水平放在桌面上)。在这个旋转过程中,values[1]会在0到-180之间变化,也就是说,从手机顶部抬起时,values[1]的值会逐渐变小,直到等于-180。如果从手机底部开始抬起,直到将手机沿X轴旋转180度,这时values[1]会在0到180之间变化。也就是values[1]的值会逐渐增大,直到等于180。可以利用values[1]和下面要介绍的values[2]来测量桌子等物体的倾斜度。

values[2]:表示手机沿着Y轴的滚动角度。取值范围是-90≤values[2]≤90。假设将手机屏幕朝上水平放在桌面上,这时如果桌面是平的,values[2]的值应为0。将手机左侧逐渐抬起时,values[2]的值逐渐变小,直到手机垂直于桌面放置,这时values[2]的值是-90。将手机右侧逐渐抬起时,values[2]的值逐渐增大,直到手机垂直于桌面放置,这时values[2]的值是90。在垂直位置时继续向右或向左滚动,values[2]的值会继续在-90至90之间变化。

1.2 加速传感器

该传感器的values变量的3个元素值分别表示X、Y、Z轴的加速值。例如,水平放在桌面上的手机从左侧向右侧移动,values[0]为负值;从右向左移动,values[0]为正值。读者可以通过本节的例子来体会加速传感器中的值的变化。要想使用相应的传感器,仅实现SensorEventListener接口是不够的,还需要使用下面的代码来注册相应的传感器。

// 获得传感器管理器

SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);

// 注册方向传感器

sm.registerListener(this,

sm.getDefaultSensor(Sensor.TYPE_ORIENTATION),

SensorManager.SENSOR_DELAY_FASTEST);

如果想注册其他的传感器,可以改变getDefaultSensor方法的第1个参数值,例如,注册加速传感器可以使用Sensor.TYPE_ACCELEROMETER。在Sensor类中还定义了很多传感器常量,但要根据手机中实际的硬件配置来注册传感器。如果手机中没有相应的传感器硬件,就算注册了相应的传感器也不起任何作用。getDefaultSensor方法的第2个参数表示获得传感器数据的速度。SensorManager.SENSOR_DELAY_ FASTEST表示尽可能快地获得传感器数据。除了该值以外,还可以设置3个获得传感器数据的速度值,这些值如下:

SensorManager.SENSOR_DELAY_NORMAL:默认的获得传感器数据的速度。

SensorManager.SENSOR_DELAY_GAME:如果利用传感器开发游戏,建议使用该值。

SensorManager.SENSOR_DELAY_UI:如果使用传感器更新UI中的数据,建议使用该值。

1.3 重力感应器

加速度传感器的类型常量是Sensor.TYPE_GRAVITY。重力传感器与加速度传感器使用同一套坐标系。values数组中三个元素分别表示了X、Y、Z轴的重力大小。Android SDK定义了一些常量,用于表示星系中行星、卫星和太阳表面的重力。下面就来温习一下天文知识,将来如果在地球以外用Android手机,也许会用得上。

public static final float GRAVITY_SUN= 275.0f;

public static final float GRAVITY_MERCURY= 3.70f;

public static final float GRAVITY_VENUS= 8.87f;

public static final float GRAVITY_EARTH= 9.80665f;

public static final float GRAVITY_MOON= 1.6f;

public static final float GRAVITY_MARS= 3.71f;

public static final float GRAVITY_JUPITER= 23.12f;

public static final float GRAVITY_SATURN= 8.96f;

public static final float GRAVITY_URANUS= 8.69f;

public static final float GRAVITY_NEPTUNE= 11.0f;

public static final float GRAVITY_PLUTO= 0.6f;

public static final float GRAVITY_DEATH_STAR_I= 0.000000353036145f;

public static final float GRAVITY_THE_ISLAND= 4.815162342f;

1.4 光线传感器

光线传感器的类型常量是Sensor.TYPE_LIGHT。values数组只有第一个元素(values[0])有意义。表示光线的强度。最大的值是120000.0f。Android SDK将光线强度分为不同的等级,每一个等级的最大值由一个常量表示,这些常量都定义在SensorManager类中,代码如下:

public static final float LIGHT_SUNLIGHT_MAX =120000.0f;

public static final float LIGHT_SUNLIGHT=110000.0f;

public static final float LIGHT_SHADE=20000.0f;

public static final float LIGHT_OVERCAST= 10000.0f;

public static final float LIGHT_SUNRISE= 400.0f;

public static final float LIGHT_CLOUDY= 100.0f;

public static final float LIGHT_FULLMOON= 0.25f;

public static final float LIGHT_NO_MOON= 0.001f;

上面的八个常量只是临界值。读者在实际使用光线传感器时要根据实际情况确定一个范围。例如,当太阳逐渐升起时,values[0]的值很可能会超过LIGHT_SUNRISE,当values[0]的值逐渐增大时,就会逐渐越过LIGHT_OVERCAST,而达到LIGHT_SHADE,当然,如果天特别好的话,也可能会达到LIGHT_SUNLIGHT,甚至更高。

1.5 陀螺仪传感器

陀螺仪传感器的类型常量是Sensor.TYPE_GYROSCOPE。values数组的三个元素表示的含义如下:values[0]:延X轴旋转的角速度。

values[1]:延Y轴旋转的角速度。

values[2]:延Z轴旋转的角速度。

当手机逆时针旋转时,角速度为正值,顺时针旋转时,角速度为负值。陀螺仪传感器经常被用来计算手机已转动的角度,代码如下:

private static final float NS2S = 1.0f / 1000000000.0f;

private float timestamp;

public void onSensorChanged(SensorEvent event)

{

if (timestamp != 0)

{

// event.timesamp表示当前的时间,单位是纳秒(1百万分之一毫秒)

final float dT = (event.timestamp - timestamp) * NS2S;

angle[0] += event.values[0] * dT;

angle[1] += event.values[1] * dT;

angle[2] += event.values[2] * dT;

}

timestamp = event.timestamp;

}

上面代码中通过陀螺仪传感器相邻两次获得数据的时间差(dT)来分别计算在这段时间内手机延X、 Y、Z轴旋转的角度,并将值分别累加到angle数组的不同元素上。

1.6其他传感器

其他传感器在前面几节介绍了加速度传感器、重力传感器、光线传感器、陀螺仪传感器以及方向传感器。除了这些传感器外,Android SDK还支持如下的几种传感器。关于这些传感器的使用方法以及与这些传感器相关的常量、方法,读者可以参阅官方文档。

近程传感器(Sensor.TYPE_PROXIMITY)

线性加速度传感器(Sensor.TYPE_LINEAR_ACCELERATION)

旋转向量传感器(Sensor.TYPE_ROTATION_VECTOR)

磁场传感器(Sensor.TYPE_MAGNETIC_FIELD)

压力传感器(Sensor.TYPE_PRESSURE)

温度传感器(Sensor.TYPE_TEMPERATURE)

虽然AndroidSDK定义了十多种传感器,但并不是每一部手机都完全支持这些传感器。例如,Google Nexus S支持其中的9种传感器(不支持压力和温度传感器),而HTC G7只支持其中的5种传感器。如果使用了手机不支持的传感器,一般不会抛出异常,但也无法获得传感器传回的数据。读者在使用传感器时最好先判断当前的手机是否支持所使用的传感器。

2次

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

本文中,小编将对焦距予以介绍,如果你想对它的详细情况有所认识,或者想要增进对焦距的了解程度,不妨请看以下内容哦。

关键字: 焦距 传感器

本文中,小编将对手机重力感应予以介绍,如果你想对它的详细情况有所认识,或者想要增进对它的了解程度,不妨请看以下内容哦。

关键字: 重力感应 传感器 重力传感器

4月17日消息,去年,中国大陆的半导体设备支出约占据了全球总额的三分之一。

关键字: 半导体 传感器 人工智能 电动汽车

在下述的内容中,小编将会对压力传感器的相关消息予以报道,如果压力传感器是您想要了解的焦点之一,不妨和小编共同阅读这篇文章哦。

关键字: 传感器 压力传感器

随着各行各业自动化程度的提高,运动控制的重要性日益凸显。为了有效地驱动电机,描述速度和位置的控制输入必不可少。然而,实现这种感测的技术有多种,每种技术都有不同的特点和应用场景。

关键字: 传感器 电机 自动化

SmartFactory计算机集成制造(CIM)解决方案可以帮助制造商实现从前道晶圆制造到后道封装、测试和包装的过程中定义、控制、自动化、监测和记录整个半导体的制造过程。该解决方案通过一系列集成软件组合来实现上述功能,这...

关键字: 自动化 集成制造 传感器

STCC4凭借在外形尺寸上的出众优势、成本效益以及低功耗,可更好地支持一系列面向大众市场提供二氧化碳监测的应用。Sensirion宣布旗下最新款二氧化碳传感器系列将于2024下半年推出。

关键字: 传感器 智能恒温器

为增进大家对调速器的认识,本文将对调速器运转方式、调速器的后期维护予以介绍。

关键字: 调速器 指数 传感器

如果您即将开始设计智能工厂传感器,请阅读这篇文章了解更多信息,从而尽可能快速高效地完成设计,使其能够为更多客户带来裨益。这篇博文介绍了智能工厂传感器(温度和压力)的设计理念,无论工厂流程中使用何种类型的现场总线或工业以太...

关键字: 智能工厂 传感器 现场总线

好用、高效的多合一传感器开发工具,支持给新一代高科技 MEMS 传感器产品开发应用软件

关键字: 传感器 Windows MacOS
关闭
关闭