Únete a ⁠ #Android11: The Beta Launch Show el 3 de junio.

Sensores de entorno

La plataforma de Android proporciona cuatro sensores que permiten supervisar varias propiedades del entorno. Puedes usar estos sensores para supervisar la humedad ambiental relativa, la iluminación, la presión ambiental y la temperatura ambiente cerca de un dispositivo con Android. Los cuatro sensores de entorno están basados en hardware y están disponibles solo si un fabricante de dispositivos los incorporó en el dispositivo. A excepción del sensor de luz, que la mayoría de los fabricantes de dispositivos utilizan para controlar el brillo de la pantalla, los sensores de entorno no siempre están disponibles en los dispositivos. Debido a esto, es particularmente importante que verifiques en el tiempo de ejecución si existe un sensor de entorno antes de intentar adquirir datos de él.

A diferencia de la mayoría de los sensores de movimiento y de posición, que muestran un arreglo multidimensional de valores de sensor para cada SensorEvent, los sensores de entorno devuelven un único valor de sensor para cada evento de datos. Por ejemplo, la temperatura en °C o la presión en hPa. Además, a diferencia de los sensores de movimiento y de posición, que suelen requerir filtrado alto o bajo, los sensores de entorno no suelen requerir ningún tipo de filtrado o procesamiento de datos. En la tabla 1, se proporciona un resumen de los sensores de entorno compatibles con la plataforma de Android.

Tabla 1: Sensores de entorno compatibles con la plataforma de Android.

Sensor Datos del evento del sensor Unidades de medición Descripción de los datos
TYPE_AMBIENT_TEMPERATURE event.values[0] °C Temperatura ambiente
TYPE_LIGHT event.values[0] lx Iluminación
TYPE_PRESSURE event.values[0] hPa o mbar Presión de aire ambiental
TYPE_RELATIVE_HUMIDITY event.values[0] % Humedad relativa ambiental
TYPE_TEMPERATURE event.values[0] °C Temperatura del dispositivo1

1 Las implementaciones varían de un dispositivo a otro. Este sensor quedó en desuso en Android 4.0 (API nivel 14).

Cómo usar los sensores de luz, presión y temperatura

Los datos sin procesar que obtienes de los sensores de luz, presión y temperatura en general no requieren calibración, filtrado ni modificación, lo que los convierte en algunos de los sensores más fáciles de usar. Para adquirir datos de estos sensores, primero debes crear una instancia de la clase SensorManager, que puedes usar para obtener una instancia de un sensor físico. Luego, registra un objeto de escucha de un sensor en el método onResume() y comienza a controlar los datos entrantes del sensor en el método de devolución de llamadas onSensorChanged(). En el siguiente código, se muestra cómo hacerlo:

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

Siempre debes incluir implementaciones de los métodos de devolución de llamadas onAccuracyChanged() y onSensorChanged(). Además, asegúrate de cancelar siempre el registro de un sensor cuando una actividad se detenga. Esto evita que un sensor envíe continuamente datos y agote la batería.

Cómo usar el sensor de humedad

Puedes adquirir datos de humedad relativa sin procesar con el sensor de humedad de la misma manera que usas los sensores de luz, presión y temperatura. Sin embargo, si un dispositivo tiene un sensor de humedad (TYPE_RELATIVE_HUMIDITY) y un sensor de temperatura (TYPE_AMBIENT_TEMPERATURE), puedes usar estos dos flujos de datos para calcular el punto de condensación y la humedad absoluta.

Punto de condensación

El punto de condensación es la temperatura a la cual se debe enfriar un volumen dado de aire a presión barométrica constante para que el vapor del agua se condense en agua. En la siguiente ecuación, se muestra cómo calcular el punto de condensación:

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

Donde:

  • td = temperatura del punto de condensación en °C
  • t = temperatura real en °C
  • RH = humedad relativa real en porcentaje (%)
  • m = 17.62
  • Tn = 243.12

Humedad absoluta

La humedad absoluta es la masa de vapor de agua en un volumen determinado de aire seco. La humedad absoluta se mide en gramos/metro3. En la siguiente ecuación, se muestra cómo calcular la humedad absoluta:

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

Donde:

  • dv = humedad absoluta en gramos/metro3
  • t = temperatura real en °C
  • RH = humedad relativa real en porcentaje (%)
  • m = 17.62
  • Tn = 243.12 °C
  • A = 6.112 hPa

Consulta también: