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, a iluminação e a pressão ambiente temperatura ambiente perto de um dispositivo Android. Todos os quatro sensores de ambiente são baseados em hardware e só estão disponíveis se o fabricante os tiver integrado ao dispositivo. Com a exceção de o sensor de luz, que a maioria dos fabricantes de dispositivos usa para controlar o brilho da tela, o ambiente nem sempre estão disponíveis nos dispositivos. Por isso, é particularmente importante que você verificar no tempo de execução se existe um sensor de ambiente antes de tentar coletar dados reimplantá-lo.

Diferente da maioria dos sensores de movimento e de posição, que retornam uma matriz multidimensional de sensores valores para cada SensorEvent, os sensores de ambiente vão retornar um único 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 precisam de valores passa-altos ou passa-baixos os sensores de ambiente normalmente não exigem filtragem ou processamento de dados. Tabela 1 fornece um resumo dos sensores de ambiente com suporte na 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 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 que você adquire 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 Para coletar dados desses sensores, primeiro crie uma instância da classe SensorManager, que pode ser usada para acessar 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(). A 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, tenha cancele o registro de um sensor quando uma atividade for pausada. Isso evita que um sensor detectar dados continuamente e descarregar a bateria.

Usar o sensor de umidade

É possível coletar 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 o dispositivo tiver um sensor de umidade (TYPE_RELATIVE_HUMIDITY) e um sensor de temperatura (TYPE_AMBIENT_TEMPERATURE), você pode 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 precisa ser resfriado, a constante pressão barométrica, para que o vapor de água se condense na água. A equação a seguir mostra como você para 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. Absoluta a umidade é medida em gramas/metro3. A equação a seguir mostra como você pode 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