首页>>科技 >>内容

android传感器开发实验,浅谈android之各类传感器

发布时间:2023-08-23 18:40:08编辑:温柔的背包来源:

android传感器开发实验,浅谈android之各类传感器

很多朋友对android传感器开发实验,浅谈android之各类传感器不是很了解,每日小编刚好整理了这方面的知识,今天就来带大家一探究竟。

传感器(英文名称:transducer/sensor)是一种能够感受到被测量信息的检测装置,并能将感受到的信息按照一定的规则变换成电信号或其他所需形式的信息输出,以满足信息的传输、处理、存储、显示、记录和控制要求。传感器的特点包括:小型化、数字化、智能化、多功能、系统化、网络化。是实现自动检测、自动控制的第一个环节。传感器的存在和发展让物体拥有了触觉、味觉、嗅觉等感官,让物体慢慢地活了起来。通常根据其基本感知功能可分为热传感器、光传感器、气传感器、力传感器、磁传感器、湿度传感器、声音传感器、辐射传感器、颜色传感器和味觉传感器等十类。主要作用:为了从外界获取信息,人们必须依靠感觉器官。然而,仅仅依靠人自身的感觉器官来发挥其在研究自然现象和规律以及生产活动中的作用是远远不够的。为了适应这种情况,需要传感器。因此,可以说传感器是人类面部特征的延伸,也称为电面部特征。随着新技术革命的到来,世界进入信息时代。在使用信息的过程中,首先要解决的是获取准确可靠的信息,而传感器是自然领域和生产领域获取信息的主要方式和手段。在现代工业生产中,特别是在自动化生产过程中,利用各种传感器来监测和控制生产过程中的各种参数,使设备能够工作在正常或最佳状态,使产品达到最佳质量。因此,可以说,没有大量优秀的传感器,现代化生产就失去了基础。在基础学科研究中,传感器有着更加突出的地位。现代科学技术的发展进入了许多新的领域:例如,需要在宏观层面观察数千光年的浩瀚宇宙,需要在微观层面观察小至fm的粒子世界,垂直观测数十万年的天体演化,短至s的瞬时响应。此外,还出现了各种极限技术研究,如超高温、超低温、超高压、超高真空、超强磁场、超弱磁场等,发挥着重要作用。对于加深对物质的认识、开发新能源、新材料具有重要作用。显然,如果没有合适的传感器,就不可能获得大量人类感觉器官无法直接获取的信息。许多基础科学研究的障碍最初只是物体信息的获取困难,而一些新机制和高灵敏度检测传感器的出现往往会导致该领域的突破。一些传感器的发展往往是一些边缘学科发展的先行者。传感器已经渗透到工业生产、太空开发、海洋探索、环境保护、资源调查、医疗诊断、生物工程甚至文物保护等广泛领域。毫不夸张地说,从浩瀚的太空到浩瀚的海洋再到各种复杂的工程系统,几乎每一个现代工程都离不开各种传感器。可见,传感器技术对于发展经济、推动社会进步的重要作用非常明显。世界各国都高度重视这一领域的发展。相信在不久的将来,传感器技术将实现飞跃,达到与其重要地位相称的新水平。主要特点传感器的特点包括:小型化、数字化、智能化、多功能、系统化、网络化。它不仅促进传统产业转型升级,还可能建立新产业,从而成为21世纪的新兴产业。经济增长点。

小型化基于微机电系统(MEMS)技术,该技术已成功应用于硅器件,制造硅压力传感器。传感器的组成传感器一般由敏感元件、转换元件、转换电路和辅助电源四部分组成。敏感元件直接感应被测信号,输出与被测元件有确定关系的物理量信号;转换元件将敏感元件输出的物理量信号转换为电信号;转换电路负责对转换元件输出的电信号进行放大和调制;转换元件和转换电路一般还需要辅助电源。主要功能传感器的功能常与人类的五种主要感觉器官相比较: 光敏传感器—— 视觉声音传感器—— 听觉气体传感器—— 嗅觉化学传感器—— 味觉压敏、温敏、流体传感器—— 触觉敏感元件的分类:基于力、热、光、电、磁和声音等物理效果的物理类别。化学,基于化学反应原理。生物学,基于酶、抗体和激素等分子识别功能。通常根据其基本感知功能可分为热传感器、光传感器、气传感器、力传感器、磁传感器、湿度传感器、声音传感器、辐射传感器、颜色传感器和味觉传感器十种类型。类(曾有人将敏感元件分为46类)。 1、 传感器入门

