Sensori ambientali

La piattaforma Android fornisce quattro sensori che ti consentono di monitorare varie proprietà ambientali. Puoi utilizzare questi sensori per monitorare l'umidità relativa, l'illuminamento, la pressione ambientale e la temperatura ambiente nelle vicinanze di un dispositivo Android. Tutti e quattro i sensori ambientali sono basati su hardware e sono disponibili solo se il produttore del dispositivo li ha integrati in un dispositivo. Ad eccezione del sensore di luce, utilizzato dalla maggior parte dei produttori di dispositivi per controllare la luminosità dello schermo, i sensori ambientali non sono sempre disponibili sui dispositivi. Per questo motivo, è particolarmente importante verificare in fase di runtime l'esistenza di un sensore di ambiente prima di tentare di acquisire dati da quel sensore.

A differenza della maggior parte dei sensori di movimento e di posizione, che restituiscono un array multidimensionale di valori dei sensori per ogni SensorEvent, i sensori ambientali restituiscono un singolo valore del sensore per ogni evento di dati. Ad esempio, la temperatura in °C o la pressione in hPa. Inoltre, a differenza dei sensori di movimento e di posizione, che spesso richiedono filtri passa-alto o passa basso, i sensori ambientali in genere non richiedono alcun filtro o elaborazione dei dati. La tabella 1 fornisce un riepilogo dei sensori ambientali supportati sulla piattaforma Android.

Tabella 1. Sensori ambientali supportati sulla piattaforma Android.

Sensore Dati sugli eventi dei sensori Unità di misura Descrizione dati
TYPE_AMBIENT_TEMPERATURE event.values[0] °C Temperatura ambiente dell'aria.
TYPE_LIGHT event.values[0] lx Illuminamento.
TYPE_PRESSURE event.values[0] hPa o mbar Pressione dell'aria ambientale.
TYPE_RELATIVE_HUMIDITY event.values[0] % Umidità relativa nell'ambiente.
TYPE_TEMPERATURE event.values[0] °C Temperatura del dispositivo.1

1 Le implementazioni variano in base al dispositivo. Questo sensore è stato ritirato in Android 4.0 (livello API 14).

Utilizzare i sensori di luce, pressione e temperatura

I dati non elaborati che acquisisci dai sensori di luce, pressione e temperatura di solito non richiedono calibrazioni, filtri o modifiche, il che li rende alcuni dei sensori più semplici da utilizzare. Per acquisire dati da questi sensori, devi prima creare un'istanza della classe SensorManager, che puoi utilizzare per ottenere un'istanza di un sensore fisico. Quindi registri un listener del sensore nel metodo onResume() e inizi a gestire i dati dei sensori in entrata nel metodo di callback onSensorChanged(). Il seguente codice mostra come fare:

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

Devi sempre includere le implementazioni di entrambi i metodi di callback onAccuracyChanged() e onSensorChanged(). Inoltre, assicurati di annullare sempre la registrazione di un sensore quando un'attività viene sospesa. In questo modo, il sensore non rileva continuamente i dati e consuma la batteria.

Utilizzare il sensore di umidità

Puoi acquisire dati non elaborati sull'umidità relativa utilizzando il sensore di umidità nello stesso modo in cui usi i sensori di luce, pressione e temperatura. Tuttavia, se un dispositivo dispone sia di un sensore di umidità (TYPE_RELATIVE_HUMIDITY) sia di un sensore di temperatura (TYPE_AMBIENT_TEMPERATURE), puoi utilizzare questi due stream di dati per calcolare il punto di rugiada e l'umidità assoluta.

Punto di rugiada

Il punto di rugiada è la temperatura alla quale un dato volume di aria deve essere raffreddato, a pressione barometrica costante, affinché il vapore acqueo condensa in acqua. La seguente equazione mostra come calcolare il punto di rugiada:

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

Dove,

  • td = temperatura del punto di rugiada in gradi C
  • t = temperatura effettiva in gradi C
  • UR = umidità relativa effettiva in percentuale (%)
  • m = 17,62
  • Tn = 243,12

Umidità assoluta

L'umidità assoluta è la massa di vapore acqueo in un dato volume di aria secca. L'umidità assoluta è misurata in grammi/metro3. La seguente equazione mostra come calcolare l'umidità assoluta:

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

Dove,

  • dv = umidità assoluta in grammi/metro3
  • t = temperatura effettiva in gradi C
  • UR = umidità relativa effettiva in percentuale (%)
  • m = 17,62
  • Tn = 243,12 gradi C
  • A = 6,112 hPa

Dovresti leggere anche