Sensori ambientali

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

A differenza della maggior parte dei sensori di movimento e di posizione, che restituiscono un array multidimensionale di sensori valori per ogni SensorEvent, i sensori ambientali restituiscono un singolo 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 un passaggio alto o basso di filtro, i sensori ambientali in genere non richiedono filtri o elaborazione dei dati. Tavolo 1 fornisce un riepilogo dei sensori ambientali supportati sulla piattaforma Android.

Tabella 1. Sensori dell'ambiente supportati sulla piattaforma Android.

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

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

Utilizza i sensori di luce, pressione e temperatura

I dati non elaborati acquisiti dai sensori di luce, pressione e temperatura di solito non richiedono calibrazione, filtraggio o modifica, per cui sono tra i sensori più facili da usare. A acquisirai dati da questi sensori. Per prima cosa crei un'istanza della classe SensorManager, che puoi utilizzare per ottenere un'istanza di un sensore fisico. Quindi, registra un listener del sensore nel metodo onResume() e inizi a gestire i dati dei sensori in arrivo nel metodo di callback onSensorChanged(). La il seguente codice ti 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 dei metodi di callback onAccuracyChanged() e onSensorChanged(). Inoltre, ricorda di assicurati di annullare sempre la registrazione di un sensore quando un'attività si interrompe. In questo modo, un sensore rilevare continuamente i dati e scaricare 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 utilizzi i sensori di luce, pressione e temperatura. Tuttavia, se un dispositivo è dotato di entrambi i sensori di umidità (TYPE_RELATIVE_HUMIDITY) e un sensore di temperatura (TYPE_AMBIENT_TEMPERATURE) puoi usare questi due stream di dati per calcolare il punto di rugiada e l'umidità assoluta.

Punto di rugiada

Il punto di rugiada è la temperatura a cui deve essere raffreddato un determinato volume di aria, pressione barometrica, affinché il vapore acqueo si condensa in acqua. La seguente equazione mostra come può 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
  • RH = umidità relativa effettiva in percentuale (%)
  • m = 17,62
  • Tn = 243,12

Umidità assoluta

L'umidità assoluta è la massa del vapore acqueo in un determinato volume di aria secca. Assoluto l'umidità viene misurata in grammi/metro3. La seguente equazione mostra come può 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
  • RH = umidità relativa effettiva in percentuale (%)
  • m = 17,62
  • Tn = 243,12 gradi C
  • A = 6,112 hPa

Dovresti leggere inoltre