自2007年苹果发布第一代iPhone以来,曾经看似与手机脱节的传感器逐渐成为手机硬件的重要组成部分。如果读者使用过iPhone、HTC Dream、HTC Magic、HTC Hero等Android手机,就会发现,通过将手机横向或纵向放置,屏幕会根据手机的位置改变方向。该功能需要重力传感器来实现。除了重力传感器之外,还有很多其他类型的传感器应用在手机上。例如,磁阻传感器是最重要的传感器。虽然手机可以通过GPS来判断方向,但是当GPS信号不好或者根本没有GPS信号时,GPS就没用了。这时,通过磁阻传感器就可以轻松判断方向(东、南、西、北)。有了磁阻传感器,还可以将指南针(俗称指针)数字化。

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

封装android.hardware;公共接口SensorEventListener { 公共void onSensorChanged(SensorEvent event); public void onAccuracyChanged(传感器传感器, int 精度); }

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

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

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

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

Y轴的方向从屏幕的左下角开始,沿屏幕的垂直方向指向屏幕的顶部。

将手机平放在桌面上,Z轴的方向是从手机到天空。

以下是主传感器中变量值的元素所代表的内容。

1.1 方向传感器

方向传感器中的values变量的三个值均表示角度,其含义如下:

value[0]:该值表示方向,即手机绕Z轴旋转的角度。 0 表示北; 90代表东方; 180 指南; 270意味着西。如果values[0]的值正是这4个值,并且手机横置,则说明手机的正面就是这4个方向。利用这一特性可以实现电子罗盘,例76将详细介绍电子罗盘的实现过程。

值[1]:该值表示倾斜度或手机倾斜的程度。当手机绕X 轴倾斜时,该值会发生变化。 Values[1]的取值范围是-180values[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]来测量桌子等物体的倾斜度。

value[2]:表示手机沿Y轴的滚动角度。取值范围为-90values[2]90。假设手机屏幕水平放置在桌面上,如果桌面是平的,values[2]的值应该为0。当手机左侧逐渐抬起时,values[2]的值逐渐减小直到手机垂直放置在桌子上,values[2]的值为-90。当手机右侧逐渐抬起时,values[2]的值逐渐增大,直到手机垂直放置在桌子上,values[2]的值为90。垂直位置,values[2]的值将在-90到90之间不断变化。

1.2 加速度传感器

传感器的values变量的三个元素值分别代表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 方法的第一个参数的值。例如,您可以使用Sensor.TYPE_ACCELEROMETER 来注册加速度传感器。 Sensor类中也定义了很多传感器常量,但是传感器必须根据手机中的实际硬件配置进行注册。如果手机中没有对应的传感器硬件,即使注册了对应的传感器也没有效果。 getDefaultSensor方法的第二个参数表示获取传感器数据的速度。 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手机,可能会有用。

公共静态最终浮点GRAVITY_SUN=275.0f;公共静态最终浮点GRAVITY_MERCURY=3.70f;公共静态最终浮点GRAVITY_VENUS=8.87f;公共静态最终浮点GRAVITY_EARTH=9.80665f;公共静态最终浮点GRAVITY_MOON=1.6f;公共静态最终浮点GRAVITY_MARS=3.71f;公共静态最终浮点GRAVITY_JUPITER=23.12f;公共静态最终浮点GRAVITY_SATURN=8.96f;公共静态最终浮点GRAVITY_URANUS=8.69f;公共静态最终浮点GRAVITY_NEPTUNE=11.0f;公共静态最终浮点GRAVITY_PLUTO=0.6f;公共静态最终浮点GRAVITY_DEATH_STAR_I=0.000000353036145f;公共静态最终浮点数GRAVITY_THE_ISLAND=4.815162342f;

1.4 光传感器

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

公共静态最终浮点数LIGHT_SUNLIGHT_MAX=120000.0f;公共静态最终浮点数LIGHT_SUNLIGHT=110000.0f;公共静态最终浮点数LIGHT_SHADE=20000.0f;公共静态最终浮点数LIGHT_OVERCAST=10000 .0f;公共静态最终浮点数LIGHT_SUNRISE=400.0f;公共静态最终浮点数LIGHT_CLOUDY=100.0f;公共静态最终浮点数LIGHT_FULLMOON=0.25f;公共静态最终浮点数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轴旋转的角速度。

value[1]:沿Y 轴旋转的角速度。

value[2]:沿Z轴旋转的角速度。

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

