传感器
传感器(英文名称:transducer/sensor)是一种检测装置,能感受到被测量的信息,并能将感受到的信息,按一定规律变换成为电信号或其他所需形式的信息输出,以满足信息的传输、处理、存储、显示、记录和控制等要求。
传感器的特点包括:微型化、数字化、智能化、多功能化、系统化、网络化。它是实现自动检测和自动控制的首要环节。传感器的存在和发展,让物体有了触觉、味觉和嗅觉等感官,让物体慢慢变得活了起来。通常根据其基本感知功能分为热敏元件、光敏元件、气敏元件、力敏元件、磁敏元件、湿敏元件、声敏元件、放射线敏感元件、色敏元件和味敏元件等十大类。
主要作用
人们为了从外界获取信息,必须借助于感觉器官。
而单靠人们自身的感觉器官,在研究自然现象和规律以及生产活动中它们的功能就远远不够了。为适应这种情况,就需要传感器。因此可以说,传感器是人类五官的延长,又称之为电五官。
新技术革命的到来,世界开始进入信息时代。在利用信息的过程中,首先要解决的就是要获取准确可靠的信息,而传感器是获取自然和生产领域中信息的主要途径与手段。
在现代工业生产尤其是自动化生产过程中,要用各种传感器来监视和控制生产过程中的各个参数,使设备工作在正常状态或最佳状态,并使产品达到最好的质量。因此可以说,没有众多的优良的传感器,现代化生产也就失去了基础。
在基础学科研究中,传感器更具有突出的地位。现代科学技术的发展,进入了许多新领域:例如在宏观上要观察上千光年的茫茫宇宙,微观上要观察小到fm的粒子世界,纵向上要观察长达数十万年的天体演化,短到 s的瞬间反应。此外,还出现了对深化物质认识、开拓新能源、新材料等具有重要作用的各种极端技术研究,如超高温、超低温、超高压、超高真空、超强磁场、超弱磁场等等。显然,要获取大量人类感官无法直接获取的信息,没有相适应的传感器是不可能的。许多基础科学研究的障碍,首先就在于对象信息的获取存在困难,而一些新机理和高灵敏度的检测传感器的出现,往往会导致该领域内的突破。一些传感器的发展,往往是一些边缘学科开发的先驱。
传感器早已渗透到诸如工业生产、宇宙开发、海洋探测、环境保护、资源调查、医学诊断、生物工程、甚至文物保护等等极其之泛的领域。可以毫不夸张地说,从茫茫的太空,到浩瀚的海洋,以至各种复杂的工程系统,几乎每一个现代化项目,都离不开各种各样的传感器。
由此可见,传感器技术在发展经济、推动社会进步方面的重要作用,是十分明显的。世界各国都十分重视这一领域的发展。相信不久的将来,传感器技术将会出现一个飞跃,达到与其重要地位相称的新水平。
主要特点
传感器的特点包括:微型化、数字化、智能化、多功能化、系统化、网络化,它不仅促进了传统产业的改造和更新换代,而且还可能建立新型工业,从而成为21世纪新的经济增长点。微型化是建立在微电子机械系统(MEMS)技术基础上的,已成功应用在硅器件上做成硅压力传感器。
传感器的组成
传感器一般由敏感元件、转换元件、变换电路和辅助电源四部分组成。
敏感元件直接感受被测量,并输出与被测量有确定关系的物理量信号;转换元件将敏感元件输出的物理量信号转换为电信号;变换电路负责对转换元件输出的电信号进行放大调制;转换元件和变换电路一般还需要辅助电源供电。
主要功能
常将传感器的功能与人类5大感觉器官相比拟:
光敏传感器——视觉
声敏传感器——听觉
气敏传感器——嗅觉
化学传感器——味觉
压敏、温敏、
流体传感器——触觉
敏感元件的分类:
物理类,基于力、热、光、电、磁和声等物理效应。
化学类,基于化学反应的原理。
生物类,基于酶、抗体、和激素等分子识别功能。
通常据其基本感知功能可分为热敏元件、光敏元件、气敏元件、力敏元件、磁敏元件、湿敏元件、声敏元件、放射线敏感元件、色敏元件和味敏元件等十大类(还有人曾将敏感元件分46类)。
一、传感器的使用
1、传感器的类型:
方向传感器::Sensor.TYPE_ORIENTATION
加速度(重力)传感器:sensor.TYPE_ACCELEFOMETER
光线传感器:sensor.TYPT_LIGHT
磁场传感器:sensor.TYPE_MANGNETIC_FIELD
距离(临近性)传感器:Sensor.TYPE_FROXIMITY
温度传感器:Sensor.TYPE_TEMPERATURE
常用的API:
《1》得到传感器的服务(得到传感器的管理者)
SensorManager sm=(SensorManager)getSystemService(SENSOR_SERVICE);
《2》得到手机所支持的所有的传感器的类型:
List list=sm.getSensorList(SensorManager.TYPE_ALL);
《3》传感器的类型:
Sensor.getType();
《4》传感器的名字;
Sensor.getName();
《5》传感器的监听:SensorEventListener()
sm.registerListener(监听,传感器对象,rate);
重点:
《1》光线传感器:sensor.TYPT_LIGHT
得到光线值:float f=event.values[0];
WindowManager.LayoutParams params = acTIvity.getWindow().getAttributes();
params.screenBrightness = value / 255f;
acTIvity.getWindow().setAttributes(params);
《2》加速度传感器:sensor.TYPE_ACCELEFOMETER
加速度有三个值:这三个值是手机在三个方向受到的加速度
float x=event.values[0];–》在手机顶部从左边沿往有边沿是手机的X轴的正方向
float y=event.values[1];–》从手机顶部沿手机左边沿手机底部是Y轴的正方向
float z=event.values[2];–》垂直手机屏幕朝外的是正方向
《3》方向传感器:Sensor.TYPE_ORIENTATION
方向传感器三个值:
方向角:指手机平躺时,手机头部绕Z轴旋转,与地球正北极的夹角
0代表北(North)
90代表东East
180代表南(South)
270代表西(West)
俯视角:手机绕X轴旋转与水平线的夹角
滚转角:手机绕Y轴旋转与水平线的夹角
利用方向传感器实现 指南针应用
运行后效果图如下:
布局文件(activity_main.xml)
《?xml version=“1.0” encoding=“utf-8”?》
《RelativeLayout xmlns:android=“http://schemas.android.com/apk/res/android”
xmlns:tools=“http://schemas.android.com/tools” android:id=“@+id/activity_main”
android:layout_width=“match_parent” android:layout_height=“match_parent”
android:paddingBottom=“@dimen/activity_vertical_margin”
android:paddingLeft=“@dimen/activity_horizontal_margin”
android:paddingRight=“@dimen/activity_horizontal_margin”
android:paddingTop=“@dimen/activity_vertical_margin”
tools:context=“com.example.g150825_android29.MainActivity”》
《ImageView
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:src=“@drawable/znz”
android:id=“@+id/iv_image”
/》I
《TextView
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:textSize=“30sp”
android:id=“@+id/tv_main_result”
/》
《/RelativeLayout》12345678910111213141516171819202122232425
Java代码(MainActivity )
package com.example.g150825_android29;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private SensorManager sensorManager;
private Sensor sensorOri;
private TextView tv_main_result;
private MyListener myListener;
private ImageView iv_image;
private float current=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_main_result = (TextView) findViewById(R.id.tv_main_result);
iv_image = (ImageView) findViewById(R.id.iv_image);
//得到传感器管理者
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
//得到光线传感器
// sensorLight = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
//获取加速度传感器
// sensorACC = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
//获取方向传感器
sensorOri=sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
//获取光线传感器的值(光线值)
myListener = new MyListener();
}
//注册监听(监听某一个传感器的值)
@Override
protected void onResume() {
super.onResume();
sensorManager.registerListener(myListener,sensorOri,SensorManager.SENSOR_DELAY_UI);
}
class MyListener implements SensorEventListener{
//当值发生改变
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
float[] f=sensorEvent.values;
float x=f[0];
float y=f[1];
float z=f[2];
tv_main_result.setText(“x=”+x+“\ny=”+y+“\nz=”+z);
//实例化旋转动画
RotateAnimation rotateAnimation=new RotateAnimation(current,-x, Animation.RELATIVE_TO_SELF,0.5f, Animation.RELATIVE_TO_SELF,0.5f);
rotateAnimation.setDuration(200);
current=-x;
iv_image.startAnimation(rotateAnimation);
//改变屏幕的亮度
// WindowManager.LayoutParams layoutParams=getWindow().getAttributes();
// layoutParams.screenBrightness=light/255f;
// getWindow().setAttributes(layoutParams);
}
//当值的精度发生改变
@Override
public void onAccuracyChanged(Sensor sensor, int i) {
}
}
//取消注册监听
@Override
protected void onDestroy() {
super.onDestroy();
sensorManager.unregisterListener(myListener);
}
// public void getAllSensors(View view){
// List《Sensor》 sensors=sensorManager.getSensorList(Sensor.TYPE_ALL);
// for(Sensor s:sensors){
// Log.i(“test”, s.getName());
// }
//
// }
}