Sensores de ambiente

A plataforma Android oferece quatro sensores que permitem monitorar várias propriedades ambientais. Use esses sensores para monitorar a umidade relativa, iluminamento, pressão e temperatura do ambiente perto de um dispositivo com tecnologia Android. Os quatro sensores de ambiente são baseados em hardware e estarão disponíveis apenas se o fabricante os tiver incorporado em 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 durante a execução se um sensor de ambiente existe antes de tentar acessar os dados dele.

Ao contrário da maioria dos sensores de movimento e de posição, que retorna uma matriz multidimensional de valores de sensor para cada SensorEvent, os sensores de ambiente retornam um único valor 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 precisam de filtragem passa-alta ou passa-baixa, os sensores de ambiente normalmente não precisam de 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 requerem calibração, filtragem ou modificação. Por isso, esses sensores estão entre os mais fáceis de usar. Para coletar esses dados, crie primeiro uma instância da classe SensorManager, que pode ser usada para conseguir 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(). Este código 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, sempre cancele o registro de um sensor quando uma atividade for pausada. Isso evite que o sensor detecte dados continuamente e esgote a bateria.

Usar o sensor de umidade

Colete dados brutos de umidade relativa com 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 sensor de temperatura (TYPE_AMBIENT_TEMPERATURE), você poderá usar esses dois fluxos de dados para calcular o ponto de condensação e a umidade absoluta.

Ponto de condensação

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

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