Датчики окружающей среды

Платформа Android предоставляет четыре датчика, которые позволяют отслеживать различные свойства окружающей среды. Вы можете использовать эти датчики для мониторинга относительной влажности окружающей среды, освещенности, давления окружающей среды и температуры окружающей среды рядом с устройством под управлением Android. Все четыре датчика окружающей среды являются аппаратными и доступны только в том случае, если производитель устройства встроил их в устройство. За исключением датчика освещенности, который большинство производителей устройств используют для управления яркостью экрана, датчики окружающей среды не всегда доступны на устройствах. По этой причине особенно важно во время выполнения проверять, существует ли датчик окружающей среды, прежде чем пытаться получить от него данные.

В отличие от большинства датчиков движения и датчиков положения, которые возвращают многомерный массив значений датчиков для каждого SensorEvent , датчики окружающей среды возвращают одно значение датчика для каждого события данных. Например, температура в °C или давление в гПа. Кроме того, в отличие от датчиков движения и датчиков положения, которые часто требуют фильтрации верхних или нижних частот, датчики окружающей среды обычно не требуют какой-либо фильтрации или обработки данных. В таблице 1 представлена ​​сводная информация о датчиках окружающей среды, которые поддерживаются платформой Android.

Таблица 1. Датчики окружающей среды, поддерживаемые платформой Android.

Датчик Данные о событиях датчика Единицы измерения Описание данных
TYPE_AMBIENT_TEMPERATURE event.values[0] °С Температура окружающего воздуха.
TYPE_LIGHT event.values[0] лк Освещенность.
TYPE_PRESSURE event.values[0] гПа или мбар Давление окружающего воздуха.
TYPE_RELATIVE_HUMIDITY event.values[0] % Относительная влажность окружающей среды.
TYPE_TEMPERATURE event.values[0] °С Температура устройства. 1

1 Реализация варьируется от устройства к устройству. Этот датчик устарел в Android 4.0 (уровень API 14).

Используйте датчики освещенности, давления и температуры.

Необработанные данные, которые вы получаете от датчиков освещенности, давления и температуры, обычно не требуют калибровки, фильтрации или модификации, что делает их одними из самых простых в использовании датчиков. Чтобы получить данные от этих датчиков, вы сначала создаете экземпляр класса SensorManager , который можно использовать для получения экземпляра физического датчика. Затем вы регистрируете прослушиватель датчика в методе onResume() и начинаете обрабатывать входящие данные датчика в методе обратного вызова onSensorChanged() . Следующий код показывает, как это сделать:

Котлин

class SensorActivity : Activity(), SensorEventListener {

    private lateinit var sensorManager: SensorManager
    private var pressure: Sensor? = null

    public override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main)

        // Get an instance of the sensor service, and use that to get an instance of
        // a particular sensor.
        sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
        pressure = sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE)
    }

    override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) {
        // Do something here if sensor accuracy changes.
    }

    override fun onSensorChanged(event: SensorEvent) {
        val millibarsOfPressure = event.values[0]
        // Do something with this sensor data.
    }

    override fun onResume() {
        // Register a listener for the sensor.
        super.onResume()
        sensorManager.registerListener(this, pressure, SensorManager.SENSOR_DELAY_NORMAL)
    }

    override fun onPause() {
        // Be sure to unregister the sensor when the activity pauses.
        super.onPause()
        sensorManager.unregisterListener(this)
    }
}

Ява

public class SensorActivity extends Activity implements SensorEventListener {
    private SensorManager sensorManager;
    private Sensor pressure;

    @Override
    public final void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

      // Get an instance of the sensor service, and use that to get an instance of
      // a particular sensor.
      sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
      pressure = sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE);
    }

    @Override
    public final void onAccuracyChanged(Sensor sensor, int accuracy) {
      // Do something here if sensor accuracy changes.
    }

    @Override
    public final void onSensorChanged(SensorEvent event) {
      float millibarsOfPressure = event.values[0];
      // Do something with this sensor data.
    }

    @Override
    protected void onResume() {
      // Register a listener for the sensor.
      super.onResume();
      sensorManager.registerListener(this, pressure, SensorManager.SENSOR_DELAY_NORMAL);
    }

    @Override
    protected void onPause() {
      // Be sure to unregister the sensor when the activity pauses.
      super.onPause();
      sensorManager.unregisterListener(this);
    }
}

Вы всегда должны включать реализации методов обратного вызова onAccuracyChanged() и onSensorChanged() . Кроме того, убедитесь, что вы всегда отменяете регистрацию датчика, когда действие приостанавливается. Это предотвращает постоянный сбор данных датчиком и разрядку аккумулятора.

Используйте датчик влажности

Вы можете получить необработанные данные относительной влажности, используя датчик влажности так же, как вы используете датчики освещенности, давления и температуры. Однако если устройство имеет и датчик влажности ( TYPE_RELATIVE_HUMIDITY ), и датчик температуры ( TYPE_AMBIENT_TEMPERATURE ), вы можете использовать эти два потока данных для расчета точки росы и абсолютной влажности.

Точка росы

Точка росы — это температура, при которой данный объем воздуха должен быть охлажден при постоянном барометрическом давлении, чтобы водяной пар конденсировался в воду. Следующее уравнение показывает, как можно рассчитать точку росы:

t_d(t,RH) = Tn · (ln(RH/100) + m·t/(T_n+t ))/(m - [ln(RH/100%) + m·t/(T_n+t)] )

Где,

  • t d = температура точки росы в градусах Цельсия
  • t = фактическая температура в градусах Цельсия
  • RH = фактическая относительная влажность в процентах (%)
  • м = 17,62
  • Т н = 243,12

Абсолютная влажность

Абсолютная влажность – это масса водяного пара в данном объеме сухого воздуха. Абсолютная влажность измеряется в граммах/метр 3 . Следующее уравнение показывает, как можно рассчитать абсолютную влажность:

d_v(t,RH) = (RH/100) · A · exp(m · t/(T_n+t)/(273,15 + t)

Где,

  • d v = абсолютная влажность в граммах/метр 3
  • t = фактическая температура в градусах Цельсия
  • RH = фактическая относительная влажность в процентах (%)
  • м = 17,62
  • Т н = 243,12 градуса С
  • А = 6,112 гПа

Вам также следует прочитать