私有静态最终浮点数NS2S=1.0f/1000000000.0f;私有浮点数时间戳; public void onSensorChanged (SensorEvent event) { if (timestamp !=0) { //event.timesamp 表示当前时间,单位为纳秒(100 万毫秒) Final float dT=(event.timestamp - timestamp) * NS2S;角度[0] +=event.values[0] * dT;角度[1] +=event.values[1] * dT;角度[2] +=event.values[2] * dT; } 时间戳=event.timestamp;}

上面的代码中,利用陀螺仪传感器相邻两次数据采集的时间差(dT)来计算这段时间内手机沿X、Y、Z轴的旋转角度,并将数值相加到角度数组的不同元素。

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)

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

2. 测试手机中有哪些传感器

我们可以按照以下三个步骤使用传感器。

(1)编写一个拦截传感器事件的类。该类必须实现android.hardware.SensorEventListener 接口。

(2) 获取传感器管理对象(SensorManager对象)。

(3) 使用SensorManager.registerListener方法注册指定的传感器。通过以上三个步骤,传感器应用的框架已经搭建完成。具体工作需要在SensorEventListener接口的onSensorChanged和onAccuracyChanged方法中完成。 SensorEventListener接口的定义如下:

包android.hardware; public interfaceSensorEventListener {《span style="white-space:pre"》"/span"//传感器数据变化时调用"span style="white-space:pre""《/span》public void onSensorChanged( SensorEventevent);"span style="white-space:pre"""/span"//当传感器精度改变时调用"span style="white-space:pre"""/span"public void onAccuracyChanged(Sensorsensor, int precision);}

SensorManager对象是通过getSystemService方法获取的,代码如下:

SensorManager 传感器管理器=(SensorManager) getSystemService(SENSOR_SERVICE);

通常一部手机包含多个传感器模块(如方向传感器、光线传感器等),因此,注册传感器需要指定传感器的类型,比如下面的代码注册了一个光线传感器。

sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT), SensorManager.SENSOR_DELAY_FASTEST);

registerListener 方法有三个参数。第一个参数是一个实现SensorEventListener 接口的对象。第二个参数用于指定传感器的类型。 AndroidSDK预先定义了代表各种传感器的常量,这些常量都放在Sensor类中。例如上面代码中的Sensor.TYPE_LIGHT。第三个参数表示传感器获取数据的速度。该参数可以设置的常量如下:

SENSOR_DELAY_FASTEST:尽快获取传感器数据。

SENSOR_DELAY_GAME:适合获取游戏中的传感器数据。

SENSOR_DELAY_UI:适合在UI控件中获取传感器数据。

SENSOR_DELAY_NORMAL:以正常速度获取传感器数据。

上述四种类型获取传感器数据的速度依次递减。理论上,传感器数据获取越快,系统资源消耗就越大。因此,建议读者根据实际情况选择合适的速度来获取传感器数据。

如果您想停止获取传感器数据,可以使用unregisterSensor 方法取消注册传感器事件对象。 unregisterSensor方法定义如下:

公共voidunregisterListener(SensorEventListener 侦听器) 公共voidunregisterListener(SensorEventListener 侦听器,传感器传感器)

unregisterSensor 方法有两种重载形式。第一个重载用于注销所有传感器对象。第二个重载用于注销指定传感器的事件对象。 Sensor对象是通过SensorManager.getDefaultSensor方法获取的。 getDefaultSensor方法只有一个int类型的参数,表示传感器的类型。例如,Sensor.TYPE_LIGHT 表示光传感器。

注意:一个传感器对象可以处理多个传感器。也就是说,一个实现SensorEventListener接口的类可以接收多个传感器返回的数据。为了区分不同的传感器,需要使用Sensor.getType方法获取传感器类型。 getType 方法将在本节的示例中详细描述。

通过SensorManager.getSensorList方法,可以获取指定传感器的信息,也可以获取手机支持的所有传感器的信息。代码如下:

//获取光线传感器列表“Sensor”sensors=sensorManager.getSensorList(Sensor.TYPE_LIGHT);//获取手机支持的所有传感器列表“Sensor”sensors=sensorManager.getSensorList(Sensor.TYPE_ALL);

下面给出一个完整的例子来演示如何获取传感器返回的数据。本示例获取以下4个传感器的数据,同时输出测试手机支持的所有传感器的名称。

加速度传感器(Sensor.TYPE_ACCELEROMETER)

磁场传感器(Sensor.TYPE_MAGNETIC_FIELD)

光传感器(Sensor.TYPE_LIGHT)

方向传感器(TYPE_ORIENTATION)

本示例需要在真机上运行。由于不同的手机可能支持不同的传感器(有些手机不支持Android SDK中定义的所有传感器),如果运行程序后无法显示某个传感器的数据,则说明当前手机不支持这个传感器。

本例完整代码如下:

封装mobile.android.sensor;导入java.util.List;导入android.app.Activity;导入android.hardware.Sensor;导入android.hardware.SensorEvent;导入android.hardware.SensorEventListener;导入android.hardware.SensorManager;导入android.os.Bundle;导入android.widget.TextView;公共类Main 扩展Activity 实现SensorEventListener{ 私有TextView tvAcc

以上知识分享希望能够帮助到大家!