Платформа Android предоставляет четыре датчика, которые позволяют отслеживать различные свойства окружающей среды. С помощью этих датчиков можно отслеживать относительную влажность, освещенность, давление и температуру окружающей среды рядом с устройством Android. Все четыре датчика окружающей среды являются аппаратными и доступны, только если производитель встроил их в устройство. За исключением датчика освещенности, который большинство производителей устройств используют для управления яркостью экрана, датчики окружающей среды не всегда доступны на устройствах. Поэтому особенно важно проверять наличие датчика окружающей среды во время выполнения, прежде чем пытаться получить от него данные.
В отличие от большинства датчиков движения и положения, которые возвращают многомерный массив значений для каждого объекта SensorEvent, датчики окружающей среды возвращают одно значение для каждого события данных. Например, это может быть температура в градусах Цельсия или давление в гектопаскалях.
Кроме того, в отличие от датчиков движения и положения, для которых часто требуется фильтрация верхних или нижних частот, датчики окружающей среды обычно не требуют фильтрации или обработки данных. В таблице 1 приведены датчики окружающей среды, поддерживаемые платформой Android.
Таблица 1. Датчики параметров окружающей среды, которые поддерживаются на платформе Android.
| Датчик | Данные о событиях датчиков | Единицы измерения | Описание данных |
|---|---|---|---|
TYPE_AMBIENT_TEMPERATURE |
event.values[0] |
°C | Температура окружающего воздуха. |
TYPE_LIGHT |
event.values[0] |
лк | Освещенность. |
TYPE_PRESSURE |
event.values[0] |
гПа или мбар | Атмосферное давление. |
TYPE_RELATIVE_HUMIDITY |
event.values[0] |
% | Относительная влажность воздуха. |
TYPE_TEMPERATURE |
event.values[0] |
°C | Температура устройства1. |
1 Реализация зависит от устройства. Этот датчик не поддерживается в Android 4.0 (уровень API 14).
Использовать датчики освещенности, давления и температуры
Первичные данные, полученные от датчиков освещенности, давления и температуры, обычно не требуют калибровки, фильтрации или модификации, что делает их одними из самых простых в использовании. Чтобы получить данные от этих датчиков, сначала создайте экземпляр класса SensorManager, который можно использовать для получения экземпляра физического датчика.
Затем вы регистрируете прослушиватель датчика в методе onResume() и начинаете обрабатывать входящие данные датчика в методе обратного вызова onSensorChanged(). Ниже показано, как это сделать.
Kotlin
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) } }
Java
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), вы можете использовать эти два потока данных для расчета точки росы и абсолютной влажности.
Точка росы
Точка росы – это температура, до которой должен охладиться воздух, чтобы содержащийся в нем пар достиг состояния насыщения и начал конденсироваться в росу. Точку росы можно рассчитать по следующей формуле:
где:
- td – температура точки росы в градусах Цельсия;
- t – фактическая температура в градусах Цельсия.
- ОВ – фактическая относительная влажность в процентах (%).
- m = 17,62
- Tn = 243,12
Абсолютная влажность
Абсолютная влажность – это масса водяного пара в определенном объеме сухого воздуха. Абсолютная влажность измеряется в граммах на кубический метр (г/м3). Абсолютная влажность рассчитывается по следующей формуле:
где:
- dv – абсолютная влажность в граммах на кубический метр3.
- t – фактическая температура в градусах Цельсия.
- ОВ – фактическая относительная влажность в процентах (%).
- m = 17,62
- Tn = 243,12 °C
- A = 6,112 гПа