Czujniki środowiskowe

Platforma Android jest wyposażona w 4 czujniki, które umożliwiają monitorowanie różnych właściwości środowiskowych. Możesz ich używać do monitorowania wilgotności otoczenia, oświetlenia, ciśnienia otoczenia i temperatury otoczenia w pobliżu urządzenia z Androidem. Wszystkie 4 czujniki środowiska są sprzętowe i są dostępne tylko wtedy, gdy producent urządzenia wbudowa je w urządzenie. Z wyjątkiem czujnika światła, którego większość producentów urządzeń używa do sterowania jasnością ekranu, czujniki otoczenia nie zawsze są dostępne na urządzeniach. Z tego względu przed próbą pobrania z niego danych należy sprawdzić w czasie działania, czy taki czujnik istnieje.

W odróżnieniu od większości czujników ruchu i czujników pozycji, które zwracają wielowymiarowy zestaw wartości z czujników dla każdego obiektu SensorEvent, czujniki środowiska zwracają jedną wartość z czujnika dla każdego zdarzenia związanego z danymi. Na przykład temperatura w °C lub ciśnienie w hPa. Poza tym, w przeciwieństwie do czujników ruchu i czujników pozycji, które często wymagają filtrowania wysokoprzepustowego lub dolnoprzepustowego, czujniki otoczenia zwykle nie wymagają filtrowania ani przetwarzania danych. Tabela 1 zawiera podsumowanie czujników środowiska obsługiwanych przez platformę Androida.

Tabela 1. Czujniki środowiska obsługiwane przez platformę Android.

Czujnik Dane zdarzeń z czujnika Jednostki miary Opis danych
TYPE_AMBIENT_TEMPERATURE event.values[0] °C Temperatura powietrza otoczenia.
TYPE_LIGHT event.values[0] lx Natężenie oświetlenia
TYPE_PRESSURE event.values[0] hPa lub mbar Ciśnienie otoczenia.
TYPE_RELATIVE_HUMIDITY event.values[0] % Wilgotność względna otoczenia.
TYPE_TEMPERATURE event.values[0] °C Temperatura urządzenia1.

1 Implementacje różnią się w zależności od urządzenia. Ten czujnik został wycofany w Androidzie 4.0 (poziom interfejsu API 14).

Używaj czujników światła, ciśnienia i temperatury

Nieprzetworzone dane z czujników światła, ciśnienia i temperatury zwykle nie wymagają kalibracji, filtrowania ani modyfikacji, co sprawia, że są to jedne z najłatwiejszych w użyciu czujników. Aby pobrać dane z tych czujników, musisz najpierw utworzyć instancję klasy SensorManager, której możesz użyć do pobrania wystąpienia czujnika fizycznego. Następnie rejestrujesz odbiornik czujnika w metodzie onResume() i rozpoczynasz obsługę przychodzących danych z czujnika w metodzie wywołania zwrotnego onSensorChanged(). Poniższy kod pokazuje, jak to zrobić:

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

Musisz zawsze uwzględniać implementacje wywołań zwrotnych onAccuracyChanged() i onSensorChanged(). Pamiętaj też, aby zawsze wyrejestrowywać czujnik, gdy aktywność jest wstrzymywana. Zapobiega to ciągłemu wykrywaniu danych przez czujnik i tym samym rozładowywaniu baterii.

Używanie czujnika wilgotności

Nieprzetworzone dane o wilgotności względnej możesz uzyskać za pomocą czujnika wilgotności w taki sam sposób jak czujniki światła, ciśnienia i temperatury. Jeśli jednak urządzenie ma zarówno czujnik wilgotności (TYPE_RELATIVE_HUMIDITY), jak i czujnik temperatury (TYPE_AMBIENT_TEMPERATURE), możesz używać tych 2 strumieni danych do obliczania punktu rosy i wilgotności bezwzględnej.

Punkt rosy

Temperatura rosy to temperatura, w której określona objętość powietrza musi zostać schłodzona pod stałym ciśnieniem barometrowym, aby para wodna skraplała się do wody. Punkt rosy można obliczyć za pomocą tego równania:

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

Gdzie,

  • td = temperatura punktu rosy w stopniach C
  • t = rzeczywista temperatura w stopniach C
  • RH = rzeczywista wilgotność względna w procentach (%)
  • M = 17,62
  • Tn = 243,12

Wilgotność bezwzględna

Wilgotność bezwzględna to masa pary wodnej w danej objętości suchego powietrza. Wilgotność bezwzględna jest mierzona w gramach na metr3. W tym równaniu można obliczyć wilgotność bezwzględną:

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

Gdzie,

  • dv = wilgotność bezwzględna w gramach/metr3
  • t = rzeczywista temperatura w stopniach C
  • RH = rzeczywista wilgotność względna w procentach (%)
  • M = 17,62
  • Tn = 243,12 stopnia C
  • A = 6,112 hPa

Przeczytaj też