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 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. Por lo tanto, es muy importante que verifiques durante 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 array multidimensional de valores de sensor para cada SensorEvent, los sensores de entorno muestran un solo 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 a menudo requieren filtrado de paso alto o bajo, los sensores de entorno no suelen requerir ningún tipo de filtrado ni 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 según el dispositivo. 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 no suelen requerir 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 se detenga una actividad. Esto evita que un sensor detecte 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 rocío y la humedad absoluta.

Punto de condensación

El punto de condensación es la temperatura a la que se debe enfriar un volumen determinado 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 por 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

También puedes leer: