如何阻止磁传感器检测金属?

时间:2013-04-17 06:09:20

标签: android android-sensors

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

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;
    }
    }
}

2 个答案:

答案 0 :(得分:3)

如果您正在检测(AC)交流电/信号,那么即使在非常短的时间内,您也应该看到幅度和极性发生变化的信号。您可以对多个读数进行采样和存储,并检测这种情况。在稳定磁场的情况下,读数也应该是稳定的。您应该能够开发一种算法来分离这些不同的情况。

如果您检测到稳态直流电流,这可能无济于事。

答案 1 :(得分:0)

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

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