2013-01-11 15 views
0

我嘗試了以下方法,但它不能正常工作。如果設備以正常方式保存,那麼它也會觸發搖動事件。如何在Android中使用Accelerometer上下搖動?

@Override 
public void onSensorChanged(SensorEvent event) { 
    // TODO Auto-generated method stub 

    long curTime = System.currentTimeMillis(); 
    // only allow one update every 200Ms. 
    if ((curTime - lastUpdate) > 200) { 

     lastUpdate = curTime; 

     x = event.values[SensorManager.DATA_X]; 
     y = event.values[SensorManager.DATA_Y]; 
     z = event.values[SensorManager.DATA_Z]; 

     Vibrator vibrate = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); 

     if (Round(y, 4) > 22) { 
      vibrate.vibrate(200); 
      Log.d("sensor", "==== Up Detected==="); 

     } else if (Round(y, 4) < -20) { 
      vibrate.vibrate(200); 
      Log.d("sensor", "==== Down Detected=== "); 

     } 

     mLastX = x; 
     mLastY = y; 
     mLastZ = z; 
    } 

} 

public static float Round(float Rval, int Rpl) { 
    float p = (float) Math.pow(10, Rpl); 

    Rval = Rval * p; 
    float tmp = Math.round(Rval); 
    return (float) tmp/p; 
} 

請幫忙。

任何幫助將高度讚賞..

感謝

回答

0

傳感器值非常原始和嘈雜。您需要在其上添加一層數字信號處理以獲得良好效果。只使用原始值會導致結果中出現很多抖動。你試圖用你的時間延遲做一些基本的,但你需要做更多的過濾。

另外,您正在振動以應對振動。這種振動會使加速度計看到運動,導致更多的誤報。

+0

我沒有得到的是 - 他們有很多錯誤的讀數,並沒有真正確切的答案 – moDev

+1

你從傳感器獲得的值的第一部分是不可信任的。在電氣工程方面有一個關於如何分析和調整信號讀數的研究,這就是所謂的數字信號處理。其中的概念是過濾器 - 它是一種接受,拒絕或部分接受閱讀的方式。你需要一個,我只是不知道使用正確的。 –

0

將低通濾波器應用爲您的y軸值。

基本過濾器將在文檔中提到。

public void onSensorChanged(SensorEvent event){ 
    // In this example, alpha is calculated as t/(t + dT), 
// where t is the low-pass filter's time-constant and 
// dT is the event delivery rate. 

final float alpha = 0.8; 

// Isolate the force of gravity with the low-pass filter. 
gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0]; 
gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1]; 
gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2]; 

// Remove the gravity contribution with the high-pass filter. 
linear_acceleration[0] = event.values[0] - gravity[0]; 
linear_acceleration[1] = event.values[1] - gravity[1]; 
linear_acceleration[2] = event.values[2] - gravity[2]; 
    }