Capteurs environnementaux

La plate-forme Android fournit quatre capteurs qui vous permettent de surveiller diverses propriétés environnementales. Vous pouvez utiliser ces capteurs pour surveiller l'humidité ambiante relative, l'éclairage, la pression ambiante et la température ambiante à proximité d'un appareil Android. Ces quatre capteurs d'environnement sont basés sur le matériel et ne sont disponibles que si le fabricant de l'appareil les a intégrés à l'appareil. À l'exception du capteur de lumière, que la plupart des fabricants d'appareils utilisent pour contrôler la luminosité de l'écran, les capteurs d'environnement ne sont pas toujours disponibles sur les appareils. Pour cette raison, il est particulièrement important de vérifier au moment de l'exécution si un capteur d'environnement existe avant d'essayer d'en récupérer des données.

Contrairement à la plupart des capteurs de mouvement et de position, qui renvoient un tableau multidimensionnel de valeurs de capteurs pour chaque SensorEvent, les capteurs d'environnement renvoient une seule valeur de capteur pour chaque événement de données. Par exemple, la température en °C ou la pression en hPa. De plus, contrairement aux capteurs de mouvement et de position, qui nécessitent souvent un filtrage en passage haut ou bas, les capteurs d'environnement ne nécessitent généralement aucun filtrage des données ni aucun traitement de données. Le tableau 1 récapitule les capteurs d'environnement compatibles avec la plate-forme Android.

Tableau 1. Capteurs d'environnement compatibles avec la plate-forme Android

Capteur Données d'événement des capteurs Unités de mesure Description des données
TYPE_AMBIENT_TEMPERATURE event.values[0] °C Température de l'air ambiant.
TYPE_LIGHT event.values[0] lx Éclairement.
TYPE_PRESSURE event.values[0] hPa ou mbar Pression de l'air ambiant.
TYPE_RELATIVE_HUMIDITY event.values[0] % Humidité relative ambiante.
TYPE_TEMPERATURE event.values[0] °C Température de l'appareil1.

1 Les implémentations varient d'un appareil à l'autre. Ce capteur a été abandonné dans Android 4.0 (niveau d'API 14).

Utiliser les capteurs de lumière, de pression et de température

Les données brutes que vous collectez à partir des capteurs de lumière, de pression et de température ne nécessitent généralement aucun étalonnage, aucun filtrage ni modification, ce qui en fait certains des capteurs les plus faciles à utiliser. Pour acquérir des données de ces capteurs, vous devez d'abord créer une instance de la classe SensorManager, que vous pouvez utiliser pour obtenir une instance de capteur physique. Vous enregistrez ensuite un écouteur de capteur dans la méthode onResume() et commencez à traiter les données entrantes des capteurs dans la méthode de rappel onSensorChanged(). Le code suivant vous montre comment procéder:

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

Vous devez toujours inclure les implémentations des méthodes de rappel onAccuracyChanged() et onSensorChanged(). Veillez également à toujours annuler l'enregistrement d'un capteur lorsqu'une activité est interrompue. Cela empêche un capteur de détecter en continu les données et de vider la batterie.

Utiliser le capteur d'humidité

Vous pouvez obtenir des données brutes d'humidité relative en utilisant le capteur d'humidité de la même manière que les capteurs de lumière, de pression et de température. Toutefois, si un appareil dispose à la fois d'un capteur d'humidité (TYPE_RELATIVE_HUMIDITY) et d'un capteur de température (TYPE_AMBIENT_TEMPERATURE), vous pouvez utiliser ces deux flux de données pour calculer le point de rosée et l'humidité absolue.

Point de rosée

Le point de rosée est la température à laquelle un volume d'air donné doit être refroidi, à une pression barométrique constante, pour que la vapeur d'eau se condense dans l'eau. L'équation suivante montre comment calculer le point de rosée:

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

Où ?

  • td = température du point de rosée en degrés C
  • t = température réelle en degrés C
  • RH = humidité relative réelle en pourcentage (%)
  • m = 17,62
  • Tn = 243,12

Humidité absolue

L'humidité absolue est la masse de vapeur d'eau dans un volume donné d'air sec. L'humidité absolue est mesurée en grammes/mètre3. L'équation suivante montre comment calculer l'humidité absolue:

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

Où ?

  • dv = humidité absolue en grammes/mètre3
  • t = température réelle en degrés C
  • RH = humidité relative réelle en pourcentage (%)
  • m = 17,62
  • Tn = 243,12 degrés C
  • A = 6,112 hPa

Vous devriez également lire