2013-04-17 22 views
2

我正在开发一个基于传感器的应用程序,其主要目的是检测电缆的磁场。如果电缆中有电流流动,那么它应该显示一些信息,当没有电流意味着它应该通知。使用下面的代码,它检测到电流,但问题是它也检测到金属磁场。如果有人知道解决方案,请告诉我。如何停止磁性传感器检测金属?

public class MainActivity extends Activity implements SensorEventListener { 
     SensorManager sensorManager; 
    // static final int sensor = SensorManager.SENSOR_ORIENTATION; 

     private Sensor myCompassSensor; 
     private TextView outView,tesla1,voltage; 
     ImageView light1; 
     Vibrator v; 
     /** Called when the activity is first created. */ 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 
     outView = (TextView) findViewById(R.id.output); 
     tesla1=(TextView)findViewById(R.id.tesla); 
     light1=(ImageView)findViewById(R.id.light); 
     voltage=(TextView)findViewById(R.id.voltage); 
     v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); 
     // get sensor manager 
     sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
     // get compass sensor (ie magnetic field) 
     myCompassSensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); 
     } 

     // register to listen to sensors 
     @Override 
     public void onResume() { 
     super.onResume(); 
     sensorManager.registerListener(this, myCompassSensor, SensorManager.SENSOR_DELAY_NORMAL); 
     } 

     // unregister 
     @Override 
     public void onPause() { 
     super.onPause(); 
     sensorManager.unregisterListener(this,myCompassSensor); 
     } 

     // Ignore for now 
     public void onAccuracyChanged(Sensor sensor, int accuracy) { 
      // TODO Auto-generated method stub 
     } 


    @Override 
    public void onSensorChanged(SensorEvent event) { 
     // TODO Auto-generated method stub 
     // this check is unnecessary with only one registered sensor 
      // but it's useful to know in case you need to add more sensors 
     synchronized (this) 
     { 
      if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) { 
      // int orientation = (int) event.values[0]; 
       float azimuth = Math.round(event.values[0]); 
       float pitch = Math.round(event.values[1]); 
       float roll = Math.round(event.values[2]); 
       double tesla= Math.sqrt((azimuth*azimuth)+(pitch*pitch)+(roll*roll)); 

       String out = String.format("X: %.2f\nY: %.2f\nZ: %.2f", 
        azimuth, pitch, roll); 
       String a=String.format("%2f", tesla); 
       Log.d("MAGENTIC---", out); 
       // outView.setText(out); 
       tesla1.setText(a); 
       if(tesla>=80) 
       { 
        v.vibrate(200); 
        light1.setBackgroundResource(R.drawable.voltage_on); 
        voltage.setText("Voltage Detected !"); 
       } 
       else 
       { 
       light1.setBackgroundResource(R.drawable.voltage_off); 
       voltage.setText("No Voltage Found"); 
       } 
    } 
      else 
       return; 
    } 
    } 
} 
+0

“金属领域”。那是什么?我认为你的意思是由黑色金属产生的磁场 - 它看起来就像手机中传感器带电电缆周围的磁场一样。你需要更复杂的传感器来区分它们。所以不行。 – Simon

+0

@Simon:谢谢你的回答。我不了解产生磁场的场,金属也产生磁场? –

+0

不,只有黑色金属。 – Simon

回答

3

如果要检测(AC)的交流/信号,然后经甚至很短的时间,应该看到,在幅度和极性变化的信号。您可以采样并存储大量的读数,并检测到这种情况正在发生。在稳定的磁场情况下,读数也应该稳定。你应该能够开发一种算法来分离这些不同的情况。

如果您正在检测稳态直流电流,这可能没有帮助。

0

根据硬件的不同,手机的更新速率可能低至50ms或20Hz。 如果我们假设测量结果为“采样和保持”平均值,交流频率为60Hz(取决于您居住的位置),则每个样本只有三个周期,可以抵消无信号。如果你的采样时间是58ms,你将有3.5个周期产生一个信号。因此 - 您很有可能通过查看您的采样数据来推断磁场是否交替出现。

这样做的一种方法是简单地计算数据的方差。否则,您可以应用数字高通滤波器来忽略较慢的变化区域。

相关问题