Sensores de ambiente

A plataforma Android oferece quatro sensores que permitem monitorar várias propriedades ambientais. Você pode usar esses sensores para monitorar a umidade relativa, iluminação, pressão ambiente e temperatura ambiente perto de um dispositivo Android. Os quatro sensores de ambiente são baseados em hardware e estarão disponíveis apenas se o fabricante os tiver integrado a um dispositivo. Com exceção do sensor de luz, que a maioria dos fabricantes usa para controlar o brilho da tela, os sensores de ambiente nem sempre estão disponíveis nos dispositivos. Por isso, é particularmente importante verificar no momento da execução se um sensor de ambiente existe antes de tentar coletar dados dele.

Ao contrário da maioria dos sensores de movimento e de posição, que retornam uma matriz multidimensional de valores de sensor para cada SensorEvent, os sensores de ambiente retornam um único valor de sensor para cada evento de dados. Por exemplo, a temperatura em °C ou a pressão em hPa. Além disso, ao contrário dos sensores de movimento e de posição, que geralmente exigem filtragem de passagem alta ou baixa, os sensores de ambiente normalmente não exigem filtragem ou processamento de dados. A Tabela 1 mostra um resumo dos sensores de ambiente compatíveis com a plataforma Android.

Tabela 1. Sensores de ambiente compatíveis com a plataforma Android.

Sensor Dados de eventos do sensor Unidades de medida Descrição dos dados
TYPE_AMBIENT_TEMPERATURE event.values[0] °C Temperatura do ar ambiente.
TYPE_LIGHT event.values[0] lx Iluminamento.
TYPE_PRESSURE event.values[0] hPa ou mbar Pressão do ar ambiente.
TYPE_RELATIVE_HUMIDITY event.values[0] % Umidade relativa ambiente.
TYPE_TEMPERATURE event.values[0] °C Temperatura do dispositivo.1

1 As implementações variam de acordo com o dispositivo. Esse sensor teve o uso suspenso no Android 4.0 (API nível 14).

Usar os sensores de luz, pressão e temperatura

Os dados brutos coletados dos sensores de luz, pressão e temperatura geralmente não exigem calibração, filtragem ou modificação, o que os torna alguns dos sensores mais fáceis de usar. Para coletar dados desses sensores, primeiro crie uma instância da classe SensorManager, que pode ser usada para receber uma instância de um sensor físico. Em seguida, registre um listener de sensor no método onResume() e comece a processar os dados recebidos no método de callback onSensorChanged(). O código a seguir mostra como fazer isso:

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

É preciso sempre incluir implementações dos métodos de callback onAccuracyChanged() e onSensorChanged(). Além disso, não se esqueça de sempre cancelar o registro de um sensor quando uma atividade for pausada. Isso impede que um sensor detecte dados continuamente e descarregue a bateria.

Usar o sensor de umidade

É possível coletar dados brutos de umidade relativa usando o sensor de umidade da mesma forma que você usa os sensores de luz, pressão e temperatura. No entanto, se um dispositivo tiver um sensor de umidade (TYPE_RELATIVE_HUMIDITY) e um de temperatura (TYPE_AMBIENT_TEMPERATURE), você poderá usar esses dois fluxos de dados para calcular o ponto de orvalho e a umidade absoluta.

Ponto de condensação

O ponto de condensação é a temperatura em que um determinado volume de ar precisa ser resfriado, sob pressão barométrica constante, para que o vapor de água se condense. A equação abaixo mostra como calcular o ponto de orvalho:

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

Em que:

  • td = temperatura do ponto de condensação em graus C
  • t = temperatura real em graus C
  • UR = umidade relativa real em porcentagem (%)
  • m = 17,62
  • Tn = 243,12

Umidade absoluta

A umidade absoluta é a massa de vapor de água em um determinado volume de ar seco. A umidade absoluta é medida em gramas/metro3. A equação a seguir mostra como calcular a umidade absoluta:

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

Em que:

  • dv = umidade absoluta em gramas/metro3
  • t = temperatura real em graus C
  • UR = umidade relativa real em porcentagem (%)
  • m = 17,62
  • Tn = 243,12 graus C
  • A = 6,112 hPa

Leia também