资讯详情

传感器数据采样率控制

一般情况下,传感器数据采样率不需要太高,采样速度过快,对设备耗电有一定影响。

1.传感器类型

SENSOR_TYPE_ACCELEROMETER 1 //加速度 SENSOR_TYPE_MAGNETIC_FIELD 2 //磁力 SENSOR_TYPE_ORIENTATION 3 //方向 SENSOR_TYPE_GYROSCOPE 4 //陀螺仪 SENSOR_TYPE_LIGHT 5 ///光感应 SENSOR_TYPE_PRESSURE 6 //压力 SENSOR_TYPE_TEMPERATURE 7 //温度  SENSOR_TYPE_PROXIMITY 8 //接近 SENSOR_TYPE_GRAVITY 9 //重力 SENSOR_TYPE_LINEAR_ACCELERATION 10///线性加速度 SENSOR_TYPE_ROTATION_VECTOR 11//旋转矢量 

2.SensorManager提供的采样率

在SensorManager该类提供了以下四种采样频率:

SENSOR_DELAY_NOMAL     (200000微秒)             200ms SENSOR_DELAY_UI        (60000微秒)              60ms SENSOR_DELAY_GAME      (20000微秒)              20ms SENSOR_DELAY_FASTEST   (0微秒)                  0ms 

3.获取指定数量的采样数据

虽然在SensorManager它提供了几种采样率,也可以自定义时间来控制采样率。例如,1秒内使用6次 加速传感器的数据。

Sensor accelerometerSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); mSensorManager.registerListener(mSensorEventListener,accelerometerSensor,167000); 

但由于采样数据不是平均出来的,经过测试,发现某一秒只能采用5次数据。不符合实际需要。 因此,采用另一种方式,即提高采样率约为每秒10次,然后定期在线取数据,具体实现代码片段如下。

mAccThread = new HandlerThread("ACCELEROMETER_THREAD"); mAccThread.start(); mAccHandler = new Handler(mAccThread.getooper(), accCallback);

*注册加速度传感器监听*
Sensor accelerometerSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(mSensorEventListener,accelerometerSensor,100000);
*数据回调*
SensorEventListener mSensorEventListener = new SensorEventListener() { 
        
		@Override
		public void onAccuracyChanged(Sensor sensor, int accuracy) { 
        

		}

		@Override
		public void onSensorChanged(SensorEvent event) { 
        
			if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){ 
        
                float x = Math.abs(event.values[0]);
                float y = Math.abs(event.values[1]);
                float z = Math.abs(event.values[2]);
                sendDataMessage(x, y, z);
			}
		}
	};
*传输数据*
private void sendDataMessage(float x, float y, float z) { 
        
     Message msg = mAccHandler.obtainMessage();
     msg.what = MSG_ASENSOR;
     Bundle bundle = new Bundle();
     bundle.putFloat("x", x);
     bundle.putFloat("y", y);
     bundle.putFloat("z", z);
     msg.setData(bundle);
     mAccHandler.sendMessage(msg);
}
*定时采取数据*
private Handler.Callback accCallback = new Handler.Callback() { 
        
		@Override
		public boolean handleMessage(Message msg) { 
        
			int what = msg.what;
			switch (what) { 
        
				case MSG_ASENSOR:
					float ax = msg.getData().getFloat("x");
					float ay = msg.getData().getFloat("y");
					float az = msg.getData().getFloat("z");
					break;
			}
			try { 
        
				Thread.sleep(167);
			} catch (InterruptedException e) { 
        
				e.printStackTrace();
			}
			return false;
		}};

这样就能够实现需求1秒采取6次传感器数据啦。

标签: 用什么传感器来控制距离传感器感应磁环传感器的磁环旋转控制传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台